「はじめてのCloudFormation」というテーマのビデオセッションでお話しました #devio2020

2020.06.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。大阪オフィスの林です。

本日2020年6月16日(火)より、弊社主催のオンラインイベントDevelopers.IO 2020 CONNECTが始まりました!合計7日間(6/16~7/7までの火曜日と金曜日)で約100本のセッションをお届する予定ですので、ぜひ様々なセッションをご視聴頂けますと幸いです!

本記事では私のビデオセッションをご紹介させて頂きます。

セッション動画

セッション動画の目次

下記のような流れでお話しさせて頂きました。
動画では「Infrastructure as a Code」という文言・名称で説明を進めてしまっていましたが、一般的には「Infrastructure as Code (Codeの前の「a」はなし)」と言ったり書いたりするようでした。動画の修正は追いついていないのでひとまずご了承頂ければと思います。

セッション動画のコンセプト

本セッション動画では、あまりテクニカルな内容になり過ぎず、どちらかというと初心者の方であったり、これからCloudFormationをお使いになる方に向けてお話をさせて頂きました。

セッション動画のサマリ

冒頭はCloudFormationをすごく簡単におさらいさせて頂きました。

続いて、CloudFormationをお使いになる前に少し立ち止まって考えて頂きたいことなんかをお話させて頂きました。

後半は、実際にコードの解説をしながら、AWSマネージメントコンソールとセットで「6つ」のデモを行わせて頂きました。

デモの後半は、私自身が過去経験した、初心者の方が遭遇しやすいエラーを「4個」お伝えさせて頂きました。 

最後に、Infrastructure as Codeに対して私自身が考えていることをサクッとお伝えさせて頂きました。

まとめ

CloudFormationやInfrastructure as Codeに対して、改めて向き合う機会になって自分自身大変勉強になったというのが、今の実感です。
本セッションの動画がこれからCloudFormationをお使いになる方の参考になったり、既にお使いの方にも参考になって頂けると幸いです。

以上、大阪オフィスの林がお送りしました!

参考

デモの中で使用したコードです。

VPCとサブネットを作成したコード

AWSTemplateFormatVersion: '2010-09-09'
Description: "Create BaseNetwork"
Resources:
# ------------------------------------------------------------#
#  VPC
# ------------------------------------------------------------#
  MyVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: Sample-prd-vpc
# ------------------------------------------------------------#
#  Subnet
# ------------------------------------------------------------#
  MySubnet01:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.0.0/24
      Tags:
        - Key: Name
          Value: Sample-prd-subnet01
  MySubnet02:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: ap-northeast-1c
      CidrBlock: 10.0.1.0/24
      Tags:
        - Key: Name
          Value: Sample-prd-subnet02
# ------------------------------------------------------------#
# Output
# ------------------------------------------------------------#
Outputs:
  MyVPC:
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-MyVPC"
  MySubnet01:
    Value: !Ref MySubnet01
    Export:
      Name: !Sub "${AWS::StackName}-MySubnet01"
  MySubnet02:
    Value: !Ref MySubnet02
    Export:
      Name: !Sub "${AWS::StackName}-MySubnet02"

インプットパラメータを使ったコード

AWSTemplateFormatVersion: '2010-09-09'
Description: "Create BaseNetwork"
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Parameters:
          - SystemName
          - EnvType
Parameters:
  SystemName:
    Description: Please type the SystemName.
    Type: String
    Default: Sample
  EnvType:
    Description: Select Environment Type.
    Type: String
    Default: prd
    AllowedValues:
      - stg
      - prd
  CidrBlock:
    Description: Please type the CidrBlock.
    Type: String
    Default: 10.0.0.0/16
Resources:
# ------------------------------------------------------------#
#  VPC
# ------------------------------------------------------------#
  MyVPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: !Sub ${CidrBlock}
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-vpc
# ------------------------------------------------------------#
#  Subnet
# ------------------------------------------------------------#
  MySubnet01:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: !Select [ 0, !Cidr [ !GetAtt MyVPC.CidrBlock, 1, 8 ]]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-subnet01
  MySubnet02:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref MyVPC
      AvailabilityZone: ap-northeast-1c
      CidrBlock: !Select [ 1, !Cidr [ !GetAtt MyVPC.CidrBlock, 2, 8 ]]
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-subnet02
# ------------------------------------------------------------#
# Output
# ------------------------------------------------------------#
Outputs:
  MyVPC:
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-MyVPC"
  MySubnet01:
    Value: !Ref MySubnet01
    Export:
      Name: !Sub "${AWS::StackName}-MySubnet01"
  MySubnet02:
    Value: !Ref MySubnet02
    Export:
      Name: !Sub "${AWS::StackName}-MySubnet02"

EC2を作ったコード

AWSTemplateFormatVersion: '2010-09-09'
Description: "Create EC2"
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Parameters:
          - SystemName
          - EnvType
          - ImageID
          - EC2KeyPair
          - BaseNetworkStackName
Parameters:
  SystemName:
    Description: Please type the SystemName.
    Type: String
    Default: Sample
  EnvType:
    Description: Please Select Environment Type.
    Type: String
    Default: prd
    AllowedValues:
      - stg
      - prd
  ImageID:
    Description: Please type the EC2 image ID.
    Type: String
    Default: ami-0a1c2ec61571737db # Amazon Linux 2 AMI
  EC2KeyPair:
    Description: Please Select EC2 key name.
    Type: AWS::EC2::KeyPair::KeyName
  BaseNetworkStackName:
    Description: Please type the BaseNetwork stack name.
    Type: String
    Default: Mynetwork1
Resources:
# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------#
  MyEC2:
    Type: "AWS::EC2::Instance"
    Properties:
      AvailabilityZone: ap-northeast-1a
      ImageId: !Sub ${ImageID}
      InstanceType: m4.large
      KeyName: !Sub ${EC2KeyPair}
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp2
            VolumeSize: 20
      SubnetId: { "Fn::ImportValue": !Join [ "-", [ "Ref":"BaseNetworkStackName","MySubnet01"]] }
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-ec2

作ったEC2を更新したコード

AWSTemplateFormatVersion: '2010-09-09'
Description: "Create EC2"
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Parameters:
          - SystemName
          - EnvType
          - ImageID
          - EC2KeyPair
          - BaseNetworkStackName
Parameters:
  SystemName:
    Description: Please type the SystemName.
    Type: String
    Default: Sample
  EnvType:
    Description: Please Select Environment Type.
    Type: String
    Default: prd
    AllowedValues:
      - stg
      - prd
  ImageID:
    Description: Please type the EC2 image ID.
    Type: String
    Default: ami-0a1c2ec61571737db # Amazon Linux 2 AMI
  EC2KeyPair:
    Description: Please Select EC2 key name.
    Type: AWS::EC2::KeyPair::KeyName
  BaseNetworkStackName:
    Description: Please type the BaseNetwork stack name.
    Type: String
    Default: Mynetwork
Resources:
# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------#
  MyEC2:
    Type: "AWS::EC2::Instance"
    Properties:
      AvailabilityZone: ap-northeast-1a
      ImageId: !Sub ${ImageID}
      InstanceType: m4.large
      KeyName: !Sub ${EC2KeyPair}
      DisableApiTermination: true
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp2
            VolumeSize: 20
      SubnetId: { "Fn::ImportValue": !Join [ "-", [ "Ref":"BaseNetworkStackName","MySubnet01"]] }
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvType}-ec2