【AWS】CloudFormation ~ EC2 ~

■ はじめに

業務で、AWS CloudFormation (CFn)  を使って
EC2を立ち上げそうなので、予習しておく

目次

【1】CloudFormation による EC2
【2】API
【3】ソフトウェアをインストールするには
 1)cfn-init ヘルパースクリプト
 2)AWS CloudFormation のベストプラクティス
 3)サンプル
【4】Tips
 1)Parametersの値をUserData内で使う
 2)デバッグログに関して

【1】CloudFormation による EC2

 言葉で説明するより
一番シンプルなサンプルを見た方が理解が早い

サンプル

Ec2Instance:
  Type: AWS::EC2::Instance
  Properties:
    AvailabilityZone: us-west-2
    ImageId: ami-04e914639d0cca79a

【2】API

 以下の公式ドキュメントから
自分のやりたいことを調べれば良さそう

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html

【3】ソフトウェアをインストールするには

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-init.html

より抜粋
~~~~~~~
cfn-init ヘルパースクリプトは、
AWS::CloudFormation::Init キーからテンプレートメタデータを
読み取って、次の状況に応じて操作を行います。

・パッケージをインストールする
~~~~~~~

1)cfn-init ヘルパースクリプト

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/deploying.applications.html

より抜粋
~~~~~~~
cfn-init を実行すると、
AWS::CloudFormation::Init リソースからメタデータが読み込まれます。
これは、cfn-init によって実行されるアクションが記述されたものです。
例えば、cfn-init および AWS::CloudFormation::Init を使用して、
パッケージのインストール、ディスクへのファイルの書き込み、
またはサービスの起動を実行できます
~~~~~~~

[a] Metadata セクション

* Metadata セクションで定義した設定または構成情報を取得
* この情報は、次の AWS CloudFormation 固有のメタデータキーで定義
 + AWS::CloudFormation::Init
 + AWS::CloudFormation::Interface
 + AWS::CloudFormation::Designer

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html

[b] AWS::CloudFormation::Init セクション
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-init.html

* EC2 インスタンスでアプリケーションの設定とインストールを行う場合に便利

[c] cfn-init ヘルパースクリプト

AWS::CloudFormation::Init セクションに記述されたコンフィグを取得し
そのセクションに記載されている内容を実行するヘルパースクリプト

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-init.html

2)AWS CloudFormation のベストプラクティス

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html#cfninit

より抜粋
~~~~~~~
AWS::CloudFormation::Init を使用してAmazon EC2 インスタンスに
ソフトウェアアプリケーションをデプロイ

スタックを起動する際に、
cfn-init ヘルパースクリプトと AWS::CloudFormation::Init リソースを使用して、
Amazon EC2 インスタンスでソフトウェアアプリケーションを
インストールして設定できます。
~~~~~~~

3)サンプル

Resources:
  DemoEC2WebServer:
    Type: AWS::EC2::Instance
    # ★注目★
    Metadata:
     Comment: This is a sample
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          services:
            sysvinit:
              httpd:
                ensureRunning: true
                enabled: true
          files:
            /var/www/html/index.html:
              content: |
                <html>
                  <head>
                    <title>hello</title>
                  </head>
                  <body>
                    <p>Hello World</p>
                  </body>
                </html>
              mode: "000644"
              owner: root
              group: root
  Properties:
    AvailabilityZone: us-west-2
    ImageId: ami-04e914639d0cca79a
    InstanceType: t3.micro
    UserData:
      Fn::Base64: !Sub |
        #!/bin/bash -x
        yum -y update
        yum -y install aws-cfn-bootstrap
        # ★cfn-init ヘルパースクリプト
        /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource DemoEC2WebServer --region ${AWS::Region}

【4】Tips

1)Parametersの値をUserData内で使う

* 以下のサイトが参考になる

https://dev.classmethod.jp/articles/using-variables-in-ec2-user-data-in-cloudformation/
!Sub
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html

組み込み関数 Fn::Sub は、入力文字列の変数を、指定した値に置き換えます。
テンプレートで、スタックを作成または更新するまで使用できない値を含むコマンド
または出力を作成するために、この関数を使用できます。

サンプル

AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  Value1:
    Type: String
    Default: Hello
  Value2:
    Type: String
    Default: World
Resources:
  SampleLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: demo-launch-template
      LaunchTemplateData:
        UserData:
          Fn::Base64: !Sub
            - |
              #!/bin/bash
              echo "$Value1, $Value2 !!!"
            - Value1: !Ref Value1
              Value2: !Ref Value2

2)デバッグログに関して

* 以下のサイトが参考になる

https://qiita.com/yamada-hakase/items/b42aed68e5623ed74024

Debug Log Path Explanations
/var/log/cloud-init-output.log cloud-initを実行したときの簡易ログ
/var/log/cloud-init.log 詳細なデバッグ情報を含んだログ
/var/run/cloud-init/配下ファイル cloud-init自身が実行するかどうかを判断したときの情報を含んだログ

コマンド例

sudo tail -f /var/log/cloud-init-output.log

参考文献

https://blog.serverworks.co.jp/build-web-server-by-cfn

関連記事

CloudFormation ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2024/02/10/231900
CloudFormation ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/26/224812
CloudFormation ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2021/12/01/170326
CloudFormation ~ 開発環境 ~
https://dk521123.hatenablog.com/entry/2022/05/22/000000
CloudFormation ~ 組み込み関数 ~
https://dk521123.hatenablog.com/entry/2021/12/04/202519
CloudFormation ~ 条件分岐 ~
https://dk521123.hatenablog.com/entry/2022/07/02/214543
CloudFormation ~ 疑似パラメータ ~
https://dk521123.hatenablog.com/entry/2021/12/05/134313
CloudFormation ~ DeletionPolicy 属性 ~
https://dk521123.hatenablog.com/entry/2021/12/27/211328
CloudFormation ~ 認証情報の扱い ~
https://dk521123.hatenablog.com/entry/2021/12/28/224501
CloudFormation ~ VPC
https://dk521123.hatenablog.com/entry/2024/03/03/011149
CloudFormation ~ S3 ~
https://dk521123.hatenablog.com/entry/2022/05/25/220037
CloudFormation ~ KMS ~
https://dk521123.hatenablog.com/entry/2022/05/26/112627
CloudFormation ~ IAM ~
https://dk521123.hatenablog.com/entry/2022/05/27/100820
CloudFormation で Github/CodePipeline/CodeBuild を構築する
https://dk521123.hatenablog.com/entry/2021/12/26/155956
CloudFormation でのトラブル
https://dk521123.hatenablog.com/entry/2022/05/30/191507
YAML (YAML Ain't Markup Language)
https://dk521123.hatenablog.com/entry/2019/10/13/000000
Linux ~ ユーザに関わるコマンド ~
https://dk521123.hatenablog.com/entry/2016/06/26/233349