ブログ

AWS CloudFormation を試してみよう!

自分でイチから構築していないインフラストラクチャの把握って、ものすごくパワーが必要じゃないですか!?

インフラストラクチャの構成把握に時間がかかりがちなエンジニア横田です。

本ブログでは、AWS インフラストラクチャの管理の手助けとなるサービス、AWS CloudFormation をご紹介します。

AWS CloudFormation とは?

AWS CloudFormation とは AWS インフラストラクチャをコードとして扱うことで、AWS リソースをモデル化、プロビジョニング、管理することができるサービスです。ざっくり言い換えると、AWS リソースの環境構築をテキストファイルやプログラミングコードから行えます。IaC (Infrastructure as Code) の手段の一つですね!
属人化しがちなインフラストラクチャの環境管理を標準化できたり、複数の AWS リソースを一気に構築できたりと、使いこなせると非常に強力なサービスとなります。

また、障害発生時の検証やOSバージョンアップデートなどで、本番運用中の AWS インフラストラクチャと全く同じ AWS インフラストラクチャを急いで用意しなければならないことがあるかと思います。そんなときのために、AWS インフラストラクチャをテンプレート化・コード化しておくと、焦らず速やかに、本番運用中の AWS インフラストラクチャと全く同じ構成の環境を構築できるようになります!

なんだかすっごく魅力的なサービスに見えてきませんか!?

本ブログでは AWS CloudFormation で VPC と EC2 を構築してみたいと思います。
読者のみなさまに少しでも AWS CloudFortmation がどのようなものかをイメージしていただければ幸いです。

それではやっていきましょう!

AWS CloudFormation のテンプレートファイルはこれだっ!

AWS CloudFormation を使用するには、まずはテンプレートファイルを準備する必要があります。

テンプレートファイルは json 形式か yaml 形式かのいずれかで書くことができますが、個人的には、テンプレートファイル中にコメントが記入できる yaml 形式の方が分かりやすいのかなと思います。

試しに VPC のテンプレートファイルを json と yaml の両形式で書いてみます。

【 json 】

"VPC" : {
  "Type" : "AWS::EC2::VPC",
  "Properties" : {
      "CidrBlock" : "10.0.0.0/16",
      "EnableDnsSupport" : "true",
      "EnableDnsHostnames" : "true",
      "Tags" : [
        {"Key" : "Name", "Value" : "cloudlink"}
      ]
  }
}

【 yaml 】

#
# 「#」でコメントアウトできるよ!
#

VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: 10.0.0.0/16
    EnableDnsSupport: true
    EnableDnsHostnames: true
    Tags:
    - Key: Name
      Value: cloudlink

どうでしょうか?

記述量が少ないのでそこまで違いは見えませんが、なんとなく yaml の方が人の目には見やすいように感じませんか?
(筆者は json ファイルの “ { } ” や “ [ ] ” が増えてくると頭が爆発しそうになるので余計にそう感じるのかもしれないです。。)

もちろん、絶対に yaml の方がいいというわけではないのでお好みでどうぞ!

AWS CloudFormation で VPC を構築してみよう

テンプレートファイルの書き方についてわかったところで、AWS CloudFormation を用いて VPC、Subnet、Route Table を作成してみます。

# vpc.yaml

AWSTemplateFormatVersion: 2010-09-09

Resources:
# ------------------------------------------------------------#
#  VPC
# ------------------------------------------------------------#
  Vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
       - Key: Name
         Value: vpc_cloud_link

# ------------------------------------------------------------#
#  Subnet
# ------------------------------------------------------------#          
  Subnet: 
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.0.0/24
      MapPublicIpOnLaunch: false
      VpcId: !Ref Vpc 
      Tags:
        - Key: Name
          Value: subnet_cloud_link

# ------------------------------------------------------------#
#  RouteTable
# ------------------------------------------------------------#          
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      Tags:
        - Key: Name
          Value: cloud_link_rtb
      VpcId: !Ref Vpc

  RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref Subnet 
      RouteTableId: !Ref RouteTable 


# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#                
Outputs:
  Vpc:
    Value: !Ref Vpc
    Export:
      Name: !Sub vpc-cloudlink
  
  Subnet:
    Value: !Ref Subnet
    Export:
      Name: !Sub subnet-cloudlink
  1. AWS マネジメントコンソールから AWS CloudFormation の画面に移動します。
  1. CloudFormation > スタック > スタックの作成 からテンプレートファイルをアップロードし、「次へ」を押下します。(S3 に vpc.yaml がアップロードされます。)
  1. スタックの名前を設定し「次へ」を押下します。(今回は vpc と名付けます。)
  1. スタックオプションや詳細オプションの設定をする場合は、設定し「次へ」を押下します。
  1. 作成前にレビューが表示されるので、確認の上、問題なければ「スタックの作成」を押下します。
  1. 作成が開始されました!作成の状況は該当スタックのイベントタブより確認できます。

作成が完了すると、ステータスが CREATE_COMPLETE となります。

AWS マネジメントコンソールの VPC サービス画面からリソースが作成されていることを確認できました!

AWS マネジメントコンソールから AWS リソースの各情報を確認したい場合、画面遷移がどうしても発生してしまいますが、AWS CloudFormation で作成していると、テンプレートファイルを確認するとどのような設定で AWS リソースが作成されているのか確認できます。

AWS CloudFormation で EC2 を構築してみよう

続いて EC2、Security Group を作成してみます。
先程作成した VPC の情報を使用したいため、vpc.yaml の Outputs で出力した値を利用します。

【vpc.yaml から抜粋】

# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#                
Outputs:
  Vpc:
    Value: !Ref Vpc
    Export:
      Name: !Sub vpc-cloudlink
  
  Subnet:
    Value: !Ref Subnet
    Export:
      Name: !Sub subnet-cloudlink

Outputs で出力したエクスポート名は、この後記載する ec2.yaml で ImportValue 関数を使用することで、テンプレートファイルをまたいで参照することができます!
(クロススタック参照と言います。テンプレートファイルを分割する際に使用されることが多いです。)

今回使用する ec2.yaml がこちらです!
なお、キーペアは予め作成したものを使用します。

# ec2.yaml

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  Ec2ImageId:
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources: 
# ------------------------------------------------------------#
# EC2 Security Group
# ------------------------------------------------------------#                
  Sg:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: for-ec2-cloud-link
      GroupDescription: for-ec2-cloud-link
      VpcId: !ImportValue
        'Fn::Sub': vpc-cloudlink
      SecurityGroupIngress:
        # all
        - IpProtocol: "-1"
          CidrIp: 10.0.0.0/24
      SecurityGroupEgress:
        - IpProtocol: "-1"
          CidrIp: 0.0.0.0/0

# ------------------------------------------------------------#
# EC2
# ------------------------------------------------------------#             
  Ec2: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: !Ref Ec2ImageId
      KeyName: cf-test
      InstanceType: t3.medium
      NetworkInterfaces: 
        - AssociatePublicIpAddress: false
          DeviceIndex: "0"
          SubnetId: !ImportValue 
              'Fn::Sub': subnet-cloudlink
          GroupSet:
            - !Ref Sg
      Monitoring: false
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 8
            VolumeType: gp2
            DeleteOnTermination: true 
      Tags:
        - Key: Name
          Value: ec2-cloudlink

先程と同じ要領で AWS CloudFormaton の画面からスタックを作成しました。

AWS マネージドコンソールの EC2 サービス画面から確認してみます。
vpc.yaml でエクスポートした値が使用されていることが確認できました!

AWS CloudFormation(まとめ)

いかがでしたでしょうか?

AWS CloudFormation についてご紹介させていただきましたが、使いこなせるとこれまでの運用がグッと楽にできそうではないでしょうか。

今回ご紹介できなかった AWS サービスの AWS CloudFormation テンプレートファイルの書き方については AWS 公式サイト*1 をご確認いただけますと幸いです!

AWS CloudFormation に関わらず、「AWS でこんなことできないかな?」「自社サーバーを AWS に引っ越したいな。」等々ございましたら、右上の[お問い合わせ]からお気軽にご相談ください。


*1 AWS リソースおよびプロパティタイプのリファレンス

元記事発行日: 2022年09月09日、最終更新日: 2022年09月09日