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

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

Computeリソースのデプロイ

Secretリソース、Networkリソースが作成できたので、最後にこれらのリソースを利用してEC2インスタンスおよびRDSインスタンスを作成します。

  1. 「compute」ディレクトリに移動し、Stackを「compute.dev」に切り替えます。
    $ cd ../compute 
    
    $ pwd
    /***/pulumi-security/compute
    
    $ pulumi stack select compute.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   12 minutes ago  12              https://app.pulumi.com/***/pulumi-security/network.dev
    secret.dev    1 hour ago      4               https://app.pulumi.com/***/pulumi-security/secret.dev
  2. 「compute」ディレクトリのPulumi Program「__main__.py」を以下に書き換えます。
    import pulumi
    import pulumi_aws as aws
    import json
    
    # 現在のStack名から環境名(dev/stg/prodなど)を取得
    env = pulumi.get_stack().split('.')[-1]
    
    # network/secret それぞれのStackの情報を取得(<<pulumiユーザー名>>の部分は適宜変更してください)
    network_stack_ref = pulumi.StackReference("<<pulumiユーザー名>>/pulumi-security/network." + env)
    secret_stack_ref = pulumi.StackReference("**<<pulumiユーザー名>>/pulumi-security/secret." + env)
    
    # EC2インスタンスの作成
    ami = aws.ec2.get_ami(
        filters=[{
            "name": "name",
            "values": ["amzn2-ami-hvm-*-x86_64-gp2"],
        }],
        most_recent=True,
    )
    
    ec2_instance = aws.ec2.Instance("my-instance",
        instance_type="t2.micro",
        subnet_id=network_stack_ref.get_output("public_subnet_id"),
        ami=ami.id,
        vpc_security_group_ids=[network_stack_ref.get_output("ec2_security_group_id")],
    )
    
    # secret情報の取得
    secret_result = aws.secretsmanager.get_secret_version(secret_id=secret_stack_ref.get_output("secret_id"))
    secret_dict = json.loads(secret_result.secret_string)
    master_username = secret_dict["username"]
    master_password = secret_dict["password"]
    
    # RDSインスタンスの作成
    rds_instance = aws.rds.Instance(
        "my-rds-instance",
        engine="mysql",
        engine_version="5.7",
        instance_class="db.t2.micro",
        allocated_storage=10,
        db_subnet_group_name=network_stack_ref.get_output("rds_subnet_group_id"),
        iam_database_authentication_enabled=True,
        skip_final_snapshot=True,
        username=master_username,
        password=master_password,
        vpc_security_group_ids=[network_stack_ref.get_output("rds_security_group_id")],
    )
    
    # EC2インスタンスIDとRDSインスタンスエンドポイントを出力
    pulumi.export("ec2_instance_id", ec2_instance.id)
    pulumi.export("rds_instance_endpoint", rds_instance.endpoint)
    【computeディレクトリ Pulumi Program(__main__.py)】

    network/secretそれぞれのStackの情報は「pulumi.StackReference」で取得します。pulumi.StackReferenceの引数には取得するStackの情報を入れますが、フォーマットは「<pulumiユーザー名>/<project>/<stack>」となるため、<pulumiユーザ名>の部分は適宜変更してください($ pulumi whoamiコマンドで自身のユーザ名を調べられます)。
  3. 「compute.dev」Stackをデプロイします。RDSの作成には少し時間が掛かります(筆者の環境だと4分ほど掛かりました)。
    $ pulumi up
    
    Please choose a stack, or create a new one: compute.dev
    Previewing update (compute.dev)
    
    View Live: https://app.pulumi.com/***/pulumi-security/compute.dev/previews/cd7f4c85-e57f-484e-910b-***
    
         Type                 Name                         Plan       
     +   pulumi:pulumi:Stack  pulumi-security-compute.dev  create     
     +   ├─ aws:ec2:Instance  my-instance                  create     
     +   └─ aws:rds:Instance  my-rds-instance              create     
    
    
    Outputs:
        ec2_instance_id      : output<string>
        rds_instance_endpoint: output<string>
    
    Resources:
        + 3 to create
    
    Do you want to perform this update? yes
    Updating (compute.dev)
    
    View Live: https://app.pulumi.com/***/pulumi-security/compute.dev/updates/18
    
         Type                 Name                         Status             
     +   pulumi:pulumi:Stack  pulumi-security-compute.dev  created (245s)     
     +   ├─ aws:ec2:Instance  my-instance                  created (31s)      
     +   └─ aws:rds:Instance  my-rds-instance              created (241s)     
    
    
    Outputs:
        ec2_instance_id      : "i-09442300d7b789f9c"
        rds_instance_endpoint: "my-rds-instanced451c77.***.ap-northeast-1.rds.amazonaws.com:3306"
    
    Resources:
        + 3 created
    
    Duration: 4m7s

