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

2023年9月13日(水)
大関 研丞 (Kenneth Ozeki)
第7回となる今回は、PulumiにおけるCI/CDの概要を解説し、Pulumi Kubernetes Operatorを利用してPulumi Programを自動デプロイするハンズオンを実践していきます。

はじめに

前回は、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] からも確認できます。

Pulumi Cloudコンソール画面からのCI/CDシステム設定方法確認

例えば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 が提供されています。

Pulumi Kubernetes Operator処理フロー

最初に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になったら有料プランで提供される予定)ので、気になる方はぜひ試してください。

PreviewではPulumi CloudからStack設定でPulumi Deployment機能を試せる

【ハンズオン】Pulumi Kubernetes Operatorを利用したProgramの自動デプロイ(with GitHub)

ハンズオンの流れ

今回のハンズオンの流れと関連するサービス/リソースの全体像は以下のとおりです。今回のハンズオンでは、AWSのコンテナサービス「Amazon EKS」にPulumi Kubernetes Operatorをインストールして、GitHubに格納したProgramの自動デプロイを行います。

なお、GitHubを利用するため、GitHubアカウントがない場合は事前にアカウントを作成しておく必要があります。ハンズオン実施前には「事前準備」を行います(後述)。基本的にはPulumi公式リファレンスに記載の手順に沿う形ですが、Pulumi ProgramはPythonで作成します。作業は主にMacOSのターミナル/AWS CloudShellを利用します。

  1. Pulumi Service Backend Access Tokenを生成する
  2. AWS Access用credentialを生成する
  3. GitHubにPulumi project用repositoryを作成する
  4. Kubernetes clusterを作成する
  5. Pulumi StackControllerをデプロイする
  6. Pulumi Stack CustomResourceをデプロイする
  7. 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を取得します。

  1. Access Tokens pageにアクセスしてPulumi Cloudにログイン後、[Create token]をクリックします。
  2. 「New Access Token」ポップアップの「description」で「PULUMI_ACCESS_TOKEN」と入力して[Create token]をクリックします(Pulumi Kubernetes Operatorで利用するaccess tokenであるため、分かりやすくdescriptionに「PULUMI_ACCESS_TOKEN」と入力していますが、生成したtokenの用途が分かれば特にdescriptionはなんでも良いです)。
  3. 「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=*** 
著者
大関 研丞 (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メルマガ会員のサービス内容を見る

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