Amazon EC2 にアプリケーションをデプロイする - AWS CloudFormation

Amazon EC2 にアプリケーションをデプロイする

CloudFormation を使用して、Amazon EC2 インスタンスにアプリケーションを自動的にインストールし、設定および起動することができます。これにより、インスタンスへ直接接続することなく、簡単にデプロイを複製し、既存のインストールを更新できるので、多くの時間と労力を節約することができます。

CloudFormation には、cloud-init に基づく一連のヘルパースクリプト (cfn-initcfn-signalcfn-get-metadata、および cfn-hup) が含まれています。同じテンプレートに存在する Amazon EC2 インスタンスにアプリケーションをインストールし、設定および更新するには、CloudFormation テンプレートからこれらのヘルパースクリプトを呼び出します 詳細については、「AWS CloudFormation テンプレートリファレンスガイド」の「CloudFormation ヘルパースクリプトリファレンス」を参照してください。

入門チュートリアルでは、基本的な bash スクリプトで UserData を使用してシンプルなウェブサーバーを作成しました。これは簡単な「Hello World」ページでは機能しますが、実際のアプリケーションでは次のようなより高度な設定が必要になることが多くあります。

  • 正しい順序でインストールされた複数のソフトウェアパッケージ。

  • 特定のコンテンツで作成された複雑な設定ファイル。

  • 自動的に開始し、実行するよう設定されたサービス。

  • セットアッププロセスでのエラー処理と検証。

CloudFormation のヘルパースクリプトは、UserData の基本的な bash スクリプトより堅牢かつメンテナンスしやすい方法で EC2 インスタンスを設定できます。cfn-init ヘルパースクリプトは、テンプレートのメタデータから設定データを読み取り、インスタンスに体系的に適用します。

このチュートリアルでは、cfn-init ヘルパースクリプトを使用してブートストラッププロセスをモニタリングする方法を学習します。

注記

CloudFormation は無料で使用できますが、作成した Amazon EC2 リソースに対しては課金されます。ただし、AWS を初めて使用する場合は、 無料利用枠を利用して、この学習プロセス中のコストを最小に抑えるか無料にできます。

前提条件

  • 最初のスタックの作成 チュートリアルを完了しているか、CloudFormation の基本と同等の経験を有している必要があります。

  • Amazon EC2 および CloudFormation を使用するアクセス許可を持つ IAM ユーザーまたはロール、または管理ユーザーアクセスで AWS アカウント にアクセスできる必要があります。

  • インターネットにアクセスできる Virtual Private Cloud (VPC) が必要です。このチュートリアルテンプレートには、新しい AWS アカウント に自動的に付属するデフォルトの VPC が必要です。デフォルトの VPC がない場合、またはデフォルトの VPC が削除された場合は、最初のスタックの作成 チュートリアルのトラブルシューティングセクションで代替ソリューションを参照してください。

ブートストラップの概念について

テンプレートを作成する前に、ブートストラップを機能させる主要な概念について理解しておきましょう。

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

CloudFormation には、Amazon EC2 インスタンスでソフトウェアをインストールしたりサービスを開始したりするために使用できる Python ヘルパースクリプトが用意されています。cfn-init スクリプトはテンプレートからリソースメタデータを読み取り、設定をインスタンスに適用します。

このプロセスは次のように機能します。

  1. 設定は、EC2 リソースの「Metadata」セクションで定義します。

  2. cfn-initUserData スクリプトから呼び出します。

  3. cfn-init でメタデータを読み取り、設定を適用します。

  4. インスタンスが仕様に従って設定されます。

メタデータ構造

設定は EC2 インスタンス内の特定の構造で定義されます。

Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: # Metadata section for the resource AWS::CloudFormation::Init: # Required key that cfn-init looks for config: # Configuration name (you can have multiple) packages: # Install packages files: # Create files commands: # Run commands services: # Start/stop services

cfn-init スクリプトは、パッケージ、グループ、ユーザー、ソース、ファイル、コマンド、そしてサービスという特定の順序でこれらのセクションを処理します。

