AWS CLIでCloudFormationのスタック操作

AWS

はじめに

パブリックサブネット上の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

起きてるプロセスとしては以下の様な感じ

  1. テンプレートの読み込み:AWS CloudFormationが指定されたstack_s3.ymlテンプレートを読み込む
  2. パラメータの上書き: --parameter-overrides オプションが指定されている場合、AWS CLIはこのオプションで指定されたパラメータの値を使用してテンプレートのパラメータを上書きする。
    この例では、S3BucketName パラメータの値が mrbtest20230625 に上書きされる。
  3. テンプレートの変数の置換: !Sub 関数を評価する。!Sub 関数は、テンプレート内の変数(${S3BucketName}など)をその値(この場合は mrbtest20230625)に置換する。
  4. リソースの作成: 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)

参考ページ

Amazon RDS テンプレートスニペット - AWS CloudFormation
AWS CloudFormation で Amazon 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
タイトルとURLをコピーしました