へっぽこエンジニアの覚え書き

主に、バッチとTeraTermマクロのことについて書きます。

AWS CFnの超簡単なスタックの起動方法

AWS CFnで基本的な構成を起動させる手順の覚書です。

本当に基本的な構成ですのでセキュリティが甘いなどはご容赦ください。

 

CFnへログインしてください。

管理者権限が必要です。

キーは作成済みということにしています。

 コードはVSCodeで作成しています。拡張機能はCloudFormationとYAMLだけいれています。特に、↓はCloudFormationを入れていれば捗ります。

新規ファイル作成(Ctrl+O)→言語モードの変更(Ctrl+Shift+P)→『YML』→言語モードがYAMLになったことを確認。ここで名前を付けて保存しても良いかも。

 

startと入力して以下の一覧を入力

start

start

 いらない部分が多いので、↓のように削る。

要するにResourcesだけにする。

start2

start2

Resourcesの下の行にタブを一つ入れてVPC

vpc

vpc

vpc2

vpc2

上のように一覧が表示される。

ここではCidrBlock:を編集する。私は習慣的にVPCは10.0.0.0/16とします。

それ以外がよければそちらでかまわないと思いますが、

以後はこのCidrを使いますので、これ以外の場合はアドレス範囲にご注意ください。

Resources
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock10.0.0.0/16
      EnableDnsSupporttrue
      Tags:
        - KeyName
          ValueVPC

次にsubnetを作成します。

subnet1

subnet1

ここではsubnet1としました

subnet2

subnet2

赤文字の箇所を編集しました。

 

# ap-northeast-1aは東京AZです。他がよければ変えても良いとも思います。

AvailabilityZone: ap-northeast-1a
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
Tags:
- Key: Name
Value: Subnet1

  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcIdVPC
      CidrBlock10.0.1.0/24
      Tags:
        - KeyName
          Valuesubnet1
 

ここではこのように作りました。
ここで、一端CFnで起動してみます。

  

デザイナーでテンプレートを作成

デザイナーでテンプレートを作成

デザイナーでテンプレートを作成をクリック

 

YML選択

YML選択

テンプレート

テンプレート

↑をそれぞれ選択

VSCodeで入力したコードを貼り付けてみます。

右上の『グラフの更新』をクリック

f:id:gbsdjpagiefuihzds:20200421114008p:plain

vpc+subnet

VPCとSubnetが確認できました。

とりあえず、ここまでは成功しています。

ここまでのコードです。

AWSTemplateFormatVersion: 2010-09-09

Resources
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock10.0.0.0/16
      EnableDnsSupporttrue
      Tags:
        - KeyName
          ValueVPC
  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcIdVPC
      CidrBlock10.0.1.0/24
      Tags:
        - KeyName
          Valuesubnet1

 

VSCodeに戻ります。

SSH接続するためのキー設定を行います。

これまで記入していたResourcesの上部にParamertersを追加して以下を記入します。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  KeyPair:
    DescriptionKeyPair Name
    TypeAWS::EC2::KeyPair::KeyName

外部インターネットへ出るためにInternetGatewayを作成する必要があります。

以下のコードを入力します。

  InternetGateway:
    TypeAWS::EC2::InternetGateway
    Properties:
      Tags:
        - KeyName
          ValueInternetGateway
  AttachGateway:
    TypeAWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId!Ref VPC
      InternetGatewayId!Ref InternetGateway

 InternetGatewayを入力するとattachmentまで自動入力されました。

VSCode便利ですね。

次に、Route、RouteTable、SubnetRouteTableAssociationの3つを入力します。

これはそれぞれ入力する必要があると思います。

初期状態は↓の通りです。

  routeName:
    TypeAWS::EC2::Route
    Properties:
      RouteTableIdrtable-id
      DestinationCidrBlock--.--.--.--/--
      GatewayIdgataway-id
  routeTableName:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcIdvpc-id
      Tags:
        - Keykeyname
          Valuevalue
  routeTableAssocName:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetIdsubnet-id
      RouteTableIdrtable-id

↓になりました。

各IDを!Refで紐づけていくだけです。

項目の追加はありません。

  Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref RouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
  RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        - KeyName
          ValueRouteTable
  RouteTableAssoc:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref subnet1
      RouteTableId!Ref RouteTable

次にSecurityGroupを作成します。

これもSecurityぐらいまで入力すれば以下のようになるはず。

f:id:gbsdjpagiefuihzds:20200421120050p:plain

Security

SecurityGroupの初期状態は↓の通りです。

  secGroupName:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupName
      GroupDescription
      VpcId:
      SecurityGroupIngress:
        - Security Group Rule
      SecurityGroupEgress:
        - Security Group Rule
      Tags:
        - Key:
          Value:

      GroupName: は削除

      SecurityGroupIngress:
        - Security Group Rule
      SecurityGroupEgress:
        - Security Group Rule

はSecurityGroupIngress:だけにします。

要するに

  secGroupName:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupDescription
      VpcId:
      SecurityGroupIngress:
      Tags:
        - Key:
          Value:

となります。

↑が

↓となります。

 
  SecurityGroup:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupDescriptionSG
      VpcId!Ref VPC
      SecurityGroupIngress:
      - IpProtocoltcp
        FromPort'22'
        ToPort'22'
        CidrIp0.0.0.0/0
      Tags:
        - KeyName
          ValueSG

SecurityGroupはできました。

次に、このままですとグローバルIPアドレスがありませんので、外に出られません。

グローバルIPアドレスを取得するする設定が必要です。

