SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう

2023年5月26日(金)
大関 研丞 (Kenneth Ozeki)
第4回となる今回は、PulumiのSecurityについて解説し、ハンズオンではPulumiによる暗号化処理を行い、AWS SecretManagerを利用したRDS接続する流れを実践していきます。

【ハンズオン】Pulumiによる認証情報の暗号化とRDS接続

ハンズオンの流れ

今回のハンズオンの流れと関連するサービス/リソースの全体象は以下のとおりです。ハンズオン実施前には「事前準備」、ハンズオン完了後は後述の「クリーンアップ作業」を行います。

  1. Project/Stack(secret.dev/network.dev/compute.dev)を新規で作成する
  2. Pulumi Stack(secret.dev)設定ファイルにDBパスワードを設定する
  3. SecretリソースのProgramを更新してStackをデプロイする
  4. NetworkリソースのProgramを更新してStackをデプロイする
  5. ComputeリソースのProgramを更新してStackをデプロイする
  6. EC2からRDS接続の動作確認をする

また、ハンズオン実施時の最終的なディレクトリ構成は以下のようになります。

pulumi-security/
├── compute/
│   ├── Pulumi.compute.dev.yaml
│   ├── Pulumi.yaml
│   ├── __main__.py
│   ├── venv/
│   └── requirements.txt
├── network/
│   ├── Pulumi.network.dev.yaml
│   ├── Pulumi.yaml
│   ├── __main__.py
│   ├── venv/
│   └── requirements.txt
└── secret/
    ├── Pulumi.secret.dev.yaml
    ├── Pulumi.yaml
    ├── __main__.py
    ├── venv/
    └── requirements.txt

前提

  • ハンズオンを実施する上で必要なAWSのアクセス権限を有する
    • VPC/サブネット/セキュリティグループ/インターネットゲートウェイ/ルートテーブルなど、ひと通りのネットワーク関連のリソースを作成できる権限
    • EC2インスタンス/RDSインスタンスを作成できる権限
  • PCにPythonを導入済み(version 3.7以上)

事前準備

Pulumiを利用したAWSリソースデプロイのハンズオンを実施するには、事前に以下の作業が実施済みである必要があります。事前準備の手順は第2回で解説しているので、まだ実施されていない方はそちらを確認してください。

  • Pulumi CLIのインストール
  • Pulumiアカウント新規作成
  • AWSアカウントへのPulumiアクセス設定

Pulumi Project/Stackの新規作成

