#
ドキュメント

Document

自分のための備忘録です。

CloudFormation

  • Infrastructure as Codeを実現
  • プロビジョニングツール

参考ドキュメント

CloudFormationの概要を把握する資料。

Coudformation テンプレート

CloudFormation はテンプレートをアップロードしてスタックを作成します。   CloudFormation テンプレートの詳細は以下を参照してください。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html

ルート定義済みプロパティ

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html

AWSTemplateFormatVersion: "version date"

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs

論理ID

プロパティタイプ、リソースタイプともに 論理ID はテンプレート内で重複できません(逆に言えばテンプレートが異なれば 論理ID は重複することができます)。

論理ID の例)

Resources:
  Logical ID of resource:
    Type: Resource type
    Properties:
      Set of properties

Resources

プロパティタイプ

AWS resource and property types reference

このセクションには、AWS CloudFormation でサポートされているすべての AWS リソースタイプおよびプロパティタイプのリファレンス情報が含まれています。 リソースタイプ識別子は、常に次の形式です。

service-provider::service-name::data-type-name

ref. https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html

プロパティタイプの例

Parameters:
  # ...
  Foo:
    Description: Foo description
    Type: String
    Default: foo
  • Parameters プロパティに String プロパティタイプとして Foo を定義
  • Foo は任意の文字列
  • String プロパティタイプは AWS の定義済みプロパティタイプ

リソースタイプ

リソースタイプの例 1

Resources:
  # ...
  ArtifactStoreBucket:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled
  • Resources プロパティに AWS::S3::Bucket リソースタイプとして、論理ID ArtifactStoreBucket を定義
  • 論理ID である ArtifactStoreBucket は任意の文字列(同一テンプレート内で重複不可)
  • リソースタイプ AWS::S3::BucketPropertiesVersioningConfiguration などが存在

リソースタイプの例 2

Resources:
  # ...
  DeployPipeline:
    Type: "AWS::CodePipeline::Pipeline"
    Properties:
      RoleArn: arn:aws:iam:{{アカウントID}}:role/{{CodePipelineServiceRole}}
      # ------------------------------------------------------------#
      # CodePipeline Stages
      # ------------------------------------------------------------#
      Stages:
        # ------------------------------------------------------------#
        # Category: Deploy
        # ------------------------------------------------------------#
        - Name: CFNSource
          Actions:
            -
              Name: CFNTemplateSourc
  • Resources論理IDDeployPipelineAWS::CodePipeline::Pipeline リソースタイプを定義
  • 論理ID(例では DeployPipeline ) は任意の文字列
  • AWS::CodePipeline::Pipeline リースタイプは Properties として RoleArnStages を持つ
    • RoleArn プロパティタイプは String
    • Stages プロパティタイプは StageDeclaration

リソースタイプリファレンス

AWS resource and property types reference

大きく以下セクションに分類されます。

  • Syntax
  • Properties
  • Return values
    • Ref
    • Fn::GetAtt

Return valuesRefFn::GetAttr によって返される値です。
詳しくは本ページで後述する RefFn::GetAttr を参照してください。

リソース属性リファレンス

  • リースタイプ( AWS::S3::BucketAWS::CodePipeline::Pipeline など)は Properties を持ちます
  • 各リソースで定義されている Properties に加えて共通して使用できるリソース属性を追加できます(例: DependsOn 属性)

ref. リソース属性リファレンス

DependsOn リソース属性

依存関係は DependsOn で明示的に設定する他に !Ref および !GetAtt で暗黙的に設定される場合があります。

組み込み関数リファレンス

AWS CloudFormation には、スタックの管理に役立ついくつかの組み込み関数が用意されています。実行するまでわからない値をプロパティに代入するには、テンプレートで組み込み関数を使用します。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

intrinsic:内在的

!Ref

The intrinsic function Ref returns the value of the specified parameter or resource.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html

参照 戻り値
parameter's logical name value
resource's logical name 物理IDphysical ID

In addition to the logical ID, certain resources also have a physical ID, which is the actual assigned name for that resource, such as an EC2 instance ID or an S3 bucket name. Use the physical IDs to identify resources outside of AWS CloudFormation templates, but only after the resources have been created.

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html

追記: !Ref にリソースの 論理ID を指定したときに返される値はドキュメントの Return Values セクションに記載されている。

