【AWS】CloudFormationをご紹介!

CloudFormationとは

Json、Yaml形式で作成されたインフラ構成を読んで自動にAWSインフラを管理(作成、変更、削除)してくれるAWSの管理ツールです。
※この記事はYaml形式で作成されています。

CloudFormation テンプレート構成

全体テンプレート形式

---
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
...

 

AWSTemplateFormatVersion
テンプレートの機能を識別する日付形式の文字です。2022年01月現在"2010-09-09"が唯一なバージョンです。値を指定しない場合は最新のテンプレートの形式バージョンを使用します。

Description
テンプレートに関する説明とかコメントを含めることができます。
・最大1024 バイトのリテラル文字列

Metadata
テンプレートの詳細を提供するオブジェクトを含めることができます。

Parameters
テンプレートに使うパラメータを設定することが可能です。

Rules
パラメータ値を検証します。パラメーター値が無効になっている場合、AWS CloudFormation はスタックを作成または更新しません

Mappings
Key、Value構造でデータを設定できます。ValueはString または List タイプです。パラメーター、擬似パラメーターまたは組み込み関数を含めることはできません。

Conditions
パラメータをチェックしてリソース作成の条件設定が可能です。スタックの更新時に、Conditionsを単独で更新することはできません。Conditionsを更新できるのは、リソースを追加、変更、または削除する変更を含める場合だけです。

Transform
テンプレートを処理するために使用するマクロを 1 つ以上指定します。

Resources(必須)
スタックに含める AWS リソースを宣言します。

Outputs
スタックで作成した値をExportして他のスタックからImportして使うことができます。

パラメータ

CloudFormationテンプレートを作成する時パラメータはよく使うので紹介します。

Parameters:
ParameterLogicalID:
Type: DataType
ParameterProperty: value

 

ParameterLogicalID
パラメータを呼び出す時に使うID(名前)
Description
パラメータに対する説明・最大 4000 文字

Type
パラメーターのデータ型

  • String
    リテラル文字列

  • Number
    整数または浮動小数点値
    Refで使う時には文字列になります。

  • List<Number>
    整数または浮動小数点値の配列
    100,200にするとRefでは[“100“,”200”]になります。

  • CommaDelimitedList
    リテラル文字列の配列
    各メンバー文字列の前後の空白は削除されます。
    白,賢一は[“白“,”賢一”]になります。

  • AWS 固有のパラメーター型
    AWSから事前にされているパラメータ
    Amazon EC2 キーペアの名前や VPC の ID などの AWS の値です。

  • SSM パラメータータイプ
    Systems Manager パラメーターストア内の既存のパラメーターに対応するパラメーター

Default
パラメータの基本値

MaxLength
String 型に使用できる最大文字数を決定する整数値

MinLength
String 型に使用できる最小文字数を決定する整数値

MaxValue
Number 型に使用できる数値の最大値を決定する数値

MinValue
Number 型に使用できる数値の最小値を決定する数値

NoEcho
パラメータ値をマスクして、コンソール、コマンドラインツール、または API に表示されないようにする

AllowedPattern
String 型に使用できるパターンを表す正規表現

AllowedValues
パラメーターに許容される一連の値を含む配列

ConstraintDescription
制約が違反された場合に、制約について説明する文字列

よく使う組み込み関数

Ref
指定したパラメータまたはリソースの値を返します。
リソースの値はリソースによって違うので注意してください。

完全名関数の構文: Ref:

短縮形の構文: !Ref

!Ref logicalName

例:

EC2Instance:
Type: "AWS::EC2::Instance"
...
MyEIP:
Type: "AWS::EC2::EIP"
Properties:
InstanceId: !Ref EC2Instance

 

Fn::GetAtt
テンプレートのリソースから属性の値を返します。
リソースの属性はリソースによって違うので注意してください。

完全名関数の構文: Fn::GetAtt:

短縮形の構文: !GetAtt

!GetAtt logicalNameOfResource.attributeName

例:

AWSTemplateFormatVersion: 2010-09-09
Resources:
myELB:
Type: AWS::ElasticLoadBalancing::LoadBalancer
 ...

myELBIngressGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: ELB ingress group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
SourceSecurityGroupOwnerId: !GetAtt myELB.SourceSecurityGroup.OwnerAlias
SourceSecurityGroupName: !GetAtt myELB.SourceSecurityGroup.GroupName

# AWS::ElasticLoadBalancing::LoadBalancerの属性は下記となります。
# CanonicalHostedZoneName
# CanonicalHostedZoneNameID
# DNSName
# SourceSecurityGroup.GroupName
# SourceSecurityGroup.OwnerAlias


Fn::Sub
文字列にパラメータなどの変数を代入します。

完全名関数の構文: Fn::Sub:

短縮形の構文: !Sub

!Sub
– String
– Var1name: Var1Value
– Var2name: Var2Value

例:LastName=”Baik” FirstName=”Hyunil”の場合

myName:
Name: !Sub
- "My Name is ${Last}" # My Name is Baik
- { Last: !Ref LastName }
myFullName:
Name: !Sub "My Name is ${LastName} ${FirstName}" # My Name is Baik Hyunil

 

Fn::Join
一連の値を特定の区切り文字で区切って 1 つの値に結合します。

完全名関数の構文: Fn::Join:

短縮形の構文: !Join

!Join [ delimiter, [ comma-delimited list of values ] ]

例:

!Join
- ','
- - 'A'
- 'B'
- 'C'

# "A:B:C"


Fn::ImportValue
別のスタックによってエクスポートされた出力の値を返します。

完全名関数の構文: Fn::ImportValue:

短縮形の構文: !ImportValue

!ImportValue sharedValueToImport

例:
Export

# StackName : ExportCF
Resources:
ECRRepository:
Type: "AWS::ECR::Repository"
Properties:
RepositoryName: !Sub "${AWS::StackName}-ecr-repository"
Outputs:
ECRRepositoryUri:
Description: ECRUri
Value: !GetAtt ECRRepository.RepositoryUri
Export:
Name:
'Fn::Sub': '${AWS::StackName}-ECRUri'

 

Import

ECSTaskDefinition:
Type: "AWS::ECS::TaskDefinition"
Properties:
Image: Fn::Sub:
- "${ECRUri}${Version}"
- { ECRUri: !ImportValue "ExportCF-ECRUri" }
- { Version: ":last" }

 

他のスタックのパラメータを利用する方法(Outputs)

もう作ったスタックのリソースを利用する方法です。
上の「よく使う組み込み関数」で「Fn::ImportValue」を紹介していますが
もっと詳しく説明します。

ExportCFでECRを作ってこの後ImportCFからECSとかでECRにあるイメージを呼び出すと仮定してみます。
先ずはExportCFスタックを実行します。

Resources:
ECRRepository:
Type: "AWS::ECR::Repository"
Properties:
RepositoryName: !Sub "${AWS::StackName}-ecr-repository"
Outputs:
ECRRepositoryUri:
Description: ECRUri
Value: !GetAtt ECRRepository.RepositoryUri
Export:
Name:
'Fn::Sub': '${AWS::StackName}-ECRUri'

 

ResourcesにあるECRRepositoryが作られます。
作成されたECRRepositoryのRepositoryUriをOutputsにあるECRRepositoryUriに保存されます。
保存された、RepositoryUriはExportに設定しているNameを利用して他のスタックから呼び出すのができます。

スタック名がcf-initの場合

Smallitのサービス