subnet内に
MapPublicIpOnLaunch: 'true'

を入力します。

  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcId!Ref VPC
      CidrBlock10.0.1.0/24
      Tags:
        - KeyName
          Valuesubnet1

  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcId!Ref VPC
      CidrBlock10.0.1.0/24
      MapPublicIpOnLaunch'true'
      Tags:
        - KeyName
          Valuesubnet1

とします。

次に、Linuxインスタンスを起動する設定を行います。

subnetの下でec2くらいを入力すると以下のようになると思います。

f:id:gbsdjpagiefuihzds:20200421130744p:plain

EC2

一番上のEC2-Instanceをエンターで選択

デフォルトは以下のようになるはずです。

  myEC2Instance:
    TypeAWS::EC2::Instance
    Properties:
      KeyName
      DisableApiTermination
      ImageId
      InstanceType
      Monitoringtrue|false
      SecurityGroupIds:
        - sg-id
      UserData!Base64 |
        #!/bin/bash -ex
        # put your script here
      Tags:
        - Keykey
          Valuevalue

これもいくつかの行を削ります。

DisableApiTermination: 

Monitoring: true|false:

↑2行を削りました。

  myEC2Instance:
    TypeAWS::EC2::Instance
    Properties:
      KeyName
      ImageId
      InstanceType
      SecurityGroupIds:
        - sg-id
      UserData!Base64 |
        #!/bin/bash -ex
        # put your script here
      Tags:
        - Keykey
          Valuevalue

のようになるはずです。

ここで

      KeyName
      ImageId
      InstanceType

      KeyName!Ref KeyPair
      ImageIdami-923d12f5
      InstanceTypet2.micro

 

 

      SecurityGroupIds:
        - sg-id

      SecurityGroupIds:
        - !GetAtt SecurityGroup.GroupId

 

 

      UserData!Base64 |
        #!/bin/bash -ex
        # put your script here

      UserData:
        Fn::Base64!Sub |
          #!/bin/bash
          yum -y update

 ↑は#!/bin/bashyum -y updateの前にインデントが必要です。

 

ここがポイントなのですが、デフォルトでは出てこないSubnetIdを追記します。

      SubnetId!Ref subnet1

最後に、Tagsを編集します。

      Tags:
        - Keykey
          Valuevalue

      Tags:
        - KeyName
          ValueEC2Linux

として、IDを変えます。

そして↓こうなりました。

  EC2Linux:
    TypeAWS::EC2::Instance
    Properties:
      KeyName!Ref KeyPair
      ImageIdami-923d12f5
      InstanceTypet2.micro
      SecurityGroupIds:
        - !GetAtt SecurityGroup.GroupId
      SubnetId!Ref subnet1
      UserData:
        Fn::Base64!Sub |
          #!/bin/bash
          yum -y update
      Tags:
        - KeyName
          ValueEC2Linux

これで編集は完了です。

ここまでのコードでCFnでLinuxが起動できるはずです。

 

最後に、全コードです。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
KeyPair:
DescriptionKeyPair Name
TypeAWS::EC2::KeyPair::KeyName
Resources
  VPC:
    TypeAWS::EC2::VPC
    Properties:
      CidrBlock10.0.0.0/16
      EnableDnsSupporttrue
      Tags:
        - KeyName
          ValueVPC
  InternetGateway:
    TypeAWS::EC2::InternetGateway
    Properties:
      Tags:
        - KeyName
          ValueInternetGateway
  AttachGateway:
    TypeAWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId!Ref VPC
      InternetGatewayId!Ref InternetGateway
  Route:
    TypeAWS::EC2::Route
    Properties:
      RouteTableId!Ref RouteTable
      DestinationCidrBlock0.0.0.0/0
      GatewayId!Ref InternetGateway
  RouteTable:
    TypeAWS::EC2::RouteTable
    Properties:
      VpcId!Ref VPC
      Tags:
        - KeyName
          ValueRouteTable
  RouteTableAssoc:
    TypeAWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId!Ref subnet1
      RouteTableId!Ref RouteTable
  SecurityGroup:
    TypeAWS::EC2::SecurityGroup
    Properties:
      GroupDescriptionSG
      VpcId!Ref VPC
      SecurityGroupIngress:
      - IpProtocoltcp
        FromPort'22'
        ToPort'22'
        CidrIp0.0.0.0/0
      Tags:
        - KeyName
          ValueSG
  subnet1:
    TypeAWS::EC2::Subnet
    Properties:
      AvailabilityZoneap-northeast-1a
      VpcId!Ref VPC
      CidrBlock10.0.1.0/24
      MapPublicIpOnLaunch'true'
      Tags:
        - KeyName
          Valuesubnet1
  EC2Linux:
    TypeAWS::EC2::Instance
    Properties:
      KeyName!Ref KeyPair
      ImageIdami-923d12f5
      InstanceTypet2.micro
      SecurityGroupIds:
        - !GetAtt SecurityGroup.GroupId
      SubnetId!Ref subnet1
      UserData:
        Fn::Base64!Sub |
          #!/bin/bash
          yum -y update
      Tags:
        - KeyName
          ValueEC2Linux

 

雰囲気くらいはおわかり頂けますでしょうか。
↑はコピペできますので、CFnで起動してみれば感じはおわかり頂ると思います。
うまく起動できない場合は、!Refの後ろの名前が、コードの中にあるか検索してみてください。
詳しくはググって欲しいのですが、!Refの後ろの名前はコード内にないとエラーになります。
デフォルトの名前を変えずにいるとエラーになると思います。
コードの行間がおかしいです。
見づらくてすみません。