連載 [第7回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
2023年9月13日(水)
第7回となる今回は、PulumiにおけるCI/CDの概要を解説し、Pulumi Kubernetes Operatorを利用してPulumi Programを自動デプロイするハンズオンを実践していきます。
・Pulumi Stack CustomResourceデプロイ
公式が用意するmanifestから適宜値を差し替えて、AWS認証用のsecretとStackを作成していきます。Stack作成前はAWS S3 Bucket(GitHubにpushした「my-bucket」)は作成されていませんが、Stackが作成されるとreconciliation-loopが実行され、自動的にBucketが作成される想定です。
- OperatorがPulumi Cloudにアクセスするためのcredential secretを作成します。「pulumi-secret.yaml」ファイルを作成して、以下のyamlを記載します。「<REDACTED: PULUMI_ACCESS_TOKEN>」の部分は、事前準備の手順「Pulumi Service Backend Access Token生成」で取得したTokenの値を入力します。
[cloudshell-user@ip-10-6-35-57 yaml]$ cd ~ [cloudshell-user@ip-10-6-35-57 ~]$ vi pulumi-secret.yaml ~~~ apiVersion: v1 kind: Secret metadata: name: pulumi-api-secret type: Opaque stringData: accessToken: "<REDACTED: PULUMI_ACCESS_TOKEN>" ← 取得したPulumi AccessTokenに書き換える
- ファイルの編集を終えたら、kubectlでsecretをapplyします。
[cloudshell-user@ip-10-6-35-57 ~]$ kubectl apply -f pulumi-secret.yaml secret/pulumi-api-secret created [cloudshell-user@ip-10-6-35-57 ~]$ kubectl describe secret pulumi-api-secret Name: pulumi-api-secret Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== accessToken: 44 bytes
- 次にOperatorがAWSリソースへアクセスするためのcredential secretを作成します。「aws-secret.yaml」ファイルを作成して、以下のyamlを記載します。それぞれの「<REDACTED>」の部分は、事前準備の手順「AWS Access用 credential生成」で取得したTokenの値をそれぞれ入力します。
[cloudshell-user@ip-10-6-35-57 ~]$ vi aws-secret.yaml ~~~ apiVersion: v1 kind: Secret metadata: name: pulumi-aws-secrets type: Opaque stringData: AWS_ACCESS_KEY_ID: "<REDACTED: AWS_ACCESS_KEY_ID>" AWS_SECRET_ACCESS_KEY: "<REDACTED: AWS_SECRET_ACCESS_KEY>" AWS_SESSION_TOKEN: "<REDACTED: AWS_SESSION_TOKEN>"
- ファイルの編集を終えたら、kubectlでsecretをapplyします。
[cloudshell-user@ip-10-6-35-57 ~]$ kubectl apply -f aws-secret.yaml secret/pulumi-aws-secrets created [cloudshell-user@ip-10-6-35-57 ~]$ kubectl describe secret pulumi-aws-secret — Name: pulumi-aws-secrets Namespace: default Labels: <none> Annotations: <none> Type: Opaque Data ==== AWS_ACCESS_KEY_ID: 20 bytes AWS_SECRET_ACCESS_KEY: 40 bytes AWS_SESSION_TOKEN: 488 bytes
- Pulumi CloudおよびAWSリソース作成のcredential secretが作成できたので、いよいよStackを作成していきます。「pulumi-stack.yaml」ファイルを作成して、以下のyamlを記載します。それぞれの「<ACCOUNT_NAME>」の部分はPulumi Cloudのアカウント名を入力します。「projectRepo:」には自身で用意したGitHubレポジトリ「operator-test」のURLを記載します。reconciliation-loopの対象は「mainブランチ」を指定したブランチの同期を設定します。
[cloudshell-user@ip-10-6-35-57 ~]$ vi pulumi-stack.yaml ~~~ apiVersion: pulumi.com/v1 kind: Stack metadata: name: s3-bucket-stack spec: envRefs: PULUMI_ACCESS_TOKEN: type: Secret secret: name: pulumi-api-secret key: accessToken AWS_ACCESS_KEY_ID: type: Secret secret: name: pulumi-aws-secrets key: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY: type: Secret secret: name: pulumi-aws-secrets key: AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN: type: Secret secret: name: pulumi-aws-secrets key: AWS_SESSION_TOKEN stack: <ACCOUNT_NAME>/operator-test/dev projectRepo: https://github.com/<GitHub_Account_name>/operator-test branch: main config: aws:region: ap-northeast-1
- ファイルの編集を終えたら、kubectlでsecretをapplyします。
[cloudshell-user@ip-10-6-35-57 ~]$ kubectl apply -f pulumi-stack.yaml stack.pulumi.com/s3-bucket-stack created [cloudshell-user@ip-10-6-35-57 ~]$ kubectl describe Stack s3-bucket-stack — Name: s3-bucket-stack Namespace: default Labels: <none> Annotations: <none> API Version: pulumi.com/v1 Kind: Stack Metadata: Creation Timestamp: 2023-09-01T08:57:07Z Generation: 1 Resource Version: 14456 UID: 29a5b0f8-1701-4d82-8238-e904c9c4304b ~~~
しばらく経つと、GitHubレポジトリにpushしたProgramのリソース(S3 Bucket「my-bucket」)が自動的に作成されているのが確認できます。StackControllerが自動的にGitHubのProgramを読み込み、Kubernetes内部でStackリソース(Stack CustomResource)が作成され、それに基づいて実体のリソース(S3 Bucket「my-bucket」)も作成される流れとなります。
この時点でStack CustomResourceをdescribeすると、同期したGitHubレポジトリのcommitと、その同期ステータス(succeed)を確認できます。同期でエラーなどが発生した際は、このdescribeの出力でエラーメッセージを確認できます。
[cloudshell-user@ip-10-6-43-90 ~]$ kubectl describe Stack Name: s3-bucket-stack ~~~ Status: Conditions: Last Transition Time: 2023-09-01T16:04:22Z Message: the stack has been processed and is up to date Reason: ProcessingCompleted Status: True Type: Ready Last Update: Last Attempted Commit: cedd9734b15c22b9314cca9c9b114d26575d51a4 Last Resync Time: 2023-09-01T16:02:48Z Last Successful Commit: cedd9734b15c22b9314cca9c9b114d26575d51a4 Permalink: https://app.pulumi.com/***/operator-test/dev/updates/1 State: succeeded ~~~
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- PulumiでAWSリソースをデプロイしよう
- Kubeflowを構築する
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- Pulumiの最新機能「Pulumi ESC」を使ってみよう
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- コンテナ上のマイクロサービスの認証強化 ~StrimziとKeycloak~
- 既に存在するリソースをPulumiで管理してみよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- NGINX Ingress Controllerの柔軟なアプリケーション制御、具体的なユースケースと設定方法を理解する
- TerraformからPulumiへの移行