以上で、RDS接続のための一通りのリソースのデプロイは完了しました。

動作確認

ひと通りAWSリソースが作成できたので、動作確認としてEC2にSSH接続後、そこからDBユーザのパスワードを入力してRDSに接続します。

  1. AWSマネジメントコンソールからEC2のインスタンス一覧画面に遷移し、作成したインスタンスの詳細画面にアクセスします。
  2. [接続]をクリックします。
  3. 「EC2 Instance Connect」タブで「ユーザー名」はデフォルト(ec2-user)のまま、[接続]をクリックします。
    [接続]をクリック後、EC2のCLIが立ち上がることが確認できます。
  4. 次に、EC2のCLIでRDS接続のためのMySQLクライアントをインストールします。
    [ec2-user@ip-10-0-0-254 ~]$ sudo yum install mysql
    
    Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
    amzn2-core                                                                               | 3.7 kB  00:00:00
    Resolving Dependencies
    --> Running transaction check
    ---> Package mariadb.x86_64 1:5.5.68-1.amzn2 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    =============================================================================
     Package                      Arch                    Version                Repository          Size
    =============================================================================
    Installing:
     mariadb                     x86_64             1:5.5.68-1.amzn2         amzn2-core          8.8 M
    
    Transaction Summary
    =============================================================================
    Install  1 Package
    
    Total download size: 8.8 M
    Installed size: 49 M
    Is this ok [y/d/N]: y
    ~~(略)~~
    
    Installed:
      mariadb.x86_64 1:5.5.68-1.amzn2
    
    Complete!
  5. インストール完了確認後、以下のコマンドでRDSに接続します。ユーザ名は「my_username」です。コマンド最後の「-h」に続くRDSインスタンスのエンドポイントは、各自で作成した実際のRDSのエンドポイントに適宜変更してください。指定コマンド実行後にPulumi Stack設定ファイルで設定したパスワード「12345678」を入力すると、無事RDSに接続されたことを確認できます。
    [ec2-user@ip-10-0-0-254 ~]$ mysql -u my_username -p -h <実際に作成したRDSのエンドポイントに適宜変更してください 例:my-rds-instanced451c77.***.ap-northeast-1.rds.amazonaws.com>
    
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or ¥g.
    Your MySQL connection id is 16
    Server version: 5.7.41 Source distribution
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '¥h' for help. Type '¥c' to clear the current input statement.
    
    MySQL [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | innodb             |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.01 sec)
    
    MySQL [(none)]>
    ちなみに、RDSインスタンスのエンドポイントはPulumiでOutputを作成しているため、Pulumi CLIの以下コマンドで確認できます。
    $ pulumi stack output rds_instance_endpoint --stack compute.dev
    ---
    my-rds-instanced451c77.***.ap-northeast-1.rds.amazonaws.com:3306

簡単な構成ではありますが、以上のように、PulumiのStack設定ファイルで事前に暗号化して設定したDBユーザのパスワードを用いてRDSにDBユーザを作成し、無事にRDSへ接続できました。

著者
大関 研丞 (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メルマガ会員のサービス内容を見る

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