コンテンツにスキップ

CloudFormation テンプレート

CloudFormation テンプレートで、何をどこへ書けば要件を満たせるかを整理するページ。

まず押さえたいテンプレート構造

  • Parameters: 環境ごとに変えたい値を書く
  • Resources: 実際に作る AWS リソースを書く
  • Outputs: 作成後に参照したい値を書く

基本形

AWSTemplateFormatVersion: "2010-09-09"
Description: Sample template

Parameters:
  ProjectName:
    Type: String

Resources:
  SampleResource:
    Type: AWS::Service::Resource
    Properties: {}

Outputs:
  SampleOutput:
    Value: !Ref SampleResource

サービスごとにどこを書くか

  • VPC ResourcesAWS::EC2::VPCAWS::EC2::Subnet
  • Security Group ResourcesAWS::EC2::SecurityGroup
  • EC2 ResourcesAWS::EC2::Instance ParametersInstanceTypeImageId を置くと流用しやすい
  • S3 ResourcesAWS::S3::Bucket バージョニングや暗号化は Properties に書く
  • IAM Role ResourcesAWS::IAM::Role 信頼ポリシーは AssumeRolePolicyDocument に書く

VPC を作りたいとき

Resources:
  MainVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16

  PublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MainVpc
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: ap-northeast-1a

見るポイント:

  • TypeAWS::EC2::VPC
  • Subnet が VPC を !Ref しているか

Security Group を作りたいとき

Resources:
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP and HTTPS
      VpcId: !Ref MainVpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0

見るポイント:

  • VpcId を忘れない
  • Ingress は SecurityGroupIngress に書く

EC2 を作りたいとき

Parameters:
  ImageId:
    Type: String
  InstanceType:
    Type: String
    Default: t3.micro

Resources:
  WebInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      SubnetId: !Ref PublicSubnetA
      SecurityGroupIds:
        - !Ref WebSecurityGroup

見るポイント:

  • ImageIdInstanceTypeParameters 化すると使い回しやすい
  • Subnet と Security Group を参照できているか

S3 を作りたいとき

Resources:
  LogsBucket:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled

見るポイント:

  • バケット本体は AWS::S3::Bucket
  • バージョニング、暗号化、ライフサイクルは Properties に追加する

IAM Role を作りたいとき

Resources:
  Ec2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole

見るポイント:

  • AssumeRolePolicyDocument が信頼ポリシー
  • 何に assume させるかを Principal に書く

Outputs でよく返すもの

Outputs:
  VpcId:
    Value: !Ref MainVpc

  PublicSubnetId:
    Value: !Ref PublicSubnetA

  InstanceId:
    Value: !Ref WebInstance

  BucketName:
    Value: !Ref LogsBucket

どう育てるか

  • Parameters で最小限の差分だけ受ける
  • まずは単体リソースの基本形を作る
  • 使うたびに Outputs やタグを整える

まず揃えたい雛形

  • VPC と Subnet の最小構成
  • EC2 と Security Group
  • 暗号化付き S3
  • IAM Role と AssumeRolePolicy

公式ドキュメント

メモ

  • 実際のテンプレートは、使ったものから順に育てる方針でよい
  • CloudFormation は YAML が長くなりやすいので、まずは短い雛形から残したい
  • 個別サービスの要件は、まず TypeProperties のどこを見るかが分かればかなり追いやすくなる