Chapter 03無料公開

構築前に学ぶべき事前知識①(基本構文 / 関数 / CLI)

ひやんが / hiyanger
ひやんが / hiyanger
2023.08.19に更新

いきなりコードを書きはじめるよるよりも、まずはここで記載する前提知識を理解すると、全体のスピードをよりあげられると思います。コード記述の前に以下5項目のテンプレート基本構文、関数、CLI、クロススタック、ネストを是非学んでおいてください。

テンプレートの基本構文

コードを記述する骨組みです。主要なものだけ記載します。

Parameters

入力値を記述します。環境変数みたいなもので、あとからこのコードを流すときにパラメーターを渡してあげることができます。

Resources

ここがメイン部分です。実際に構築するリソースを記載します。Typeでリソースの種別、Propertiesで実際の設定値を記載します。

Outputs

コードを流した後に出力させるパラメータを記載します。ネストやクロススタックなどで使います。

実際のコード

VPCを構築するときのコードです。このコードを大枠として考えればよいです。Parametersで変数の設定、Resourcesで実際の設定値、Outputsでは他のファイルから参照できるようにエクスポートしています。

vpc.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: VPC,Subnet

Parameters:
  sysname:
    Type: String
    
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      Tags:
        - Key: Name
          Value: !Sub ${sysname}-vpc
	  
Outputs:
  Vpc:
    Value: !Ref VPC
    Export:
      Name: 

※参考
https://qiita.com/hiyanger/items/3a47c39bddd8ccd99f64

関数

コードの記述をより便利にさせてくれます。主要な関数は RefSubGetAtt です。あとはImportValueくらいをおさせておけば良いです。

Ref

コードは前述の「テンプレートの基本構文 / 記載した実際のコード」を参照してください。!Ref VPCと記載があいります。ここれではOutput部にRefが記載されていますが、ここではエクスポートしたい情報をResourcesのVPCリから取得しています。

Sub

こちらもコードは前述のコードを参照してください。!Sub ${sysname}-vpcと記載があります。Refの情報に追加の文字列を追加したいときなどに使います。まずシステム名をParameterから取得し、その後に指定した文字列を追加しています。

GetAtt

Refでとれず、Subでもかけるけど、コードが長くなってしまうパターンなどを回避できる関数です。主にArnの利用などで使われます。下記の例ではサブスクリプションフィルタ自体に付与するネストされたIAMロールと、送信先の取得で使用しています。

cloudwatch.yaml
Resources:
  SubscriptionFileter01:
    Type: AWS::Logs::SubscriptionFilter
    Properties:
      DestinationArn: !GetAtt DeliveryStream01.Arn
      FilterPattern: ""
      LogGroupName: !Ref LogGroupName01
      RoleArn: !GetAtt SubscriptionFileterRole.Outputs.SubscriptionFileterRole

ImpolrtValue

クロススタックのときに使います。詳細はクロススタックの箇所で記述します。

※関数についてより詳細を学びたい方はこちら
https://qiita.com/hiyanger/items/e931b2e267e91e97084e

CLI(deployコマンド)

CloudFormationは一般にS3にテンプレートファイルをおいてスタックを流しますが、長期的な構築をするならこのCLIを利用しましょう。基本的にはdeployさえ使えればなんとかなります。--stacke-nameでスタック名を指定、--stacke-nameでテンプレートファイルを指定します。

aws cloudformation deploy --stack-name network-stack --template-file network.yaml

--parameter-overrides

テンプレート内で指定したparameterをコマンド内から読み込めるようにできます。ここではparameterを外出ししたファイルに統一して書いているので、一度ファイルをcatしてから読み込ませるという動作をさせています。コマンドにparameterを仕込むというのは汎用性的にあまりよろしくないと思うので、この記述を基本としてよいかと思います。

aws cloudformation deploy --stack-name network-stack --template-file network.yaml --parameter-overrides $(cat parameters.yaml)

なおparameterファイルは以下のような記述で記載します。

parameter.yaml
sysname=XXX
password=XXX
BucketNameXxx=XXX
TemplateXXX=https://XXXX
email=XXX@gmail.com
...

--capabilities CAPABILITY_NAMED_IAM

IAM関連のresourcesをデプロイするときはこのオプションをつけましょう。おまじないみたいに考えてもらえればよいです。

aws cloudformation deploy --stack-name iam-stack --template-file iam.yaml --parameter-overrides $(cat parameters.yaml) --capabilities CAPABILITY_NAMED_IAM

--no-execute-changeset(オプション)

deployに関しては変更の確認なしにデプロイされてしまうので注意です。デプロイは行わず、変更を確認したいときはこのオプションをつけましょう。

aws cloudformation deploy --stack-name test-stack --template-file template.yaml --parameter-overrides $(cat parameter.yaml) --no-execute-changeset

前チャプターでCloudformationの難点として紹介しましたが、失敗したスタックに対して再デプロイするときは、一度スタックを削除しなければならないということです。削除のスタックに対する再デプロイはGUIから実行してからdeployコマンドを流しましょう。

※その他コマンドを知りたい方はこちらへ
https://qiita.com/hiyanger/items/245d96312248017701b0