シンプルなブートストラップの例から始める

まず、Apache をインストールして起動する最小限のブートストラップの例から始めましょう。

Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: # Install Apache web server yum: httpd: [] services: # Start Apache and enable it to start on boot sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType UserData: !Base64 # Script that runs when instance starts Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}

この簡単な例で、主要な概念について説明します。

  • packages」セクションでは、yum を使用して httpd パッケージをインストールします。これは、Amazon Linux および yum を使用する他の Linux ディストリビューションで機能します。

  • services」セクションでは、httpd が自動的に開始および実行されます。

  • UserData で最新のブートストラップツールをインストールし、cfn-init を呼び出します。

ファイルとコマンドの追加

次に、EC2 インスタンスの /var/log ディレクトリにカスタムウェブページとログファイルを追加して、例を強化しましょう。

ファイルを作成する

files」セクションでは、特定のコンテンツを含むファイルをインスタンスに作成できます。垂直パイプ (|) を使用すると、テキストのリテラルブロック (HTML コード) をファイルの内容 (/var/www/html/index.html) として渡すことができます。

files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body>

コマンドの実行

commands」セクションでは、ブートストラッププロセス中にシェルコマンドを実行できます。このコマンドによって、EC2 インスタンスの /var/log/welcome.txt にログファイルが作成されます。これを表示するには、SSH アクセスに使用する Amazon EC2 キーペアと、インスタンスへの SSH に使用できる IP アドレス範囲が必要です (ここでは説明しません)。

commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"

ネットワークセキュリティの強化

ウェブサーバーを設定するため、ウェブトラフィック (HTTP) が EC2 インスタンスに到達できるようにする必要があります。これを行うには、IP アドレスからのポート 80 で受信トラフィックを許可するセキュリティグループを作成します。また、EC2 インスタンスでは、パッケージの更新をインストールするなどの用途でインターネットにトラフィックを送信する必要があります。デフォルトで、セキュリティグループはすべてのアウトバウンドトラフィックを許可します。次に、SecurityGroupIds プロパティを使用して、このセキュリティグループを EC2 インスタンスに関連付けます。

WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP

完全なブートストラップテンプレート

次に、すべての要素をまとめてみましょう。ここで説明したすべての概念を組み合わせた、完全なテンプレートを以下に示します。

AWSTemplateFormatVersion: 2010-09-09 Description: Bootstrap an EC2 instance with Apache web server using cfn-init Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' InstanceType: Description: EC2 instance type Type: String Default: t2.micro AllowedValues: - t3.micro - t2.micro ConstraintDescription: must be a valid EC2 instance type. MyIP: Description: Your IP address in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP WebServer: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body> commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt" services: sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: !Base64 Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region} Tags: - Key: Name Value: Bootstrap Tutorial Web Server Outputs: WebsiteURL: Value: !Sub 'http://${WebServer.PublicDnsName}' Description: EC2 instance public DNS name

コンソールを使用してスタックを作成する

次の手順では、ファイルからサンプルスタックテンプレートをアップロードします。ローカルマシンでテキストエディタを開き、テンプレートを追加します。次に、samplelinux2stack.template という名前でファイルを保存します。

スタックテンプレートを起動するには
  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. [スタックの作成] を選択し、[新しいリソースの使用 (標準)] を選択します。

  3. [テンプレートを指定] で、[テンプレートファイルをアップロード][ファイルを選択] を選択して samplelinux2stack.template ファイルをアップロードします。

  4. [次へ] を選択します。

  5. スタックの詳細を指定する」ページで、スタック名に「BootstrapTutorialStack」と入力します。

  6. [パラメータ] で、次の操作を行います。

    • LatestAmiId: デフォルト値のままにします。

    • InstanceType: EC2 インスタンスタイプとして t2.micro または t3.micro を選択します。

    • MyIP: パブリック IP アドレスを /32 サフィックスを使用して入力します。

  7. [次へ] を 2 回選択し、次に [送信] を選択してスタックを作成します。