Fn::GetAtt:

Fn::GetAtt 組み込み関数は、テンプレートのリソースから属性の値を返します。AWS::LanguageExtensions 変換 変換を使用するとき、組み込み関数を Fn::GetAtt のパラメーターとして使用できます。特定のリソースに対する GetAtt の戻り値の詳細については、「リソースとプロパティのリファレンス」でそのリソースのドキュメントを参照してください。

ref. AWS resource and property types reference

Fn::GetAtt: [ logicalNameOfResource, attributeName ]
# or
!GetAtt logicalNameOfResource.attributeName

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html

Fn::Sub

  • https://chariosan.com/2019/08/11/cfn_fnsub/
  • 実行時に、AWS CloudFormation が関連する値と置き換わる変数のある文字列。変数を ${MyVarName} として書き込みます。変数は、テンプレートパラメーター名、リソースの論理 ID、リソース属性、またはキー/値マップの変数です。テンプレートパラメーター名、リソースの論理 ID、およびリソース属性のみを指定する場合、キー/値マップを指定しないでください。

  • テンプレートパラメータ名、または ${InstanceTypeParameter} などのリソースの論理 ID を指定すると、AWS CloudFormation は Ref 組み込み関数を使用した場合と同じ値を返します。

  • https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html

マップ使用例
Parameters:
  RootDomainName:
    type: String
    value: example.com
# ...
# ...
Name: !Sub
  - www.${Domain}
  - { Domain: !Ref RootDomainName }

この場合、Nameにはwww.example.com が入る。

別スタックのリソースを参照

インポート(参照) Fn::ImportValue
  • Fn::ImportValue: {{エクスポート名}}

{{エクスポート名}}はエクスポートのOutpus.Export.Nameの値。

ref. https://www.youtube.com/watch?v=cILN6ycz0TE

エクスポート

Outpus.Export.Name はリージョン内で一意になる必要があります。

The following restrictions apply to cross-stack references:

CodePipeline を Cloudformation で実行

Cloudformation ECS

AWSのECSのExecutionRoleArnとTaskRoleArnの違いがわからない

  • ExecutionRoleArnECSが持つべきロール
  • TaskRoleArn:タスクが持つべきロール
    • タスクでCloudWatchへのログを出力していればCloudWatchのポリシーが必要

CLI

スタックを作成

aws cloudformation create-stack \
    --stack-name foo \
    --template-body file//($pwd)/template.yml \
    --capabilities CAPABILITY_NAMED_IAM \
    --profile foo

ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-creating-stack.html

変更セットを作成

  • 変更セットを作成する(スタックを更新しない)
  • 後述するupdate-stackは直接スタックを更新(実装)する
aws cloudformation create-change-set \
    --stack-name foo \
    --template-body file//($pwd)/template.yml \
    --change-set-name FooChangeSet \
    --capabilities CAPABILITY_NAMED_IAM \
    --profile foo

ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets-create.html

マネジメントコンソールでは既存スタックの変更セットを作成を実行する。

マネジメントコンソール

(直接)スタックを更新

  • 直接スタックを更新する
  • 変更セットのみ作成する場合は上述のcreate-change-setを使用する
aws cloudformation update-stack \
    --stack-name foo \
    --template-body file//($pwd)/template.yml \
    --change-set-name FooChangeSet \
    --capabilities CAPABILITY_NAMED_IAM \
    --profile foo

ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html

マネジメントコンソールからは↑の画像の更新を実行する。

テンプレートをチェック

$ aws cloudformation validate-template --template-body file:///path/to/template.yml --profile foo

変更セットを取得

$ aws cloudformation describe-change-set --change-set-name {{変更セットID}} --profile foo

スタックの状態

リソース名を省略した場合

ほとんどのリソースはCloudFormationによって以下の規則で命名される。

スタック名-論理ID-ランダムな文字列

チェックポイント

  • ほとんどの問題はアクセス権

トラブルシューティング

ROLLBACK_COMPLETE state and can not be updated
スタックの情報とリストの取得

CloudFormation スタックが UPDATE_ROLLBACK_FAILED 状態のままになっている場合に、このスタックを更新するにはどうすればよいですか?

公式ドキュメント

Intrinsic 固有の、本質的な

参考記事