AWS CLIを使ってCloudFormationを操作してRDSを作成する
こんにちは!さっしです!
今回はタイトルにある通り、AWS CLIを使ってCloudFormationを操作してRDSを作成する方法をご紹介します。
主にCloudFormationからRDSを作成する全体的な流れの紹介がメインとなるため、詳細な設定情報等は割愛しています。
また、DBのユーザ名、パスワード等は本番環境と検証環境で同一のテンプレートが使いまわせるように、テンプレートには直接記述せずに外部ファイル化していますので、そのやり方についても手を動かしながら実感できるかと思いますので、是非やってみてください。
■完成図
■やりたいこと
・AWS CLIのCloudFormationコマンドを使いRDSを作成したい
※RDSの細かい設定条件は割愛します
・RDSはEC2のセキュリティグループからのみアクセスさせたい
・テンプレート(rds.yml)内で使用する一部のパラメータは、外部ファイル(dev.cfg)から参照させたい
・作成したスタックを正常に削除できるようにしたい
■事前準備
1.EC2内の「credentials」に「 CloudFormationFullAccess」と「RDSFullAccess」と「EC2FullAccess」のポリシーがアタッチされた「ユーザ(今回はtest1ユーザ)」の認証情報が記述されている
2.EC2内の「config」に「ap-northeast-1」と「json」を設定している
※設定方法等は以下のブログを参考にしてください
AWS CLIについてちょっと調べてみた
AWS CLIを使ってCloudFormationを操作してS3バケットを作成する
■やること
1.「ec2:CreateSecurityGroup」と「ec2:DeleteSecurityGroup」の「カスタマー管理ポリシー」を作成し、ユーザにアタッチする
2.テンプレートから読み込まれる「外部設定ファイル(dev.cfg)」を作成する
3.「RDS」と「セキュリティグループ」を作成する「テンプレートファイル(rds.yml)」を作成する
4.EC2にローカルで作成した「dev.cfg」と「rds.yml」をアップロードする
5.AWS CLIのcloudformationコマンドで「RDS」を作成する
6.AWS CLIのcloudformationコマンドで「RDS」を削除する
■1.「ec2:CreateSecurityGroup」と「ec2:DeleteSecurityGroup」の「カスタマー管理ポリシー」を作成し、ユーザにアタッチする
サービス:IAM
・ナビゲーションペインの「ポリシー」をクリック後、右上の「ポリシーの作成」ボタンをクリックする
・ 「JSON」タブをクリック後、以下の内容を入力し「次のステップ」ボタンをクリックする
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "StatementId1",
"Effect": "Allow",
"Action": "ec2:CreateSecurityGroup",
"Resource": "*"
},
{
"Sid": "StatementId2",
"Effect": "Allow",
"Action": "ec2:DeleteSecurityGroup",
"Resource": "*"
}
]
}
・「タグを追加」画面が表示されるので必要に応じてタグを設定し「次のステップ」ボタンをクリックする
・以下の内容を入力し「ポリシーの作成」ボタンをクリックする
名前:任意の値
○Tips
EC2 APIではリソースレベルでのアクセス許可を設定できない物が存在する
※今回は「*(全てのリソース)」で設定した
https://dev.classmethod.jp/articles/about-unsupported-resource-level-permissions-of-the-amazon-ec2-api-ja/
・検索バーに「先ほど設定したポリシー名」を入力する
・ポリシーに「チェック」を入れ、「ポリシーのアクション」→「アタッチ」をクリクする
・アタッチしたいロールに「チェック」を入れ「ポリシーのアタッチ」ボタンをクリックする
○Tips
ec2:CreateSecurityGroupは、RDSのセキュリティグループのインバウンドルールに、EC2のセキュリティグループからの通信を許可するために使用する
ec2:DeleteSecurityGroupは、上記で設定したセキュリティグループを削除するために使用する
■2.テンプレートから読み込まれる「外部設定ファイル(dev.cfg)」を作成する
ファイル:dev.cfg
・以下の内容を入力し保存する
DatabaseUser=RdsUser123 # 任意の値
DatabasePassword=RdsPassword123 # 任意の値
DatabaseName=RdsDatabase # 任意の値
ApplicationSubnets=subnet-0060e9b3ceb319df4,subnet-01a0d9e2642de97cf # 事前に作成済みのプライベートサブネットのサブネットID
VpcId=vpc-0287fcadc1c455eb0 # 事前に作成済みのVPCID
DBinboundGroupId=sg-0e192750775ad0c58 # 事前に作成済みのEC2のセキュリティグループID
■3.「RDS」と「セキュリティグループ」を作成する「テンプレートファイル(rds.yml)」を作成する
ファイル:rds.yml
・以下の内容を入力し保存する
AWSTemplateFormatVersion: "2010-09-09"
Description: RDSCreateChallenge
Parameters: # dev.cfgに設定されているキーバリューの一覧
DatabaseUser: # Resourcesセクションではこの論理IDを使いRef関数で参照する
Type: String
Description: Database user
DatabasePassword:
Type: String
Description: Database password
NoEcho: "true"
DatabaseName:
Type: String
Description: Database name
ApplicationSubnets:
Type: List<AWS::EC2::Subnet::Id> # LIST<>で囲むことにより、カンマ区切りリストパラメータ型を受け取ることが可能
Description: Target subnets
VpcId:
Type: AWS::EC2::VPC::Id # AWS固有のパラメータを指定することにより、無効な値等の入力値の検証が可能
Description: Target VPC
DBinboundGroupId:
Type: AWS::EC2::SecurityGroup::Id
Description: SecurityGroupInboundId
Resources:
ApplicationDatabase: # RDSの設定
Type: AWS::RDS::DBInstance
Properties:
Engine: MySQL
EngineVersion: 5.7
DBInstanceClass: db.t2.micro
AllocatedStorage: 10
StorageType: gp2
MasterUsername: !Ref DatabaseUser
MasterUserPassword:
Ref: DatabasePassword
DBName: !Ref DatabaseName
VPCSecurityGroups:
- !Ref ApplicationDatabaseSecurityGroup
DBSubnetGroupName: !Ref ApplicationDatabaseSubnetGroup
MultiAZ: "false"
AvailabilityZone: !Sub ${AWS::Region}a # 実行時に実行中の環境のリージョン名に置換される
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-db # 実行時にスタック名に置換される
ApplicationDatabaseSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupDescription: Application Database Subnet Group
SubnetIds: !Ref ApplicationSubnets
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-db-subnet-group
ApplicationDatabaseSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub ${AWS::StackName} Application Database Security Group
VpcId: !Ref VpcId # dev.cfgのVpcIdの値
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
SourceSecurityGroupId: !Ref DBinboundGroupId # dev.cfgのDBinboundGroupIdの値
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-db-sg
■4.EC2にローカルで作成した「dev.cfg」と「rds.yml」をアップロードする
サービス:ローカルのSSHクライアント
・以下のコマンドを実行する
scp -i hoge-keypair.pem ~/dev.cfg ~/rds.yml ec2-user@xxx.xxx.xxx.xxx:/home/ec2-user
・ファイルがアップロードされていることを確認する
ssh -i hoge-keypair.pem ec2-user@xxx.xxx.xxx.xxx
[ec2-user@ip-10-0-0-114 ~]$ ll
-rw-r--r-- 1 ec2-user ec2-user 2361 2月 19 06:54 rds.yml
-rw-r--r-- 1 ec2-user ec2-user 181 2月 19 02:07 stack.yml
■5.AWS CLIのcloudformationコマンドで「RDS」を作成する
・以下のコマンドを実行する
aws cloudformation deploy --template-file rds.yml --stack-name createrdsstack --parameter-overrides $(cat dev.cfg) --profile test1
※aws cloudformation deploy --template-file {テンプレートファイル} --stack-name {スタック名} --parameter-overrides {rds.ymlテンプレートのparameterセクションに置き換える値}
○Tips
パラメータの設定不備等でスタックの作成が失敗した場合はCloudFormationのステータスに「ROLLBACK_COMPLETE」と表示されます。
この場合は、マネジメントコンソールから削除を行います。
https://stackoverflow.com/questions/57932734/validationerror-stackarn-aws-cloudformation-stack-is-in-rollback-complete-state
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-view-stack-data-resources.html
■6.AWS CLIのcloudformationコマンドで「RDS」を削除する
・以下のコマンドを実行する
aws cloudformation delete-stack --stack-name createrdsstack --profile test1
※aws cloudformation delete-stack --stack-name {スタック名}
設定は以上になります。
AWSってほんと楽しいですね!
この記事が気に入ったらサポートをしてみませんか?