AWS CloudFormation テンプレート作成ガイド

インフラストラクチャをコードとして管理する方法

AWS CloudFormation とは?

AWS CloudFormation は、AWSリソースをコードとして定義し、一貫した方法でプロビジョニングするためのサービスです。JSON または YAML 形式のテンプレートファイルを作成することで、インフラストラクチャ全体を自動的にデプロイ、更新、削除できます。

メリット: コード化されたインフラ(IaC)により、リソース作成の自動化、再現性の向上、バージョン管理が可能になります。

CloudFormation テンプレートの基本構造

テンプレート構造(YAML形式)

# テンプレートのフォーマットバージョン(必須) AWSTemplateFormatVersion : "2010-09-09" # テンプレートの説明(オプション) Description : "シンプルなEC2インスタンスを作成するテンプレート" # メタデータ(オプション) Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Parameters : - "InstanceType" # パラメータ(オプション) Parameters : InstanceType : Type : "String" Default : "t2.micro" Description : "EC2インスタンスタイプ" # マッピング(オプション) Mappings : RegionMap : ap-northeast-1 : AMI : "ami-0ab0bbbd329f565e6" # 条件(オプション) Conditions : CreateProdResources : !Equals [!Ref "Environment", "prod"] # リソース(必須) Resources : MyEC2Instance : Type : "AWS::EC2::Instance" Properties : InstanceType : !Ref "InstanceType" ImageId : !FindInMap [RegionMap, !Ref "AWS::Region", AMI] # 出力(オプション) Outputs : InstanceId : Description : "EC2インスタンスID" Value : !Ref "MyEC2Instance"

セクションの説明

  • AWSTemplateFormatVersion: テンプレートの形式バージョン(現在は "2010-09-09" のみ)
  • Description: テンプレートの説明文
  • Metadata: テンプレートに関する追加情報
  • Parameters: スタック作成時に指定可能なパラメータ
  • Mappings: キーと値のマッピングテーブル
  • Conditions: 条件付きでリソースを作成するための条件式
  • Resources: 作成するAWSリソースの定義(必須)
  • Outputs: スタック作成後に参照できる出力値
重要: テンプレートでは Resources セクションのみが必須で、他はオプションです。YAMLまたはJSON形式で記述できますが、YAMLの方が読みやすく推奨されています。

テンプレート作成の手順

1

要件の定義

作成したいインフラストラクチャの要件を明確にします。必要なリソース、依存関係、パラメータを特定します。

2

構造の設計

テンプレートの基本構造を設計します。必要なセクション(リソース、パラメータなど)を決めます。

3

リソースの定義

必要なAWSリソースを定義します。各リソースのプロパティと設定を指定します。

4

パラメータの追加

テンプレートを再利用可能にするためのパラメータを追加します。デフォルト値や制約を設定します。

5

出力の定義

参照用の出力値を定義します。これらは他のスタックで使用したり、情報表示に利用できます。

6

テストと検証

AWS CloudFormation コンソールやCLIでテンプレートを検証し、エラーがないことを確認します。

代表的なパラメータと属性

パラメータの型

パラメータ型 説明
String 文字列値 インスタンス名、キー名など
Number 整数または小数 ポート番号、容量サイズなど
AWS::EC2::VPC::Id 既存のVPC ID vpc-0123456789abcdef0
AWS::EC2::Subnet::Id 既存のサブネットID subnet-0123456789abcdef0
CommaDelimitedList カンマ区切りの値リスト test1,test2,test3
List 数値のリスト [80, 443, 8080]

パラメータの属性

属性 説明
Default パラメータのデフォルト値 t2.micro
AllowedValues 許可される値のリスト [t2.micro, t2.small, t2.medium]
AllowedPattern 正規表現パターン ^[a-zA-Z0-9]*$
MinLength/MaxLength 文字列の長さ制限 MinLength: 1, MaxLength: 255
MinValue/MaxValue 数値の範囲制限 MinValue: 1, MaxValue: 65535
NoEcho パラメータ値を隠す(パスワードなど) true

組み込み関数

Ref

!Ref

パラメータやリソースを参照

Get

!GetAtt

リソースの属性を取得

Join

!Join

値を連結

Sub

!Sub

文字列内の変数を置換

Map

!FindInMap

マッピングから値を検索

If

!If

条件に基づいて値を選択

関数の使用例

# パラメータの参照 InstanceType : !Ref "InstanceTypeParameter" # リソースの属性取得 PublicIP : !GetAtt "MyEC2Instance.PublicIp" # 文字列の連結 BucketName : !Join ["-", ["my-bucket", !Ref "AWS::AccountId"]] # 変数置換 Endpoint : !Sub "https://${ApiGateway}.execute-api.${AWS::Region}.amazonaws.com/prod/" # マッピングの検索 AMI : !FindInMap [RegionMap, !Ref "AWS::Region", AMI] # 条件分岐 EnvironmentType : !If [IsProd, "production", "development"]

代表的なリソースタイプ

コンピューティング

  • AWS::EC2::Instance - EC2インスタンス
  • AWS::AutoScaling::AutoScalingGroup - Auto Scalingグループ
  • AWS::ECS::Cluster - ECSクラスター
  • AWS::Lambda::Function - Lambda関数

ストレージ

  • AWS::S3::Bucket - S3バケット
  • AWS::RDS::DBInstance - RDSデータベース
  • AWS::DynamoDB::Table - DynamoDBテーブル
  • AWS::EFS::FileSystem - EFSファイルシステム

ネットワーキング

  • AWS::EC2::VPC - 仮想プライベートクラウド
  • AWS::EC2::Subnet - サブネット
  • AWS::EC2::SecurityGroup - セキュリティグループ
  • AWS::ElasticLoadBalancing::LoadBalancer - ロードバランサー
  • AWS::Route53::RecordSet - DNS レコード

セキュリティ

  • AWS::IAM::Role - IAMロール
  • AWS::IAM::Policy - IAMポリシー
  • AWS::KMS::Key - KMS暗号化キー

実践的なテンプレート例

基本的なWebサーバー構成

AWSTemplateFormatVersion : "2010-09-09" Description : "基本的なWebサーバー構成" Parameters : InstanceType : Type : "String" Default : "t2.micro" AllowedValues : - "t2.micro" - "t2.small" - "t2.medium" Description : "EC2インスタンスタイプ" KeyName : Type : "AWS::EC2::KeyPair::KeyName" Description : "EC2インスタンスへのSSHアクセス用のキーペア名" Resources : WebServerSecurityGroup : Type : "AWS::EC2::SecurityGroup" Properties : GroupDescription : "Webサーバー用セキュリティグループ" SecurityGroupIngress : - IpProtocol : "tcp" FromPort : 80 ToPort : 80 CidrIp : "0.0.0.0/0" - IpProtocol : "tcp" FromPort : 22 ToPort : 22 CidrIp : "0.0.0.0/0" WebServer : Type : "AWS::EC2::Instance" Properties : InstanceType : !Ref "InstanceType" SecurityGroups : - !Ref "WebServerSecurityGroup" KeyName : !Ref "KeyName" ImageId : "ami-0ab0bbbd329f565e6" # Amazon Linux 2 in Tokyo region UserData : Fn::Base64 : !Sub | #!/bin/bash -xe yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<html><body><h1>CloudFormation で作成されたウェブサーバーへようこそ!</h1></body></html>" > /var/www/html/index.html

Created by SSuzuki1063

AWS SAP Learning Resources