kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Pulumi Deployments: Pulumi Cloud から AWS アカウントに自動デプロイ

Pulumi Cloud の Pulumi Deployments を使うとマネージド CI/CD 環境として自動的に pulumi previewpulumi up を実行できる.今回は Pulumi Deployments で AWS にデプロイする仕組みを構築してみた❗️

www.pulumi.com

セットアップ

Pulumi Cloud から AWS アカウントを操作できるようにするために ID プロバイダーと IAM Role をセットアップする.ドキュメントにはマネジメントコンソールでセットアップする流れが載っている.

www.pulumi.com

今回は pulumi new aws-typescript コマンドで初期化した Pulumi プロジェクトで ID プロバイダーと IAM Role を実装して,ローカル環境から pulumi up コマンドでデプロイしておくことにした.

ID プロバイダーの URL は https://api.pulumi.com/oidc・対象者 (Audience) には Pulumi 組織名を設定する.サムプリントは AWS 側で解決してくれるため適当な値で OK👌あと IAM Role には Amazon ECR のフルアクセス権限を付けておく.最小権限の原則を意識しつつも CI/CD 環境はどうしても権限が強くなってしまうと思う.

import * as aws from "@pulumi/aws";

const oidcProvider = new aws.iam.OpenIdConnectProvider("pulumi-deployments-oidc", {
    url: "https://api.pulumi.com/oidc",
    clientIdLists: ["kakakakakku"],
    thumbprintLists: ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],
});

const pulumiDeploymentsRole = new aws.iam.Role("pulumi-deployments-role", {
    name: "pulumi-deployments-role",
    assumeRolePolicy: {
        Version: "2012-10-17",
        Statement: [
            {
                Effect: "Allow",
                Principal: {
                    Federated: oidcProvider.arn,
                },
                Action: "sts:AssumeRoleWithWebIdentity",
                Condition: {
                    StringEquals: {
                        "api.pulumi.com/oidc:aud": "kakakakakku",
                    },
                    StringLike: {
                        "api.pulumi.com/oidc:sub": "pulumi:deploy:org:kakakakakku:project:sandbox-pulumi-aws-deployments:*"
                    }
                },
            },
        ],
    }
});

new aws.iam.RolePolicyAttachment("pulumi-deployments-role-ecr", {
    role: pulumiDeploymentsRole.name,
    policyArn: "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess",
});

スタック設定

次に Pulumi Cloud のスタックで Pulumi Deployments の設定をする.大きく以下の2種類を設定しておけば OK👌

  • Source settings(GitHub リポジトリとブランチ)
  • OpenID Connect(ID プロバイダーと IAM Role)

Pulumi Deployments で preview

今回は Amazon ECR リポジトリを1つ追加して,GitHub リポジトリにプルリクエストを作る.

new aws.ecr.Repository("sandbox-pulumi-aws-deployments", {
    name: "sandbox-pulumi-aws-deployments",
});

すると Pulumi Cloud で自動的にデプロイ(現時点では preview)が実行された👌右側に Preview succeeded と表示されている.

Pulumi Cloud で preview 結果も確認できた.

また GitHub リポジトリのプルリクエストにも自動的にコメントが投稿されていた.

Pulumi Deployments で up

preview 結果を確認して,プルリクエストをマージすると自動的にデプロイ(今度は up)が実行された👌右側に Update succeeded と表示されている.

Amazon ECR を確認すると期待通りに sandbox-pulumi-aws-deployments リポジトリが追加されていた❗️

関連記事

他にもプルリクエストを作ったら自動的に専用の環境が構築される「Review stacks」や TTL を設定して自動的に削除される「Time-to-live (TTL) スタック」など気になる機能があるので試してみよう👀

www.pulumi.com

www.pulumi.com