見出し画像

AWS CLIを使ってCloudFormationを操作してRDSを作成する

こんにちは!さっしです!

今回はタイトルにある通り、AWS CLIを使ってCloudFormationを操作してRDSを作成する方法をご紹介します。

主にCloudFormationからRDSを作成する全体的な流れの紹介がメインとなるため、詳細な設定情報等は割愛しています。

また、DBのユーザ名、パスワード等は本番環境と検証環境で同一のテンプレートが使いまわせるように、テンプレートには直接記述せずに外部ファイル化していますので、そのやり方についても手を動かしながら実感できるかと思いますので、是非やってみてください。

■完成図

画像1

■やりたいこと

・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バケットを作成する

画像2

■やること

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
・ナビゲーションペインの「ポリシー」をクリック後、右上の「ポリシーの作成」ボタンをクリックする

画像3

・  「JSON」タブをクリック後、以下の内容を入力し「次のステップ」ボタンをクリックする

{
   "Version": "2012-10-17",
   "Statement": [
       {
           "Sid": "StatementId1",
           "Effect": "Allow",
           "Action": "ec2:CreateSecurityGroup",
           "Resource": "*"
       },
       {
           "Sid": "StatementId2",
           "Effect": "Allow",
           "Action": "ec2:DeleteSecurityGroup",
           "Resource": "*"
       }
   ]
}

・「タグを追加」画面が表示されるので必要に応じてタグを設定し「次のステップ」ボタンをクリックする

・以下の内容を入力し「ポリシーの作成」ボタンをクリックする
名前:任意の値

画像4

○Tips
EC2 APIではリソースレベルでのアクセス許可を設定できない物が存在する
※今回は「*(全てのリソース)」で設定した
https://dev.classmethod.jp/articles/about-unsupported-resource-level-permissions-of-the-amazon-ec2-api-ja/

・検索バーに「先ほど設定したポリシー名」を入力する

画像5

・ポリシーに「チェック」を入れ、「ポリシーのアクション」→「アタッチ」をクリクする

画像6

・アタッチしたいロールに「チェック」を入れ「ポリシーのアタッチ」ボタンをクリックする

画像7

○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  219 06:54 rds.yml
-rw-r--r-- 1 ec2-user ec2-user  181  219 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ってほんと楽しいですね!

この記事が気に入ったらサポートをしてみませんか?