LoginSignup
6
1

More than 3 years have passed since last update.

CloudFormation を使ってVPC + サブネット + EC2構成を作る

Posted at

SysOps のWeb問題集を解いていたら、やたらとCloudFormation の問題が出てきました。
「これは実際にさわってみたほうがよさそうだな」と感じたので、やってみました:raised_hands:

「CloudFormation ってなんなの」という方は以下をご覧ください。
概要をつかむきっかけになれば、とてもうれしいです。
【AWS】CloudFormation についてざっくりまとめる:学習メモ

この構成をつくるぞ

aws-cfn.png

今回は諸事情(※)によりオハイオリージョンで作成します。
みなさま適宜お好きなリージョンでやってみてください。
※自社のsandbox環境で東京リージョンに作成しようとしたら、VPCの上限数に達していて作れなかった

事前準備①:テンプレートの用意

YAML / JSON どちらの形式でもだいじょうぶです。
コメントを入れられるという点でYAMLの方がいいかなと思うので、今回はYAMLにしました。

test-template.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: Test cfn Template

# ----------------------------------------------------------------
#     Parameters
# ----------------------------------------------------------------
Parameters:
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium
    Description: Select EC2 instance type.
  KeyPair:
    Description: Select KeyPair Name.
    Type: AWS::EC2::KeyPair::KeyName


# ----------------------------------------------------------------
#     Resources
# ----------------------------------------------------------------

# --------------------  VPCの定義ここから --------------------
Resources:
  cfnVpc:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: '192.168.0.0/16'
      Tags:
        - Key: 'Name'
          Value: 'test-vpc'
# --------------------  VPCの定義ここまで --------------------

# --------------------  サブネットの定義ここから --------------------
  cfnSubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      CidrBlock: '192.168.1.0/24'
      MapPublicIpOnLaunch: true
      Tags:
        - Key: 'Name'
          Value: 'test-cfn-subnet'
      VpcId: !Ref cfnVpc
# --------------------  サブネットの定義ここまで --------------------

# --------------------  ネットワーク周りの定義ここから --------------------
  cfnInternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags:
      - Key: 'Name'
        Value: 'test-cfn-igw'
  cfnAttachGateway:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref cfnVpc
      InternetGatewayId: !Ref cfnInternetGateway
  cfnRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      Tags:
        - Key: 'Name'
          Value: 'test-cfn-rt'
      VpcId: !Ref cfnVpc
  cfnRoute:
    Type: 'AWS::EC2::Route'
    DependsOn: cfnInternetGateway
    Properties:
      RouteTableId: !Ref cfnRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref cfnInternetGateway
  cfnSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref cfnSubnet
      RouteTableId: !Ref cfnRouteTable
# --------------------  ネットワーク周りの定義ここまで --------------------

# --------------------  EC2の定義ここから --------------------
  cfnEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: "ami-07c8bc5c1ce9598c3" # オハイオリージョンの最新のAmazon Linux 2 AMI にしています
      InstanceType: !Ref InstanceType
      SubnetId: !Ref cfnSubnet
      BlockDeviceMappings:
        - DeviceName: '/dev/xvda'
          Ebs:
            VolumeType: 'gp2'
            VolumeSize: 8
      Tags:
        - Key: 'Name'
          Value: 'test-cfn-ec2-instance'
      SecurityGroupIds:
        - !Ref cfnSecurityGroup
      KeyName: !Ref KeyPair
  cfnSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "cfnSecurityGroup"
      VpcId: !Ref cfnVpc
      Tags:
        - Key: 'Name'
          Value: 'test-cfn-ssh-sg'
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '22'
        ToPort: '22'
        CidrIp: 0.0.0.0/0
# --------------------  EC2の定義ここまで --------------------

※ 上記だとネットワークのセキュリティがゆるゆるなので、適宜修正してお使いください
※ 参考:AWS公式のサンプルテンプレートが多数公開されているようです

事前準備②:キーペアの作成

今回作成するEC2インスタンスにSSH接続できるようにしたいので、あらかじめキーペアを作っておきます。
「キーペアどこから作るんだっけ?」ってなっちゃったので、こちらを見つつ作りました。

作業手順

1. AWSコンソール にログイン

2. [CloudFormation] と入力し、Enterキーを押す

CloudFormation でスタックを作成する

1. [スタックの作成] をクリック

2. [スタックの作成] > [新しいリソースを使用 (標準)] をクリック
Screenshot 2020-08-19 22.51.54.png

ステップ1:テンプレートの指定

1. 以下を設定し、[次へ] をクリック
Screenshot 2020-08-19 22.52.09.png

  • テンプレートの準備:テンプレートの準備完了
  • テンプレートの指定:テンプレートのファイルのアップロード (事前に準備しておいたテンプレートを選択します)

ステップ2:スタックの詳細を指定

今回テンプレート内に[Parameters] を定義したため、パラメータ欄が表示されています。
EC2インスタンスタイプ・SSH接続する際に使うキーペアを選びます。

1. 任意のスタック名を入力し、[次へ] をクリック
Screenshot 2020-08-19 23.24.43.png

ステップ3:スタックオプションの設定

1. 任意の項目を入力し、[次へ] をクリック

ここでタグを設定しておくと、今回作成するリソース全部に同じタグが付くのでとても便利です:ok_woman:
(テンプレート内でいちいち書くよりも、ここで設定した方が楽)
私は社内のSandbox環境で実行したので、自分のものだとわかるように以下のタグを付けました。

  • キー:[Owner]
  • 値:自分の名前 Screenshot 2020-08-19 23.25.12.png

ステップ4:レビュー

1. 設定値に誤りがないか確認し、[スタックの作成] をクリック
Screenshot 2020-08-19 23.26.21.png

スタック作成中はこんな感じ

[イベント] 欄で作成の進捗状況を確認することができます。
Screenshot 2020-08-19 23.27.36.png

ステータスが[CREATE_COMPLETE] になれば完成です!

EC2インスタンスへのSSHログインもばっちり

以下のコマンドでSSHログインできます。

ssh -i [秘密鍵のパス] ec2-user@[EC2のIPv4パブリックIP]

Screenshot 2020-08-19 23.33.11.png

今回作ったやつを全部消したいんだけど?

スタックごと削除すれば、全部消えます。
地道に削除していかなくていいのでべんり。

参考

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1