■ はじめに
業務で、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