AWS Cloudformation やってみた②

前回のブログでは、AWS Cloudformationやってみた では、EC2に1台Webサーバー構築とS3に静的サイト構築をやりました。

今回のブログでは、VPC.yamlとEC2.yamlを分割して実行してみることにした。

また、円滑に実行できるようにAWS CLIを導入した。

AWS CLIのインストール方法

brewコマンドを使ってAWS CLIをインストールする。

$ brew install awscli

AWS CLIのバージョンが確認できれば、インストール完了です。

$ aws --version
aws-cli/2.1.30 Python/3.9.2 Darwin/20.3.0 source/x86_64 prompt/off
AWS CLIの初期設定

続いて初期設定を行います。
AWSのセキュリティ認証情報ページにアクセスし、アクセスキーを作成しておきます。

以下コマンドでAWS CLIの初期設定を行います。

$ aws configure
AWS Access Key ID [None]: アクセスキー ID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: 

※ 補足
・ Default region name
国内で使用するのであればap-northeast-1(アジアパシフィック (東京))で問題ありませんが、他のリージョンを指定可能です。
リージョン一覧
・ Default output format
指定しない場合デフォルトでjson形式となりますが、その他にもtextやtableが指定できます。
出力形式一覧
ここでは、AWS CLIの導入内容について省略する。

VPC.yamlについて

YAML
AWSTemplateFormatVersion: 2010-09-09
Description: Hands-on template for VPC
Resources:
#------------------------------------------------------
#  VPC
#------------------------------------------------------
  CFnVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: handson-cfn

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet1

  PublicSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 1, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: PublicSubnet2

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.2.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      Tags:
        - Key: Name
          Value: PrivateSubnet1

  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.3.0/24
      VpcId: !Ref CFnVPC
      AvailabilityZone: !Select [ 1, !GetAZs ]
      Tags:
        - Key: Name
          Value: PrivateSubnet2
#------------------------------------------------------
#  インターネットゲートウェイ
#------------------------------------------------------
  CFnVPCIGW:
    Type: AWS::EC2::InternetGateway
    Properties: 
      Tags:
        - Key: Name
          Value: handson-cfn

  CFnVPCIGWAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      InternetGatewayId: !Ref CFnVPCIGW
      VpcId: !Ref CFnVPC
#------------------------------------------------------
#  ルートテーブルをパブリックサブネットにアタッチ
#------------------------------------------------------

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref CFnVPC
      Tags:
        - Key: Name
          Value: Public Route

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: CFnVPCIGW
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref CFnVPCIGW

  PublicSubnet1Association:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1
      RouteTableId: !Ref PublicRouteTable

  PublicSubnet2Association:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet2
      RouteTableId: !Ref PublicRouteTable
#------------------------------------------------------
#  Outputsセクション
#------------------------------------------------------
Outputs:
  VPCID:
    Description: VPC ID
    Value: !Ref CFnVPC
    Export:
      Name: !Sub ${AWS::StackName}-VPCID

  PublicSubnet1:
    Description: PublicSubnet1
    Value: !Ref PublicSubnet1
    Export:
      Name: !Sub ${AWS::StackName}-PublicSubnet1

  PublicSubnet2:
    Description: PublicSubnet2
    Value: !Ref PublicSubnet2
    Export:
      Name: !Sub ${AWS::StackName}-PublicSubnet2

  PrivateSubnet1:
    Description: PrivateSubnet1
    Value: !Ref PrivateSubnet1
    Export:
      Name: !Sub ${AWS::StackName}-PrivateSubnet1

  PrivateSubnet2:
    Description: PrivateSubnet2
    Value: !Ref PrivateSubnet2
    Export:
      Name: !Sub ${AWS::StackName}-PrivateSubnet2

つぎに、AWS CLIで以下のコマンドを叩く。

YAML
aws cloudformation create-stack --stack-name handson-cfn --template-body file://vpc.yaml

EC2.yamlについて

YAML
AWSTemplateFormatVersion: 2010-09-09
Description: Hands-on template for EC2

#------------------------------------------------------
#  パラメーター(VPC)
#------------------------------------------------------
Parameters:
  VPCStack:
    Type: String
    Default: handson-cfn

Resources:
#------------------------------------------------------
#  EC2Instance
#------------------------------------------------------
  EC2WebServer01:
    Type: AWS::EC2::Instance
    Properties:
      # 利用したいAMIによって変更する
      ImageId: ami-088da9557aae42f39
      # インスタンスタイプ
      InstanceType: t3.micro
      # セキュリティインポート
      SubnetId:
        Fn::ImportValue: !Sub ${VPCStack}-PublicSubnet1
      # EBS設定
      BlockDeviceMappings:  
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            DeleteOnTermination: true 
            VolumeSize: 10
      # EC2の名前
      Tags:
        - Key: Name
          Value: EC2WebServer01
      # インストールコマンド
      UserData: !Base64 |
        #! /bin/bash
      # セキュリティーグループ使用
      SecurityGroupIds:
        - !Ref EC2SG
#------------------------------------------------------
#  セキュリティーグループ(EC2Instance)
#------------------------------------------------------
  EC2SG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: sg for web server
      VpcId:
        Fn::ImportValue: !Sub ${VPCStack}-VPCID
      SecurityGroupIngress:
        # HTTP接続
        - IpProtocol: tcp
          CidrIp: 0.0.0.0/0
          FromPort: 80
          ToPort: 80
        # SSH接続
        - IpProtocol: tcp
          CidrIp: 0.0.0.0/0
          FromPort: 22
          ToPort: 22
        # HTTPS接続
        - IpProtocol: tcp
          CidrIp: 0.0.0.0/0
          FromPort: 443
          ToPort: 443
#------------------------------------------------------
#  Outputsセクション
#------------------------------------------------------
Outputs:
  EC2WebServer01:
    Value: !Ref EC2WebServer01
    Export:
      Name: !Sub ${AWS::StackName}-EC2WebServer01

次にAWS CLIでEC2を構築する

YAML
aws cloudformation create-stack --stack-name handson-cfn-ec2 --template-body file://ec2.yaml

これで、VPC-EC2の基本構成は自動構築できる。

AWS VPC EC2を構築自動化する理由

AWS VPCを構築自動化しようと思ったきっかけは、EC2で検証環境が欲しいと思った時に円滑に準備がしたいと思ったからだ。

サーバーの検証環境を安くできるのがAWSの良いところだと言える。

Amazon Web Services, Inc.
“AWS Hands-on for Beginners - AWS環境のコード管理 AWS CloudFormationでWebシステムを構築する“ 編では、AWS環境をコードを使用して管理する方法を学んでいただくウェビナーシリーズです。クラウドにおける構成管理の考え方をご理解頂くとともに、AWS CloudForma...

最後に、AWS Hands-on for Beginners AWS 環境のコード管理 AWS CloudFormationで Web システムを構築する でCloudfomationの勉強すると良いだろう。