俺のアウトプット

調べたこと、試したことを書きます

シンプルなネットワークとサーバーをCloudFormationで構築する 〜3. サーバー構築〜

前回はセキュリティーグループ、ネットワークACLを設定しました。

oreout.hatenablog.com

今回は、作成したネットワーク上にEC2インスタンスを作成し、Webサーバーを構築します。 Webサーバーはnginxデフォルト状態とします。

f:id:kitsugi:20180819161411p:plain

サーバー構築用のテンプレート

今回作成したテンプレートは以下になります。

server.template.yaml

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  ProjectCode:
    Type: String
    Description: Enter your project code
  InstanceType:
    Type: String
    Description: WebServer EC2 instance type
    ConstraintDescription: must be a valid EC2 instance type.
    Default: t2.micro
    AllowedValues:
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
Mappings:
  RegionMap:
    us-east-1:
      AL2: ami-04681a1dbd79675a5
    us-east-2:
      AL2: ami-0cf31d971a3ca20d6
    us-west-1:
      AL2: ami-0782017a917e973e7
    us-west-2:
      AL2: ami-6cd6f714
    ap-northeast-1:
      AL2: ami-08847abae18baa040
    ap-southeast-1:
      AL2: ami-01da99628f381e50a
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AL2]
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      NetworkInterfaces:
        - GroupSet:
            - Fn::ImportValue: !Sub ${ProjectCode}-web-sg
          AssociatePublicIpAddress: true
          DeviceIndex: 0
          DeleteOnTermination: true
          SubnetId:
            Fn::ImportValue: !Sub ${ProjectCode}-subnet
      UserData: !Base64 |
        #!/bin/bash
        amazon-linux-extras install nginx1.12 -y
        systemctl start nginx
        systemctl enable nginx
      Tags:
      -
        Key: Name
        Value: !Ref ProjectCode
Outputs:
  WebServerInstance:
    Description: InstanceId of the newly created EC2 instance
    Value: !Ref WebServerInstance

パラメータ

パラメータは3つあります。

パラメータ 説明
ProjectCode プロジェクトコードを指定します。
各リソースの名前とテンプレート連携(クロススタック参照)で利用します。
InstanceType インスタンスタイプを指定します。デフォルトはt2.microです。
(テンプレートを短くするため数を減らしています)
KeyName EC2 のキーペアの名前を指定します。

マッピング

AMIはリージョン単位のサービスです。 各リージョンのAmazon Linux2のAMIをマッピングで用意します。
目的のリージョンがない場合は追加してください。

リソース

ImageId

マッピングから選択リージョンのAMIを取得します。

ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AL2]

NetworkInterfaces

アタッチされるネットワークインターフェイスを指定します。
組み込み関数Fn::ImportValueを利用して、作成したサブネットID、セキュリティーグループIDをインポートします。

NetworkInterfaces:
    - GroupSet:
        - Fn::ImportValue: !Sub ${ProjectCode}-web-sg
    AssociatePublicIpAddress: true
    DeviceIndex: 0
    DeleteOnTermination: true
    SubnetId:
        Fn::ImportValue: !Sub ${ProjectCode}-subnet

UserData

単純なインストールであれば、ユーザーデータにシェルを書くのが簡単です。 nginxをインストールして起動、自動起動を設定します。

UserData: !Base64 |
    #!/bin/bash
    amazon-linux-extras install nginx1.12 -y
    systemctl start nginx
    systemctl enable nginx

出力

確認用にEC2インスタンスIDを出力します。

スタックの作成

ではスタックを作成してみましょう。

スタックの名前、パラメータを指定します。ProjectCodeは前回と同じ値を設定してください。

f:id:kitsugi:20180821055005p:plain

スタック作成完了後に、出力を確認します。

f:id:kitsugi:20180821055019p:plain

サービス [EC2] - [インスタンス] を選択し、作成したインスタンスのパブリックIPをブラウザに入力してnginxが起動しているか確認をします。

f:id:kitsugi:20180821055031p:plain

まとめ

ちょっとした目的でもテンプレートは長くなりがちです。 その場合、テンプレートを目的ごとに分割すると、再利用しやすく、管理がしやすくなります。

参考