手を動かしながら2週間で学ぶ AWS 基本から応用まで Day14

Day14 CloudFormationを用いた環境構築の自動化

CloudFormationについて

Infrastructure as Code

  • テンプレート
    AWSリソースの構成をYAML or JSONで記載したドキュメント

  • スタック
    テンプレートから自動構築されたAWSリソースの集合

1. シンプルなテンプレートでVPCを作る

一般的なテンプレートスニペット - AWS CloudFormation

template.yml

AWSTemplateFormatVersion: '2010-09-09'
Description: Test cfn Template
AWSTemplateFormatVersion: '2010-09-09'
Description: Test cfn Template

Resources:
  cfnVpc:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '192.168.0.0/16'
      Tags:
        - Key: 'Name'
          Value: 'cfn-vpc'

CloudFormation→新しいスタックの作成
作成したテンプレートファイルをアップロード
作成

2. Ref関数を使ってSubnetを作る

サブネットで作成したVPCを参照するようにする

AWSTemplateFormatVersion: '2010-09-09'
Description: Test cfn Template

Resources:
  cfnVpc:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '192.168.0.0/16'
      Tags:
        - Key: 'Name'
          Value: 'cfn-vpc'
  cfnSubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      CidrBlock: '192.168.1.0/24'
      MapPublicIpOnLaunch: true
      Tags:
        - Key: 'Name'
          Value: 'cfn-subnet'
      VpcId: !Ref cfnVpc

スタック→アクション→スタックの更新

3. EC2インスタンスの雛形を作成する

EC2のパラメータを作成

Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium
    Description: Select EC2 instance type.

    InstanceType: !Ref InstanceType

EC2にキーペアを入れる

  KeyPair:
    Description: Select KeyPair Name.
    Type: AWS::EC2::KeyPair::KeyName

Resources:
  cfnEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      KeyName: !Ref KeyPair

リージョンによってAMIを選択する

Mappings:
  RegionMap:
    us-east-1:
      hvm: "ami-a4c7edb2"
    ap-northeast-1:
      hvm: "ami-3bd3c45c"

Resources:
  cfnEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", hvm ]

CloudFormationベストプラクティス

  1. 組み込み関数を使って環境に依存しないテンプレートを目指す
    FindInMapなどの組み込み関数を使用してリージョンやアカウントによる変化に対応できるようなテンプレートを作成する。

  2. リソースの追加・変更は必ずCloudFormationで行う
    手動で追加・削除されるとテンプレートと環境の整合性が取れなくなる。

  3. テンプレートをバージョン管理する
    テンプレートを変更した際に、古いバージョンに戻すことでロールバックできる
  4. システムの規模やライフサイクルによってテンプレートを分割する
    VPCやEC2などの変更が多いものと、変更が少ないものなどで使い分ける