Pulumi ESC を使ってみる
概要
Pulumi ESC (Environments, Secrets, and Configuration)
- クラウドインフラとアプリケーションの secret と configuration を管理できる
- Pulumi Cloud で利用可能なマネージドサービス
- 2023/10 にリリース
- 現在はプレビュー段階
ドキュメントに記載されている内容をざっくり要約
Pulumi ESC はクラウド環境における secret と configuration の複雑さに対処し、メンテナンスの負担を軽減し、コストのかかるミスを減らし、「secure by default」な体制を構築することを可能にします。Pulumi ESC は Configuration as Code です。
Pulumi ESC はチームが多くのソースから secret と configuration を environment と呼ばれる composable なコレクションに集約することを可能にします。そして、チームはこれらの secret と configuration をさまざまなインフラストラクチャやアプリケーションサービスから利用することができます。Pulumi ESC は Pulumi IaC と連携して構成管理を簡素化し、Pulumi IaC とは別のユースケースのために独立した CLI と API も提供します。
特徴
-
Configuration as Code
コードベース(YAML)のアプローチによる柔軟性により、複雑な構成を管理できる。 -
Hierarchical・Composable(階層的・組み合わせて構成可能)
environment(Pulumi ESCにおけるシークレット管理の単位)に他の environment をインポートすることができ、共通の secret と configuration を一元管理して制御できる。また、値をオーバーライド、他の値から補間、ネストできる。これにより、柔軟な構成と再利用が可能。 -
クラウドプロバイダーとの連携
OIDC をセットアップしてシークレット マネージャーからシークレットを取得可能。 -
様々なところからアクセス可能
Rest API を使って任意のアプリケーション、クラウドプロバイダー、CI/CD ツールなどからアクセス可能。 -
認証・RBAC
RBAC でシークレットへのアクセスをコントロールできる。
使ってみる
今回は Pulumi IaC で使ってみる。Project 作成などの初期設定は省略。
-
ESC の Environment を作成
Pulumi Cloud コンソールからでも作れる。$ pulumi env init org-name/test-environment Environment created.
-
Environment が作成されているを確認
$ pulumi env ls org-name/test-environment
-
Environment Values の保存
$ pulumi env set org-name/test-environment db-name test-db $ pulumi env set org-name/test-environment db-root-pass passw0rd --secret
-
Environment Values の確認
$ pulumi env get org-name/test-environment db-name Value "test-db" Definition test-db Defined at • test-environment:2:12 $ pulumi env get org-name/test-environment db-root-pass Value "[secret]" Definition fn::secret: ciphertext: ZXNjeAAAAAEAAAEAQOASKWINSy+a3CVW1ClFtiVwNXocKbzJscUQoUIhUHAQqEHpNTcuWQ== Defined at • test-environment:4:5 $ pulumi env open org-name/test-environment db-root-pass "passw0rd"
-
2つ目の Environment(test-environment-2)を作成
# test-environment-2 values: common: prefix: "esc"
-
test-environment-2 を test-environment から読み込む
クラウドプロバイダーのシークレットマネージャーから取ってきた値を利用することも可能。
Pulumi IaC で db-full-name を使いたいので pulumiConfig を設定。# test-environment imports: - test-environment-2 values: db-name: test-db db-root-pass: fn::secret: ciphertext: ZXNjeAAAAAEAAAEAQOASKWINSy+a3CVW1ClFtiVwNXocKbzJscUQoUIhUHAQqEHpNTcuWQ== pulumiConfig: db-full-name: '${common.prefix}-${db-name}'
-
Pulumi IaC で使う
stack settings file に environment を追加する
# Pulumi.dev.yaml environment: - test-environment config: gcp:project: dev-prj gcp:region: asia-northeast1 org-infra:HOGE: hoge org-infra:FUGE: fuga ・ ・ ・
-
Pulumi IaC のコード(TypeScript)
// network 作成などの部分は省略 import * as pulumi from '@pulumi/pulumi'; import * as gcp from '@pulumi/gcp'; const config = new pulumi.Config(); const gcpConfig = new pulumi.Config('gcp'); const project = gcpConfig.require('project'); const region = gcpConfig.require('region'); const dbFullName = config.require('db-full-name'); const dbRootPass = config.requireSecret('db-root-pass'); const databaseInstance = new gcp.sql.DatabaseInstance(dbFullName, { project: project, region: region, databaseVersion: 'MYSQL_5_7', name: dbFullName, rootPassword: dbRootPass, settings: { availabilityType: 'ZONAL', tier: 'db-g1-small', diskSize: 10, ipConfiguration: { ipv4Enabled: true, privateNetwork: network.id, }, }, }); const user = new gcp.sql.User('root', { name: 'root', instance: databaseInstance.name, password: dbRootPass, });
-
リソースを作成
db-full-name "esc-test-db" が反映されている$ pulumi up . . . Updating (dev) View in Browser (Ctrl+O): https://app.pulumi.com/org/org-infra/dev/updates/123 Type Name Status Info pulumi:pulumi:Stack org-name 1 message + ├─ gcp:sql:DatabaseInstance esc-test-db created (192s) └─ gcp:sql:User root created (1s) . . .
-
Database インスタンスが作成された
-
Cloud Shell から Database インスタンスに接続
db-root-pass に設定した "passw0rd" を入力すると接続できた。db-root-pass が反映されていることが確認できた。$ gcloud sql connect esc-test-db --user=root --quiet Allowlisting your IP for incoming connection for 5 minutes...done. Connecting to database with SQL user [root].Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 49 Server version: 5.7.44-google (Google) Copyright (c) 2000, 2024, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
最後に
Pulumi は Pulumi ESC 以外にも Platform Engineering チーム向けのサービスを提供しているので気になる方はチェックしてみてもいいかも。
Discussion