

# 最初のスタックの作成
<a name="gettingstarted.walkthrough"></a>

このトピックでは、AWS マネジメントコンソール を使用して最初の CloudFormation スタックを作成する方法について説明します。このチュートリアルでは、基本的なAWSリソースのプロビジョニング、スタックイベントのモニタリング、出力の生成方法について説明します。

この例では、CloudFormation テンプレートは YAML で記述されています。YAML は、インフラストラクチャをコードとして定義するために広く使用されている人間が読める形式です。CloudFormation の詳細については、JSON 形式の他のテンプレートも表示されますが、このチュートリアルでは読みやすいように YAML が使われています。

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

**Topics**
+ [前提条件](#getting-started-prerequisites)
+ [コンソールを使用して CloudFormation スタックを作成する](#getting-started-create-stack)
+ [スタックの作成をモニタリング](#getting-started-monitor-stack-creation)
+ [ウェブサーバーをテストする。](#getting-started-test-web-server)
+ [トラブルシューティング](#getting-started-troubleshooting)
+ [クリーンアップ](#getting-started-clean-up)
+ [次のステップ](#getting-started-next-steps)

## 前提条件
<a name="getting-started-prerequisites"></a>
+ Amazon EC2、Amazon S3、および CloudFormation を使用するアクセス許可を持つ IAM ユーザーまたはロール、または管理ユーザーアクセスで AWS アカウント にアクセス可能である必要があります。
+ インターネットにアクセスできる Virtual Private Cloud (VPC) が必要です。このチュートリアルテンプレートには、新しい AWS アカウント に自動的に付属するデフォルトの VPC が必要です。デフォルトの VPC がない場合、または削除された場合は、このトピックのトラブルシューティングセクションで代替解決策を参照してください。

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

**コンソールで Hello world CloudFormation スタックを作成するには**

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

1. **[Create Stack]** (スタックの作成) を選択します。

1. **[スタックの作成]** ページで、**[Infrastructure Composer からビルド]** 、**[Infrastructure Composer で作成]** の順に選択します。これにより、CloudFormation コンソールモードで Infrastructure Composer に移動し、サンプルテンプレートをアップロードして検証できます。

1. サンプルテンプレートをアップロードして検証するには、次の手順を実行します。

   1. **[テンプレート]** を選択します。次に、次の CloudFormation テンプレートをコピーしてテンプレートエディタに貼り付けます。

      ```
      AWSTemplateFormatVersion: 2010-09-09
      Description: CloudFormation Template for WebServer with Security Group and EC2 Instance
      
      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: WebServer 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 via my IP address
            SecurityGroupIngress:
              - IpProtocol: tcp
                FromPort: 80
                ToPort: 80
                CidrIp: !Ref MyIP
      
        WebServer:
          Type: AWS::EC2::Instance
          Properties:
            ImageId: !Ref LatestAmiId
            InstanceType: !Ref InstanceType
            SecurityGroupIds:
              - !Ref WebServerSecurityGroup
            UserData: !Base64 |
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              systemctl enable httpd
              echo "<html><body><h1>Hello World!</h1></body></html>" > /var/www/html/index.html
      
      Outputs:
        WebsiteURL:
          Value: !Join
            - ''
            - - http://
              - !GetAtt WebServer.PublicDnsName
          Description: Website URL
      ```

      次のステップに進む前に、テンプレートを確認し、CloudFormation の主要な概念を把握しましょう。
      + この **`Parameters`** セクションでは、スタックを作成するときにテンプレートに渡すことができる値を宣言します。テンプレートで後で指定されるリソースは、これらの値を参照し、データを使用します。テンプレートにハードコーディングしたくない情報をパラメータに設定できます。また、デプロイする特定のアプリケーションまたは設定に固有の情報を指定する方法でもあります。
      + テンプレートでは次のパラメータを定義します。
        + **`LatestAmiId`** – AWS Systems Manager Parameter Store から最新の Amazon Linux 2 AMI ID を取得します。
        + **`InstanceType`** – EC2 インスタンスタイプの選択を許可します (デフォルト: `t2.micro`、`t3.micro`、`t2.micro` を選択できます）。
        + **`MyIP`** – HTTP アクセスの IP アドレス範囲を指定します (デフォルト: 0.0.0.0/0、任意の IP からのアクセスを許可できます）。
      + **`Resources`** セクションには、テンプレートで作成する AWS リソースの定義が含まれています。リソース宣言は、これらすべての構成を一度に指定するための効率的な方法です。テンプレートにリソース宣言を含めると、テンプレートを使用してスタックを作成することによって、宣言したすべてのリソースを作成および設定できます。同じテンプレートから新しいスタックを作成することで、同じ設定のリソースを複製することができます。
      + このテンプレートによって以下のリソースが作成されます。
        + **`WebServerSecurityGroup`** – 指定された IP 範囲からのポート 80 でのインバウンド HTTP トラフィックを許可する EC2 セキュリティグループ。
        + **`WebServer`** – 次の設定の EC2 インスタンス。
          + 最新の Amazon Linux 2 AMI を使用します。
          + 選択したインスタンスタイプを適用します
          + `SecurityGroupIds` プロパティに `WebServerSecurityGroup` を追加します。
          + Apache HTTP Server をインストールするためのユーザーデータスクリプトが含まれています
      + 論理名は、各リソースおよびパラメータ宣言の先頭に指定されます。例えば、`WebServerSecurityGroup` は EC2 セキュリティグループリソースに割り当てられた論理名です。`Ref` 関数は、テンプレート内の他の部分で、リソースやパラメータを論理名で参照するのに使用されます。あるリソースが別のリソースを参照すると、リソース間に依存関係が作成されます。
      + **`Outputs`** セクションは、スタックの作成後に返されるカスタム値を定義します。出力値を使用することで、スタック内のリソースに関する情報 (リソース識別子、URLなど) を取得できます。
      + テンプレートは 1 つの出力を定義します。
        + **`WebsiteURL`** – EC2 インスタンスのパブリック DNS 名を使用して構築された、デプロイ済のウェブサーバーの URL。`Join` 関数は、固定の `http://` と `PublicDnsName` 変数を 1 つの文字列に結合し、ウェブサーバーの完全な URL を簡単に出力するのに役立ちます。

   1. テンプレートをアップロードする前に、**[検証]** を選択して YAML コードが有効であることを確認します。

   1. 次に、**[テンプレートを作成]** を選択してテンプレートを作成し、S3 バケットに追加します。

   1. 開いたダイアログボックスから、後で削除できるように S3 バケットの名前を書き留めておきます。次に、**[確認]** を選択し、CloudFormation に進みます。移動先の CloudFormation コンソールには、テンプレートへの S3 パスが指定されています。

1. **[スタックの作成]** ページで、**[次へ]** を選択します。

1. **[スタックの詳細を指定]** ページの **[スタック名]** フィールドに名前を入力します。スタック名にスペースを含めることはできません。この例では **MyTestStack** を使用します。

1. **[パラメータ]** で、次のようにパラメータ値を指定します。
   + **LatestAmiId**: これはデフォルトで最新の Amazon Linux 2 AMI に設定されます。
   + **InstanceType**: EC2 インスタンスタイプとして **t2.micro** または **t3.micro** を選択します。
**注記**  
AWS を初めてご利用いただく場合、無料利用枠を使用して `t2.micro` インスタンスを起動し、12 か月間無料で使用できます (`t2.micro` が利用できないリージョンでは、無料利用枠で `t3.micro` インスタンスを使用できます)。
   + **MyIP**: 実際のパブリック IP アドレスを `/32` サフィックスで指定します。`/32` サフィックスは、単一の IP アドレスを許可するように指定するために CIDR 表記で使用されます。これは、この特定の IP アドレスとの間のトラフィックを許可し、他の IP アドレスは許可しないことを意味します。

1. **[次へ]** を 2 回選択して、**[名前、確認、および作成]** ページに進みます。このチュートリアルでは、**[スタックオプションの設定]** ページのデフォルトをそのままにしておくことができます。

1. スタックの情報を確認します。設定が適切であることを確認したら、[**Submit (送信)**] を選択します。

## スタックの作成をモニタリング
<a name="getting-started-monitor-stack-creation"></a>

[**送信**] を選択すると、CloudFormation はテンプレートで指定されたリソースの作成を開始します。新しいスタックである **MyTestStack** が、**CloudFormation** コンソールの上部のリストに表示されます。ステータスは `CREATE_IN_PROGRESS` である必要があります。スタックの詳細なステータスは、イベントを表示して確認できます。

**スタックのイベントを表示するには**

1. CloudFormation コンソールのリストで、スタック **MyTestStack** を選択します。

1. スタックの詳細ペインで、[**Events**] (イベント) タブを選択します。

   コンソールは自動的に更新され、60 秒ごとに最新のイベントがイベントリストに表示されます。

[**イベント**] タブには、スタックの作成の主要な各ステップが、最新のイベントが一番上になるように時間順に表示されます。

最初のイベント (イベントリストの一番下のイベント) は、スタック作成プロセスの開始です。

`2024-12-23 18:54 UTC-7 MyTestStack CREATE_IN_PROGRESS User initiated`

続いて、各リソースの作成の開始と終了を示すイベントが表示されます。たとえば、EC2 インスタンスの作成は、次のようなエントリになります。

`2024-12-23 18:59 UTC-7 WebServer CREATE_COMPLETE`

`2024-12-23 18:54 UTC-7 WebServer CREATE_IN_PROGRESS Resource creation initiated`

CloudFormation がリソースの作成を開始したことがレポートされると、`CREATE_IN_PROGRESS` イベントが記録されます。リソースが正常に作成されると、`CREATE_COMPLETE` イベントが記録されます。

CloudFormation によって正常にスタックが作成されると、[**Events**] (イベント) タブの上部に次のイベントが表示されます。

`2024-12-23 19:17 UTC-7 MyTestStack CREATE_COMPLETE`

CloudFormation がリソースを作成できない場合は、`CREATE_FAILED` イベントがレポートされます。また、デフォルトではスタックがロールバックされて、作成されたリソースがある場合はすべて削除されます。[**状況の理由**] 列には、失敗の原因となった問題が表示されます。

スタックが作成された後、**[リソース]** タブで作成した EC2 インスタンスとセキュリティグループが表示されます。

## ウェブサーバーをテストする。
<a name="getting-started-test-web-server"></a>

スタックが正常に作成されたら、CloudFormation コンソールの **[Outputs]** タブに移動します。**[WebsiteURL]** フィールドを探します。これには、EC2 インスタンスのパブリック URL が含まれます。

ブラウザを開き、**[WebsiteURL]** にリストされている URL に移動します。ブラウザに「"Hello World\$1"」とメッセージが表示されます。

これにより、EC2 インスタンスが Apache HTTP Server を実行し、基本的なウェブページを提供していることがわかります。

## トラブルシューティング
<a name="getting-started-troubleshooting"></a>

スタックの作成中にロールバックが発生した場合は、VPC の欠落が原因である可能性があります。この問題を解決する方法は次のとおりです。

### 使用可能なデフォルト VPC がない
<a name="getting-started-troubleshooting-no-default-vpc"></a>

このチュートリアルのテンプレートには、デフォルトの VPC が必要です。VPC またはサブネットの可用性エラーが原因でスタックの作成が失敗した場合、アカウントにデフォルトの VPC がない可能性があります。次のオプションがあります。
+ **新しいデフォルト VPC を作成する** – Amazon VPC コンソールを使用して新しいデフォルト VPC を作成できます。手順については、「*Amazon VPC ユーザーガイド*」の「[デフォルトの VPC を作成する](https://docs.aws.amazon.com/vpc/latest/userguide/work-with-default-vpc.html#create-default-vpc)」を参照してください。
+ **テンプレートを変更してサブネットを指定する** – デフォルト以外の VPC がある場合は、テンプレートを変更して VPC とサブネット ID を明示的に指定できます。テンプレートに次のパラメータを追加します。

  ```
    SubnetId:
      Description: The subnet ID to launch the instance into
      Type: AWS::EC2::Subnet::Id
  ```

  次に、`WebServer` リソースを更新してサブネット ID を含めます。

  ```
    WebServer:
      Type: AWS::EC2::Instance
      Properties:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        SecurityGroupIds:
          - !Ref WebServerSecurityGroup
        SubnetId: !Ref SubnetId
        UserData: !Base64 |
          #!/bin/bash
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          echo "<html><body><h1>Hello World!</h1></body></html>" > /var/www/html/index.html
  ```

  スタックを作成する際に、ウェブサーバーにアクセスできるようにするには、インターネットアクセスを持つサブネットを指定する必要があります。

## クリーンアップ
<a name="getting-started-clean-up"></a>

不要なサービスに対して課金されていないことを確認するために、スタックとそのリソースを削除して、クリーンアップすることができます。スタックのテンプレートを保存する S3 バケットを削除することもできます。

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

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

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

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

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

サンプルテンプレートの使用が終了し、Amazon S3 バケットが不要になったら削除します。バケットを削除するには、パケットを空にする必要があります。バケットを空にすると、バケット内のすべてのオブジェクトが削除されます。

**Amazon S3 バケットを空にして削除するには**

1. [Amazon S3 コンソール](https://console.aws.amazon.com/s3/)を開きます。

1. コンソールの左側のナビゲーションペインで、[**バケット**] を選択します。

1. **[バケット]** リストで、このチュートリアル用に作成したバケットの名前の横にあるオプションを選択し、**[空]** を選択します。

1. **[バケットを空にする]** ページで、テキストフィールドに **permanently delete** と入力して、**[空にする]** をクリックします。

1. [**バケットを空にする: ステータス**] ページで、バケットを空にするプロセスの進行状況をモニタリングします。

1. バケットリストに戻るには、[**Exit (終了)**] を選択します。

1. バケットの名前の横にあるオプションを選択し、**[削除]** を選択します。

1. 確認を求められたら、バケットの名前を入力し、**[バケットを削除]** を選択します。

1. **[バケット]** リストで、バケット削除プロセスの進捗状況を確認します。Amazon S3 がバケットの削除を完了すると、バケットはリストから消えます。

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

お疲れ様でした。スタックを正常に作成し、その作成をモニタリングし、その出力を使用しました。

学習を継続するには: 
+ 独自のテンプレートを作成できるように、テンプレートについて詳しく学習してください。詳細については、「[CloudFormation テンプレートの使用](template-guide.md)」を参照してください。
+ テンプレート作成の実践的な演習については、「[Getting Started with CloudFormation](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US)」ワークショップをお試しください。
+ 「[Getting Started with CloudFormation](https://catalog.us-east-1.prod.workshops.aws/workshops/df7f72cf-4f10-4664-acb6-b30dc8d4bcf0/en-US)」の短縮版については、「[Amazon EC2 にアプリケーションをデプロイする](deploying.applications.md)」を参照してください。このトピックでは、CloudFormation ヘルパースクリプト `cfn-init` を使用して Amazon EC2 インスタンスをブートストラップする場合と同じシナリオについて説明します。