シンプルなネットワークとサーバーをCloudFormationで構築する 〜3. サーバー構築〜
前回はセキュリティーグループ、ネットワークACLを設定しました。
今回は、作成したネットワーク上にEC2インスタンスを作成し、Webサーバーを構築します。 Webサーバーはnginxデフォルト状態とします。
サーバー構築用のテンプレート
今回作成したテンプレートは以下になります。
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は前回と同じ値を設定してください。
スタック作成完了後に、出力を確認します。
サービス [EC2] - [インスタンス] を選択し、作成したインスタンスのパブリックIP
をブラウザに入力してnginxが起動しているか確認をします。
まとめ
ちょっとした目的でもテンプレートは長くなりがちです。 その場合、テンプレートを目的ごとに分割すると、再利用しやすく、管理がしやすくなります。