ブートストラッププロセスをモニタリングする

追加のソフトウェアがインストールおよび設定されているため、ブートストラッププロセスは単純な EC2 の起動よりも時間がかかります。

ブートストラップの進行状況をモニタリングするには
  1. CloudFormation コンソールでスタックを選択し、[イベント] タブを開きます。

  2. WebServer CREATE_IN_PROGRESS イベントをモニタリングします。ブートストラッププロセスは、インスタンスの起動後に開始されます。

  3. このプロセスには、通常数分かかります。完了時に「WebServer CREATE_COMPLETE」と表示されます。

ブートストラッププロセス中の状況を確認したい場合は、インスタンスログをチェックできます。

ブートストラップログを表示するには (オプション)
  1. EC2 コンソールを開いてインスタンスを確認します。

  2. インスタンスを選択してから、[アクション][モニタリングとトラブルシューティング][システムログの取得] を選択し、ブートストラップの進捗状況を確認します。

  3. ログがすぐに表示されない場合は、待機してからページを更新してください。

ブートストラップされたウェブサーバーをテストする

スタックに「CREATE_COMPLETE」と表示されたら、ウェブサーバーをテストします。

ウェブサーバーをテストするには
  1. CloudFormation コンソールで、スタックの [出力] タブに移動します。

  2. WebsiteURL 値をクリックし、新しいタブでウェブサーバーを開きます。

  3. カスタムウェブページに「Congratulations, you have successfully launched the AWS CloudFormation sample」というメッセージが表示されます。

注記

ページがすぐにロードされない場合は、1 分待ってからもう一度試してください。スタックに「CREATE_COMPLETE」と表示された後に、ブートストラッププロセスが完了する場合があります。

ブートストラップ問題のトラブルシューティング

ブートストラッププロセスが失敗した場合、またはウェブサーバーが動作しない場合の一般的な問題と解決策を以下に示します。

一般的な問題

  • スタックを作成できない[イベント] タブで特定のエラーメッセージを確認します。

  • ウェブサーバーにアクセスできないMyIP パラメータで IP アドレスが正しいことを確認します。末尾に必ず /32 を含めてください。

  • ブートストラッププロセスが失敗する – インスタンスは起動しても cfn-init で失敗する場合があります。「モニタリング」セクションの説明に従って、システムログを確認します。

リソースをクリーンアップする

継続的な課金を回避するには、スタックとそのリソースを削除してクリーンアップできます。

スタックとそのリソースを削除するには
  1. クラウドフォーメーション コンソールを開きます。

  2. [スタック] ページで、作成したスタックの名前の横にあるオプション [BootstrapTutorialStack] を選択し、続いて [削除]を選択します。

  3. 確認を求めるメッセージが表示されたら、[削除] を選択してください。

  4. [イベント] タブでスタック削除プロセスの進行状況をモニタリングします。BootstrapTutorialStack のステータスが DELETE_IN_PROGRESS に変わります。CloudFormation がスタックの削除を完了すると、リストからスタックが削除されます。

次のステップ

お疲れ様でした。CloudFormation で EC2 インスタンスをブートストラップする方法を学習しました。これで、以下のことが理解できました。

  • cfn-init ヘルパースクリプトの使用方法

  • ブートストラップのメタデータを構築する方法

  • パッケージのインストール、ファイルの作成、コマンドの実行、サービスの管理方法

  • ブートストラップの問題をモニタリングする方法

学習を継続するには:

  • Windows スタックをブートストラップする方法について学習します。詳細については、「Windows ベースの CloudFormation スタックのブートストラップ」を参照してください。

  • 複数の設定セットを使用して、より複雑なブートストラップシナリオを調べます。詳細については、「AWS CloudFormation テンプレートリファレンスガイド」の「cfn-init」および「AWS::CloudFormation::Init」を参照してください。

  • ブートストラップ完了ステータスを報告するための、cfn-signal について学習します。詳細については、「AWS CloudFormation テンプレートリファレンスガイド」の「cfn-signal」を参照してください。