

# Amazon EC2 にアプリケーションをデプロイする
<a name="deploying.applications"></a>

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

CloudFormation には、`cloud-init` に基づく一連のヘルパースクリプト (`cfn-init`、`cfn-signal`、`cfn-get-metadata`、および `cfn-hup`) が含まれています。同じテンプレートに存在する Amazon EC2 インスタンスにアプリケーションをインストールし、設定および更新するには、CloudFormation テンプレートからこれらのヘルパースクリプトを呼び出します 詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[CloudFormation ヘルパースクリプトリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html)」を参照してください。

[入門チュートリアル](gettingstarted.walkthrough.md)では、基本的な bash スクリプトで `UserData` を使用してシンプルなウェブサーバーを作成しました。これは簡単な「Hello World」ページでは機能しますが、実際のアプリケーションでは次のようなより高度な設定が必要になることが多くあります。
+ 正しい順序でインストールされた複数のソフトウェアパッケージ。
+ 特定のコンテンツで作成された複雑な設定ファイル。
+ 自動的に開始し、実行するよう設定されたサービス。
+ セットアッププロセスでのエラー処理と検証。

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

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

**注記**  
CloudFormation は無料で使用できますが、作成した Amazon EC2 リソースに対しては課金されます。ただし、AWS を初めて使用する場合は、 [無料利用枠](https://aws.amazon.com/free/)を利用して、この学習プロセス中のコストを最小に抑えるか無料にできます。

**Topics**
+ [前提条件](#bootstrapping-tutorial-prerequisites)
+ [ブートストラップの概念について](#bootstrapping-tutorial-understand-concepts)
+ [シンプルなブートストラップの例から始める](#bootstrapping-tutorial-simple-example)
+ [ファイルとコマンドの追加](#bootstrapping-tutorial-add-complexity)
+ [ネットワークセキュリティの強化](#bootstrapping-tutorial-security-group)
+ [完全なブートストラップテンプレート](#bootstrapping-tutorial-complete-template)
+ [コンソールを使用してスタックを作成する](#bootstrapping-tutorial-create-stack)
+ [ブートストラッププロセスをモニタリングする](#bootstrapping-tutorial-validate-bootstrap)
+ [ブートストラップされたウェブサーバーをテストする](#bootstrapping-tutorial-test-web-server)
+ [ブートストラップ問題のトラブルシューティング](#bootstrapping-tutorial-troubleshooting)
+ [リソースをクリーンアップする](#bootstrapping-tutorial-clean-up)
+ [次のステップ](#bootstrapping-tutorial-next-steps)

## 前提条件
<a name="bootstrapping-tutorial-prerequisites"></a>
+ [最初のスタックの作成](gettingstarted.walkthrough.md) チュートリアルを完了しているか、CloudFormation の基本と同等の経験を有している必要があります。
+ Amazon EC2 および CloudFormation を使用するアクセス許可を持つ IAM ユーザーまたはロール、または管理ユーザーアクセスで AWS アカウント にアクセスできる必要があります。
+ インターネットにアクセスできる Virtual Private Cloud (VPC) が必要です。このチュートリアルテンプレートには、新しい AWS アカウント に自動的に付属するデフォルトの VPC が必要です。デフォルトの VPC がない場合、またはデフォルトの VPC が削除された場合は、[最初のスタックの作成](gettingstarted.walkthrough.md) チュートリアルのトラブルシューティングセクションで代替ソリューションを参照してください。

## ブートストラップの概念について
<a name="bootstrapping-tutorial-understand-concepts"></a>

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

### `cfn-init` ヘルパースクリプト
<a name="bootstrapping-tutorial-cfn-init-overview"></a>

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

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

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

1. `cfn-init` を `UserData` スクリプトから呼び出します。

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

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

### メタデータ構造
<a name="bootstrapping-tutorial-metadata-structure"></a>

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

## シンプルなブートストラップの例から始める
<a name="bootstrapping-tutorial-simple-example"></a>

まず、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
            systemd:
              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` を呼び出します。

## ファイルとコマンドの追加
<a name="bootstrapping-tutorial-add-complexity"></a>

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

### ファイルを作成する
<a name="bootstrapping-tutorial-files-section"></a>

「`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>
```

### コマンドの実行
<a name="bootstrapping-tutorial-commands-section"></a>

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

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

## ネットワークセキュリティの強化
<a name="bootstrapping-tutorial-security-group"></a>

ウェブサーバーを設定するため、ウェブトラフィック (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
```

## 完全なブートストラップテンプレート
<a name="bootstrapping-tutorial-complete-template"></a>

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

```
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:
            systemd:
              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
```

## コンソールを使用してスタックを作成する
<a name="bootstrapping-tutorial-create-stack"></a>

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

**スタックテンプレートを起動するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

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

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

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

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

1. **[パラメータ]** で、次の操作を行います。
   + **LatestAmiId**: デフォルト値のままにします。
   + **InstanceType**: EC2 インスタンスタイプとして **t2.micro** または **t3.micro** を選択します。
   + **MyIP**: パブリック IP アドレスを `/32` サフィックスを使用して入力します。

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

## ブートストラッププロセスをモニタリングする
<a name="bootstrapping-tutorial-validate-bootstrap"></a>

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

**ブートストラップの進行状況をモニタリングするには**

1. CloudFormation コンソールでスタックを選択し、**[イベント]** タブを開きます。

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

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

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

**ブートストラップログを表示するには (オプション)**

1. [EC2 コンソール](https://console.aws.amazon.com/ec2/)を開いてインスタンスを確認します。

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

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

## ブートストラップされたウェブサーバーをテストする
<a name="bootstrapping-tutorial-test-web-server"></a>

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

**ウェブサーバーをテストするには**

1. CloudFormation コンソールで、スタックの **[出力]** タブに移動します。

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

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

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

## ブートストラップ問題のトラブルシューティング
<a name="bootstrapping-tutorial-troubleshooting"></a>

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

### 一般的な問題
<a name="bootstrapping-tutorial-common-issues"></a>
+ **スタックを作成できない** – **[イベント]** タブで特定のエラーメッセージを確認します。
+ **ウェブサーバーにアクセスできない** – `MyIP` パラメータで IP アドレスが正しいことを確認します。末尾に必ず `/32` を含めてください。
+ **ブートストラッププロセスが失敗する** – インスタンスは起動しても `cfn-init` で失敗する場合があります。「モニタリング」セクションの説明に従って、システムログを確認します。

## リソースをクリーンアップする
<a name="bootstrapping-tutorial-clean-up"></a>

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

**スタックとそのリソースを削除するには**

1. [ クラウドフォーメーション コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

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

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

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

## 次のステップ
<a name="bootstrapping-tutorial-next-steps"></a>

お疲れ様でした。CloudFormation で EC2 インスタンスをブートストラップする方法を学習しました。これで、以下のことが理解できました。
+ `cfn-init` ヘルパースクリプトの使用方法
+ ブートストラップのメタデータを構築する方法
+ パッケージのインストール、ファイルの作成、コマンドの実行、サービスの管理方法
+ ブートストラップの問題をモニタリングする方法

学習を継続するには: 
+ 実行されているスタックを更新し、`cfn-hup` ヘルパースクリプトを使用する方法について説明します。詳細については、「[CloudFormation のスタックを更新する](updating.stacks.walkthrough.md)」を参照してください。
+ Windows スタックをブートストラップする方法について学習します。詳細については、「[Windows ベースの CloudFormation スタックのブートストラップ](cfn-windows-stacks-bootstrapping.md)」を参照してください。
+ 複数の設定セットを使用して、より複雑なブートストラップシナリオを調べます。詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-init.html)」および「[AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)」を参照してください。
+ ブートストラップ完了ステータスを報告するための、`cfn-signal` について学習します。詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[cfn-signal](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-signal.html)」を参照してください。