Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
はじめに
前回は、Pulumi Automation APIを利用してPulumi CLIコマンドのコード化について解説しました。今回は、Pulumiにおける継続的インティグレーション/継続的デリバリー(Continuous Integration/Continuous Delivery)の概要とサポートされるツール、またPulumiが独自に提供するツール「Pulumi Kubernetes Operator」について解説します。後半のハンズオンでは、実際に「Pulumi Kubernetes Operator」を利用して、Pulumi Programが継続デリバリーされる様子を確認していきます。
PulumiとCI/CD
各CI/CDシステムのPulumi利用方法
Pulumi Programはインフラストラクチャをコードとして管理するため、CI/CDシステムを活用してPull Requestsを起点としたvalidationやlinter、テストの実行なども容易となります。現在(2023/8/30時点)では、以下の様々なCI/CDシステムにおけるPulumiの利用方法が紹介されています。
- AWS Code Service
- Azure DevOps
- CircleCI
- Codefresh
- GitHub Actions
- GitLab CI
- Google Cloud Build
- Jenkins
- Octopus Deploy
- JetBrains TeamCity
- Spinnaker
- TravisCI
- Pulumi Kubernetes Operator
- Pulumi Deployments
各CI/CDシステムにおけるPulumi利用方法については、Pulumi公式リファレンスを直接参照するか、Pulumi Cloudの [Settings] > [Integrations] からも確認できます。
例えばGitlab CIの場合、リファレンスの中でCI/CDの設定ファイル「.gitlab-ci.yml」のサンプルコードや、CI/CDの設定ファイルで読み込まれるPulumi CLIのセットアップスクリプト、Pulumi CLIの実行スクリプトなどのサンプルコードも用意されているので、リファレンスにしたがって簡単にCI/CDシステムでPulumiの実行フローを組み込むことができます。
Pulumiが独自で提供するCI/CDシステム
前述したCI/CDシステムの中で、Pulumiが独自に提供するCI/CDシステム「Pulumi Kubernetes Operator」と「Pulumi Deployments」について紹介します。
・Pulumi Kubernetes Operator
Pulumi Kubernetes Operatorは、Kubernetesの拡張機能を利用してGitHub repositoryなどのsource code repositoryに格納されたProgramの内容に基づき、自動的にStackの継続更新(クラウドインフラリソースの作成/更新/削除)を実行するCI/CDシステムです。KubernetesのAPIリソースとしてStack用のCustomResourceが利用されます。Stackの継続更新は同じくKubernetesのリソース「StackController」が利用されます。2021年10月13日に一般提供(GA)となり、現在(2023年月30日時点)では version 1.13.0 が提供されています。
最初にOperatorがKubernetesに作成されると、OperatorがStackControllerを呼び出し、Stack CustomResourceの更新(クラドインフラリソースの作成/更新/削除)が行われます。Stackの更新はreconciliation-loopとして成功するまで繰り返されます。Stack更新の元となるGitHub repositoryに格納されたProgramは、tagで対象のgit commitを指定するか、branchを指定するかどちらかをStackControllerで設定できます。branchを指定した場合は、最新のcommitがStackControllerで検知されるたびに自動的にStackが更新されるようになります。
Operator自体の作成は、Typescript/Python/C#/Goなどであらかじめ作成されたProgramをPulumiの手動実行で作成するか、kubectlでYAML(manifest)をデプロイするかのどちらかを選択できます。ちなみに今回のハンズオンでは後者の「kubectlでYAML(manifest)をデプロイ」でOperatorを作成していきます。
・Pulumi Deployments
Pulumi Deploymentsは、CI/CDシステムの構築のみならず「pulumi up」をPulumi Cloudで実行するための環境(computeリソース)や、source code/credential/環境変数/buildの設定などの集中管理、REST APIを用いたリソースデプロイの仕組みの提供など、インフラストラクチャをPulumi Cloudで集中管理するためのフルマネージドプラットフォームです。現時点(2023年8月30日)では、まだpreviewの段階で、一般提供(GA)は2023年末を予定しているとのことです。今回は詳細を割愛しますが、previewの段階では無料でPulumi Deploymentsの機能が試せる(GAになったら有料プランで提供される予定)ので、気になる方はぜひ試してください。
【ハンズオン】Pulumi Kubernetes Operatorを利用したProgramの自動デプロイ(with GitHub)
ハンズオンの流れ
今回のハンズオンの流れと関連するサービス/リソースの全体像は以下のとおりです。今回のハンズオンでは、AWSのコンテナサービス「Amazon EKS」にPulumi Kubernetes Operatorをインストールして、GitHubに格納したProgramの自動デプロイを行います。
なお、GitHubを利用するため、GitHubアカウントがない場合は事前にアカウントを作成しておく必要があります。ハンズオン実施前には「事前準備」を行います(後述)。基本的にはPulumi公式リファレンスに記載の手順に沿う形ですが、Pulumi ProgramはPythonで作成します。作業は主にMacOSのターミナル/AWS CloudShellを利用します。
- Pulumi Service Backend Access Tokenを生成する
- AWS Access用credentialを生成する
- GitHubにPulumi project用repositoryを作成する
- Kubernetes clusterを作成する
- Pulumi StackControllerをデプロイする
- Pulumi Stack CustomResourceをデプロイする
- Pulumi Kubernetes Operatorの動作確認を実施する
前提
- ハンズオンを実施する上で必要なAWSのアクセス権限を有する(EKS Clusterの作成/S3 Bucket作成など)
- GitHubアカウントを有する
- kubectlコマンドの基本的な知識
- PCにPythonを導入済み(version 3.7以上)
事前準備
Pulumiを利用したAWSリソースデプロイのハンズオンを実施するには、事前に以下の作業が実施済みである必要があります。第2回で事前準備の手順を紹介していますので、まだ実施されていない方はそちらをご確認ください。
- Pulumi CLIのインストール
- Pulumiアカウント新規作成
- AWSアカウントへのPulumiアクセス設定
今回は、以下の事前準備の手順を紹介します。
- Pulumi Service Backend Access Token生成
- GCP Access用credential生成
- GitHubにPulumi project用repositoryを作成
・Pulumi Service Backend Access Token生成
Pulumi Kubernetes OperatorがPulumi Service Backendへアクセスするために必要なAccess Tokenを取得します。
- Access Tokens pageにアクセスしてPulumi Cloudにログイン後、[Create token]をクリックします。
- 「New Access Token」ポップアップの「description」で「PULUMI_ACCESS_TOKEN」と入力して[Create token]をクリックします(Pulumi Kubernetes Operatorで利用するaccess tokenであるため、分かりやすくdescriptionに「PULUMI_ACCESS_TOKEN」と入力していますが、生成したtokenの用途が分かれば特にdescriptionはなんでも良いです)。
- 「PULUMI_ACCESS_TOKEN」のaccess tokenが生成されます。後述の「Stack設定」手順にて利用するので、access tokenを安全なところにメモしておきます。
・AWS Access用 credential生成
Pulumi Kubernetes OperatorがAWSにリソースを作成するための、AWSの認証に必要な環境変数を取得します。AWSの一時認証を利用している場合などで、お使いの環境によって取得する環境変数は異なると思います。筆者の環境では一時認証を利用しているため「aws_access_key_id」「aws_secret_access_key」に加えて「aws_session_token」環境変数を取得しました(詳細は割愛)。
[default] aws_access_key_id=*** aws_secret_access_key=*** aws_session_token=***
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 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への移行