Pulumi CLIを用いて、新規でPulumi ProjectとStackを作成します。

  1. Pulumi Project用のディレクトリを作成します。
    $ mkdir pulumi-security && cd pulumi-security
  2. AWSのリソース種別に応じたディレクトリを作成します。
    $ mkdir secret
    $ mkdir network
    $ mkdir compute
    
    $ ls -F
    compute/	network/	secret/
  3. Pulumi Project作成コマンド「pulumi new <テンプレート名>」を実行します。今回はpythonでAWSリソースを作成するため、テンプレート名は「aws-python」になります。
    $ cd secret
    
    $ pulumi new aws-python
    
    This command will walk you through creating a new Pulumi project.
    
    Enter a value or leave blank to accept the (default), and press <ENTER>.
    Press ^C at any time to quit.
  4. 「pulumi new <テンプレート名>」コマンド実行後は「Pulumi Project名(project name)」「Pulumi Projectの説明(project description)」「Pulumi Stack名(stack name)」「AWSのデフォルトリージョン(aws:region)」をプロンプトに従って設定していきます。各項目右の括弧内の値は、特に指定がない場合のデフォルト値を示します。今回はPulumi Project名(project name)には「pulumi-security」を入力します。Pulumi Projectの説明(project description)はデフォルト値を設定するため、そのまま<ENTER>を押下します。Pulumi Stack名(stack name)は「secret.dev」を入力します。AWSのデフォルトリージョン(aws:region)は「アジアパシフィック(東京)」に設定するため、「ap-northeast-1」を設定してから<ENTER>を押下しました。
    $ pulumi new aws-python
    This command will walk you through creating a new Pulumi project.
    
    Enter a value or leave blank to accept the (default), and press <ENTER>.
    Press ^C at any time to quit.
    
    project name: (secret) pulumi-security
    project description: (A minimal AWS Python Pulumi program) 
    Created project 'pulumi-security'
    
    Please enter your desired stack name.
    To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
    stack name: (dev) secret.dev
    Created stack 'secret.dev'
    
    aws:region: The AWS region to deploy into: (us-east-1) ls
    ap-northeast-1
    Saved config
    以降は、自動的にPulumiの実行に必要なファイルやpythonのdependenciesなどが自動的にインストール/作成され、Pulumi ProjectおよびStackの作成が完了します。
    Installing dependencies...
    
    Creating virtual environment...
    Finished creating virtual environment
    Updating pip, setuptools, and wheel in virtual environment...
    Requirement already satisfied: pip in ./venv/lib/python3.10/site-packages (22.2.2)
    Collecting pip
         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 7.8 MB/s eta 0:00:00
    ~~(略)~~
    Successfully installed arpeggio-2.0.0 attrs-23.1.0 dill-0.3.6 grpcio-1.51.3 parver-0.4 protobuf-4.23.0 pulumi-3.66.0 pulumi-aws-5.40.0 pyyaml-6.0 semver-2.13.0 six-1.16.0
    Finished installing dependencies
    Finished installing dependencies
    
    Your new project is ready to go! ✨
    
    To perform an initial deployment, run `pulumi up`
    この時点で「Pulumi.yaml(Pulumi Projectのメタデータが記述されたファイル)」「Pulumi.dev.yaml(Pulumi Stackのkey-value形式の設定ファイル、dev環境用)」「__main__.py(Python用のPulumi Program)」「requirements.txt / venv(開発言語(runtime)特有のファイル/ディレクトリ)」が生成されます。
    $ pwd
    /***/pulumi-security/secret
    
    $ ls -F
    Pulumi.secret.dev.yaml	Pulumi.yaml		__main__.py		requirements.txt	venv/
  5. 生成したPulumi関連ファイルを他のディレクトリ(network、compute)に全てコピーします。
    $ cp -R ./* ../network
    $ cp -R ./* ../compute
  6. 「network」ディレクトリでStack設定ファイルの名前をディレクトリ名に合わせて修正します。修正後「network.dev」Stackを新規作成します。
    $ cd ../network 
    $ mv Pulumi.secret.dev.yaml Pulumi.network.dev.yaml
    
    $ pwd
    /***/pulumi-security/network
    $ ls -F
    Pulumi.network.dev.yaml		__main__.py			requirements.txt
    Pulumi.yaml			__pycache__/			venv/
    
    $ pulumi stack init network.dev
    Created stack 'network.dev'
  7. 「compute」ディレクトリも同様に、Stack設定ファイルの名前をディレクトリ名に合わせて修正します。修正後「compute.dev」Stackを新規作成します。
    $ cd ../compute 
    $ mv Pulumi.secret.dev.yaml Pulumi.compute.dev.yaml
    
    $ pwd
    /***/pulumi-security/compute
    $ ls -F
    Pulumi.compute.dev.yaml		__main__.py			requirements.txt
    Pulumi.yaml			__pycache__/			venv/
    
    $ pulumi stack init compute.dev
    Created stack 'compute.dev'
    最終的に3つのStackが作成された状態です。
    $ pulumi stack ls
    NAME          LAST UPDATE  RESOURCE COUNT  URL
    compute.dev*  n/a          n/a             https://app.pulumi.com/***/pulumi-security/compute.dev
    network.dev   n/a          n/a             https://app.pulumi.com/***/pulumi-security/network.dev
    secret.dev    n/a          n/a             https://app.pulumi.com/***/pulumi-security/secret.dev

Pulumi Stackのパスワード設定

「secret.dev」のStack設定ファイルに、AWSリソースのsecretmanager versionの作成で利用するパスワードを設定します。

  1. 「secret」ディレクトリに移動し、Stackを「secret.dev」に切り替えます。
    $ cd ../secret
    $ pwd
    /***/pulumi-security/secret
    
    $ pulumi stack select secret.dev
    
    $ pulumi stack ls
    NAME          LAST UPDATE  RESOURCE COUNT  URL
    compute.dev  n/a          n/a             https://app.pulumi.com/***/pulumi-security/compute.dev
    network.dev   n/a          n/a             https://app.pulumi.com/***/pulumi-security/network.dev
    secret.dev*    n/a          n/a             https://app.pulumi.com/***/pulumi-security/secret.dev
  2. Pulumi CLIでStack設定ファイルにパスワードを設定します。ハンズオンでは、分かりやすいように「12345678」というパスワードを「my_password」という名前でStack設定ファイルに追加します。パスワードを暗号化して設定ファイルに追加するため「--secret」フラグをコマンドに追加します。
    $ pulumi config set my_password 12345678 --secret
    コマンド実行後にStack設定ファイルを確認すると、パスワードが暗号化されていることを確認できます。
    $ cat Pulumi.secret.dev.yaml 
    config:
      aws:region: ap-northeast-1
      pulumi-security:my_password:
        secure: AAABAMV83UJX+0QAPFnk0L8+8yfjPOqUDPRfaAcgsX+uq7yYivZI+A==
著者
大関 研丞 (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メルマガ会員のサービス内容を見る

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