はじめに
パブリックサブネット上のEC2からawsコマンドでスタックを操作してみる
事前準備
パブリックサブネットにEC2を立てて、CLIコマンドが実行出来る状態にしておく
または、ローカル環境でCLIをインストールしておく。
やってみる(S3バケット)
S3バケット作成
以下スタックを準備
・stack_s3_param.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: test-cf-S3
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: mrbtest20230625
実行してみる。
yml形式のテンプレファイル(stack_s3_param.yml )を基に、スタック名(s3bucketcreate)にて、
論理名(S3Bucket)のバケット(mrbtest20230625)を作成する
$ aws cloudformation deploy --template-file stack_s3_param.yml --stack-name s3bucketcreate
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - s3bucketcreate
CFのイベントで論理IDが確認出来る
S3バケットも作成されている
削除していく
$ aws cloudformation delete-stack --stack-name s3bucketcreate
実行後、スタック自体とS3バケットの削除が確認できた。
バケット名をコマンドで指定
以下テンプレを用意
AWSTemplateFormatVersion: "2010-09-09"
Description: CloudTechDemoS3
Parameters:
S3BucketName:
Type: String
Description: Type of this BacketName.
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub ${S3BucketName}
実行コマンドはこれ
aws cloudformation deploy --template-file stack_s3.yml --stack-name s3bucketcreate --parameter-overrides S3BucketName=mrbtest20230625
起きてるプロセスとしては以下の様な感じ
- テンプレートの読み込み:AWS CloudFormationが指定された
stack_s3.yml
テンプレートを読み込む - パラメータの上書き:
--parameter-overrides
オプションが指定されている場合、AWS CLIはこのオプションで指定されたパラメータの値を使用してテンプレートのパラメータを上書きする。
この例では、S3BucketName
パラメータの値がmrbtest20230625
に上書きされる。 - テンプレートの変数の置換:
!Sub
関数を評価する。!Sub
関数は、テンプレート内の変数(${S3BucketName}
など)をその値(この場合はmrbtest20230625
)に置換する。 - リソースの作成: AWS CloudFormationは、テンプレートの
Resources
セクションに従ってAWSリソースを作成します。この例では、S3バケットが作成され、その名前は上記のパラメータの値、つまりmrbtest20230625
となる。
補足:
コマンド実行時に --parameter-overrides
オプションを使用するとテンプレート内のパラメータの値をコマンドラインから直接指定することができる。!Sub
は組み込み関数の一つで、文字列内の変数をその値に置換(Substitute)する。
2と3はやってる事はほぼ一緒だが実質的には異なるみたい。
セットで使われる事が多いみたいだけど、目的が異なるので別々にも利用出来る。
バケット名を設定ファイルから指定
以下ファイルを準備
・s3config.cfg
S3BucketName=mrbtest20230628
実行コマンド
赤ラインの部分により設定ファイルか読み込ませる。
$ aws cloudformation deploy --template-file stack_s3.yml --stack-name s3bucketcreate --parameter-overrides $(cat s3config.cfg)
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - s3bucketcreate
スタックとS3バケットが作成された
作成リソースの情報取得
このコマンドだと、指定したスタック名で作成されたS3バケットの情報が取得できる
$ aws cloudformation describe-stack-resource --stack-name s3bucketcreate --logical-resource-id S3Bucket
{
"StackResourceDetail": {
"StackName": "s3bucketcreate",
"StackId": "arn:aws:cloudformation:ap-northeast-1:773172787050:stack/s3bucketcreate/ec857600-153a-11ee-9d3a-06c764b75e41",
"LogicalResourceId": "S3Bucket",
"PhysicalResourceId": "mrbtest20230628",
"ResourceType": "AWS::S3::Bucket",
"LastUpdatedTimestamp": "2023-06-27T22:36:03.126000+00:00",
"ResourceStatus": "CREATE_COMPLETE",
"Metadata": "{}",
"DriftInformation": {
"StackResourceDriftStatus": "NOT_CHECKED"
}
}
}
:
やってみる(RDS)
参考ページ
事前準備
RDSサブネットグループ用にプライベートサブネットを2つ、異なるAZに作成しておく
【補足】
・AvailabilityZone: !Sub ${AWS::Region}a
→コマンドを実行しているリージョンに置き換わる。
スタック
以下が準備するスタック
AWSTemplateFormatVersion: "2010-09-09"
Description: test
Parameters:
DatabasePassword:
Type: String
Description: Database password
NoEcho: "true"
ApplicationSubnets:
Type: List<AWS::EC2::Subnet::Id>
Description: Target subnets
VpcId:
Type: AWS::EC2::VPC::Id
Description: Target VPC
DBinboundCidrIPs:
Type: String
Description: SecurityGroupInboundIP
Resources:
ApplicationDatabase:
Type: AWS::RDS::DBInstance
Properties:
Engine: MySQL
EngineVersion: 5.7
DBInstanceClass: db.t2.micro
AllocatedStorage: 10
StorageType: gp2
MasterUsername: mrbuser
MasterUserPassword:
Ref: DatabasePassword
DBName: mrbdb
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
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: !Ref DBinboundCidrIPs
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-db-sg
configファイルも用意
DatabasePassword=mrbpassword
ApplicationSubnets=subnet-035d1d3802333e7d5,subnet-0baa40ed4630a6af3
VpcId=vpc-0dd2b81aa9144d026
DBinboundCidrIPs=10.0.1.0/24
リソース作成
コマンドは成功。リソースも作成を確認
$ aws cloudformation deploy --template-file stack.yml --stack-name RDSmySQLcreate --parameter-overrides $(cat dev.cfg)
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - RDSmySQLcreate