Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう

2023年9月13日(水)
大関 研丞 (Kenneth Ozeki)
第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が作成される想定です。

  1. 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に書き換える
  2. ファイルの編集を終えたら、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
  3. 次に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>"
  4. ファイルの編集を終えたら、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
  5. 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
  6. ファイルの編集を終えたら、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
    ~~~
  7. しばらく経つと、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
    ~~~
著者
大関 研丞 (Kenneth Ozeki)
クリエーションライン株式会社 Data Platform Team
前職では保険や金融エンタープライズのミッションクリティカルシステム(オンプレミス、仮想サーバー、CDN等のインフラ系業務)の設計/構築を経験。クリエーションラインに転職後はクラウドエンジニアとしてGCP関連の案件でインフラの設計/構築、IaCやCI/CDを用いたDevOpsの導入、コンテナ(Kubernetes)基盤の構築、運用自動化ツールの作成などを担当。
クリエーションラインの技術ブログをチェック

連載バックナンバー

システム運用技術解説
第10回

Pulumiの最新機能「Pulumi ESC」を使ってみよう

2023/12/26
最終回となる今回は、2023年12月時点でリリースされている新機能の紹介と、その新機能の中から「Pulumi ESC」を用いたハンズオンを実践していきます。
システム運用技術解説
第9回

TerraformからPulumiへの移行

2023/11/28
第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
システム運用技術解説
第8回

既に存在するリソースをPulumiで管理してみよう

2023/10/19
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています