👀

Pulumi ESC を使ってみる

2024/05/05に公開

概要

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 も提供します。

https://www.pulumi.com/docs/esc/
https://github.com/pulumi/esc

特徴

  • Configuration as Code
    コードベース(YAML)のアプローチによる柔軟性により、複雑な構成を管理できる。
  • Hierarchical・Composable(階層的・組み合わせて構成可能)
    environment(Pulumi ESCにおけるシークレット管理の単位)に他の environment をインポートすることができ、共通の secret と configuration を一元管理して制御できる。また、値をオーバーライド、他の値から補間、ネストできる。これにより、柔軟な構成と再利用が可能。
  • クラウドプロバイダーとの連携
    OIDC をセットアップしてシークレット マネージャーからシークレットを取得可能。
  • 様々なところからアクセス可能
    Rest API を使って任意のアプリケーション、クラウドプロバイダー、CI/CD ツールなどからアクセス可能。
  • 認証・RBAC
    RBAC でシークレットへのアクセスをコントロールできる。

使ってみる

今回は Pulumi IaC で使ってみる。Project 作成などの初期設定は省略。

  1. ESC の Environment を作成
    Pulumi Cloud コンソールからでも作れる。

    $ pulumi env init org-name/test-environment
    Environment created.
    
  2. Environment が作成されているを確認

    $ pulumi env ls
    org-name/test-environment
    
  3. 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
    
  4. 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"
    

  5. 2つ目の Environment(test-environment-2)を作成

    # test-environment-2
    
    values:
      common:
        prefix: "esc"
    
  6. 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}'
    
  7. 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
    ・
    ・
    ・
    
  8. 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,
    });
    
  9. リソースを作成
    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)    
    .
    .
    .
    
  10. Database インスタンスが作成された

  11. 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