連載 [第4回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
2023年5月26日(金)
第4回となる今回は、PulumiのSecurityについて解説し、ハンズオンではPulumiによる暗号化処理を行い、AWS SecretManagerを利用したRDS接続する流れを実践していきます。
Computeリソースのデプロイ
Secretリソース、Networkリソースが作成できたので、最後にこれらのリソースを利用してEC2インスタンスおよびRDSインスタンスを作成します。
- 「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
- 「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コマンドで自身のユーザ名を調べられます)。 - 「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に接続します。
- AWSマネジメントコンソールからEC2のインスタンス一覧画面に遷移し、作成したインスタンスの詳細画面にアクセスします。
- [接続]をクリックします。
- 「EC2 Instance Connect」タブで「ユーザー名」はデフォルト(ec2-user)のまま、[接続]をクリックします。 [接続]をクリック後、EC2のCLIが立ち上がることが確認できます。
- 次に、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!
- インストール完了確認後、以下のコマンドで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へ接続できました。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- 「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- PulumiでAWSリソースをデプロイしよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- 既に存在するリソースをPulumiで管理してみよう
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- TerraformからPulumiへの移行
- マシン・イメージを自動構築し、作業効率を高めるPacker入門
- 「Terraform」のコードを自分で書けるようになろう
- インフラの構成管理を自動化するTerraform入門