- クラウド技術
【AWS】CloudFormationをご紹介!
- #AWS
CloudFormationとは
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
Json、Yaml形式で作成されたインフラ構成を読んで自動にAWSインフラを管理(作成、変更、削除)してくれるAWSの管理ツールです。
※この記事はYaml形式で作成されています。
CloudFormation テンプレート構成
全体テンプレート形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
--- 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テンプレートを作成する時パラメータはよく使うので紹介します。
1 2 3 4 |
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
例:
1 2 3 4 5 6 7 |
EC2Instance: Type: "AWS::EC2::Instance" ... MyEIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref EC2Instance |
Fn::GetAtt
テンプレートのリソースから属性の値を返します。
リソースの属性はリソースによって違うので注意してください。
完全名関数の構文: Fn::GetAtt:
短縮形の構文: !GetAtt
!GetAtt logicalNameOfResource.attributeName
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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”の場合
1 2 3 4 5 6 |
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 ] ]
例:
1 2 3 4 5 6 7 |
!Join - ',' - - 'A' - 'B' - 'C' # "A:B:C" |
Fn::ImportValue
別のスタックによってエクスポートされた出力の値を返します。
完全名関数の構文: Fn::ImportValue:
短縮形の構文: !ImportValue
!ImportValue sharedValueToImport
例:
Export
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 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
1 2 3 4 5 6 7 |
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スタックを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 |
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を利用して他のスタックから呼び出すのができます。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>