Infrastructure as Code
を実現CloudFormation
の概要を把握する資料。
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
の例)
Resources:
Logical ID of resource:
Type: Resource type
Properties:
Set of properties
AWS resource and property types reference
このセクションには、AWS CloudFormation でサポートされているすべての AWS リソースタイプおよびプロパティタイプのリファレンス情報が含まれています。 リソースタイプ識別子は、常に次の形式です。
service-provider::service-name::data-type-name
Parameters:
# ...
Foo:
Description: Foo description
Type: String
Default: foo
Parameters
プロパティに String
プロパティタイプとして Foo
を定義Foo
は任意の文字列String
プロパティタイプは AWS の定義済みプロパティタイプResources:
# ...
ArtifactStoreBucket:
Type: AWS::S3::Bucket
Properties:
VersioningConfiguration:
Status: Enabled
Resources
プロパティに AWS::S3::Bucket リソースタイプとして、論理ID
ArtifactStoreBucket
を定義論理ID
である ArtifactStoreBucket
は任意の文字列(同一テンプレート内で重複不可)Properties
に VersioningConfiguration
などが存在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
に 論理ID
が DeployPipeline
の AWS::CodePipeline::Pipeline リソースタイプを定義論理ID
(例では DeployPipeline
) は任意の文字列AWS::CodePipeline::Pipeline
リースタイプは Properties
として RoleArn
や Stages
を持つRoleArn
プロパティタイプは String
Stages
プロパティタイプは StageDeclarationAWS resource and property types reference
大きく以下セクションに分類されます。
Syntax
Properties
Return values
Return values
は Ref
や Fn::GetAttr
によって返される値です。
詳しくは本ページで後述する Ref
、 Fn::GetAttr
を参照してください。
AWS::S3::Bucket
や AWS::CodePipeline::Pipeline
など)は Properties
を持ちますProperties
に加えて共通して使用できるリソース属性を追加できます(例: DependsOn
属性)ref. リソース属性リファレンス
依存関係は DependsOn
で明示的に設定する他に !Ref
および !GetAtt
で暗黙的に設定される場合があります。
AWS CloudFormation には、スタックの管理に役立ついくつかの組み込み関数が用意されています。実行するまでわからない値をプロパティに代入するには、テンプレートで組み込み関数を使用します。
intrinsic
:内在的
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 | 物理ID ( physical 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 組み込み関数は、テンプレートのリソースから属性の値を返します。AWS::LanguageExtensions 変換 変換を使用するとき、組み込み関数を Fn::GetAtt のパラメーターとして使用できます。特定のリソースに対する GetAtt の戻り値の詳細については、「リソースとプロパティのリファレンス」でそのリソースのドキュメントを参照してください。
ref. AWS resource and property types reference
Fn::GetAtt: [ logicalNameOfResource, attributeName ]
# or
!GetAtt logicalNameOfResource.attributeName
実行時に、AWS CloudFormation が関連する値と置き換わる変数のある文字列。変数を ${MyVarName} として書き込みます。変数は、テンプレートパラメーター名、リソースの論理 ID、リソース属性、またはキー/値マップの変数です。テンプレートパラメーター名、リソースの論理 ID、およびリソース属性のみを指定する場合、キー/値マップを指定しないでください。
テンプレートパラメータ名、または ${InstanceTypeParameter} などのリソースの論理 ID を指定すると、AWS CloudFormation は Ref 組み込み関数を使用した場合と同じ値を返します。
Parameters:
RootDomainName:
type: String
value: example.com
# ...
# ...
Name: !Sub
- www.${Domain}
- { Domain: !Ref RootDomainName }
この場合、Name
にはwww.example.com
が入る。
Fn::ImportValue: {{エクスポート名}}
{{エクスポート名}}
はエクスポートのOutpus.Export.Name
の値。
ref. https://www.youtube.com/watch?v=cILN6ycz0TE
Outpus.Export.Name
はリージョン内で一意になる必要があります。
The following restrictions apply to cross-stack references:
- For each AWS account, Export names must be unique within a region.
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
AWSのECSのExecutionRoleArnとTaskRoleArnの違いがわからない
ExecutionRoleArn
:ECS
が持つべきロールTaskRoleArn
:タスクが持つべきロールCloudWatch
へのログを出力していればCloudWatch
のポリシーが必要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
マネジメントコンソールでは既存スタックの変更セットを作成
を実行する。
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 状態のままになっている場合に、このスタックを更新するにはどうすればよいですか?
CloudFormation
のドキュメント)
CodePipeline
のドキュメント)Intrinsic 固有の、本質的な
!Ref
の使い所