【学習記録】CloudFormation基礎

昨日ECS+ALBのインフラを構築しようとして失敗しましたが、どんな感じでALBが機能するのかもイメージは掴むことができました。
昨日はマネージメントコンソールから操作したので今日はCloudFormationでスクリプトを書く練習をしました。

こちらの動画のコードを参考にして勉強します。解説も丁寧でありがたいです。

www.youtube.com

動画で使用されているコードのGItHubリポジトリはこちら。

github.com

まず、READMEに書かれてる手順で以下のAWS CLIコマンドを実行すると想定通りにECSタスクが立ち上がってブラウザでアクセスできることまで確認できました。

aws cloudformation create-stack --template-body file://$PWD/infra/vpc.yml --stack-name vpc

aws cloudformation create-stack --template-body file://$PWD/infra/iam.yml --stack-name iam --capabilities CAPABILITY_IAM

aws cloudformation create-stack --template-body file://$PWD/infra/app-cluster.yml --stack-name app-cluster

# api.yml のDockerイメージURLは自分んECRから取得したURLに変更する必要があります
aws cloudformation create-stack --template-body file://$PWD/infra/api.yml --stack-name api

やっぱり動くことが確認できているコードを参考にできると大変ありがたいですね。
しっかりコード分析したいと思います。

以下は上記のコードを参考に自分でCloudFormationテンプレート書いてみた記録です。

まずVPCを作成するためにinfra0130というディレクトリにvpc0130.ymlというファイル名で以下のテンプレートを書きました。

AWSTemplateFormatVersion: '2010-09-09'
Description: VPC created at 20210130

Resources:

  VPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '10.0.0.0/16'
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default

10.0.0.0/16のVPCを作成するだけのシンプルなテンプレートです。

このテンプレートでCloudFormationスタックを作成するために以下のAWS CLIコマンドを実行します。

aws cloudformation create-stack --template-body file://$PWD/infra0130/vpc0130.yml --stack-name vpc0130

コマンドを実行するとCloudFormationのStackIdが出力されました。

{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:428351874559:stack/vpc0130/be2f0270-62fa-11eb-b445-060c99a0ecc6"
}

そしてClodFormation Stackが作成されているのがマネジメントコンソールから確認できました。
f:id:JunpeiNakasone:20210130220129p:plain

ResourcesタブではこのStackに含まれてるAWSリソースが確認できるようです。
このStackで作成されたVPCが表示されていました。
f:id:JunpeiNakasone:20210130220323p:plain

VPC IDをクリックするとCloudFormationから作成されたVPCが表示されました。
f:id:JunpeiNakasone:20210130220415p:plain

しかしNameタグがないと何かと不便そうなのでテンプレートにNameタグを追加する書き方を調べるため、公式ドキュメントを読んでみました。

docs.aws.amazon.com

公式ドキュメントに一通り必要な情報はまとまっているので調べやすいですね。

ドキュメントの内容を参考にテンプレートを以下のように修正しました。

AWSTemplateFormatVersion: '2010-09-09'
Description: VPC created at 20210130

Resources:

  VPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '10.0.0.0/16'
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default
      Tags:
        - Key: "Name"
          Value: "VPC0130"

上記テンプレート実行する前に先に作成したStackを以下のコマンドで削除しました。(もしかしたらupdateするコマンドを使ったほうが効率良いかも。後々改善する)

aws cloudformation delete-stack --stack-name vpc0130

そして再度以下のコマンドでStackを作成して、StackIDが出力されました。。

aws cloudformation create-stack --template-body file://$PWD/infra0130/vpc0130.yml --stack-name vpc0130
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:428351874559:stack/vpc0130/6c8861d0-62fc-11eb-b45b-0e15f647217b"
}

作成されたVPCを確認すると想定通りNameタグがついていました。
f:id:JunpeiNakasone:20210130221341p:plain

まだVPC作っただけですが、ClodFormationの雰囲気が掴めてきました。
やっぱりマネジメントコンソールでの操作よりも再現性があるし、自分が書いたテンプレートも見直せるので良いですね。

ひとつずつ確認しながら練習して、CloudFormationでECSの構築までできるように進めていきたいと思います。