

# 別の CloudFormation スタックのリソース出力を参照する
<a name="walkthrough-crossstackref"></a>

このチュートリアルでは、ある CloudFormation スタックの出力を別のスタック内で参照して、モジュール性と再利用性を高めたテンプレートを作成する方法について説明します。

1 つのスタックにすべてのリソースを含めるのではなく、必要な AWS リソースをいくつかのスタックに分けて作成します。その後、他のスタックから必要なリソース出力を参照できます。クロススタックの参照を出力に制限することにより、他のスタックから参照されるスタックの部分を制御します。

たとえば、VPC のあるネットワークスタック、セキュリティグループ、パブリックウェブアプリケーションのサブネット、別個のパブリックウェブアプリケーションスタックがあるとします。ウェブアプリケーションで、ネットワークスタックのセキュリティグループとサブネットが使用されるようにするには、ウェブアプリケーションスタックがネットワークからのリソース出力を参照できるようにクロススタック参照を作成する必要があります。クロススタック参照を使用すると、ウェブアプリケーションスタックの所有者がネットワーキングのルールや資産を作成または維持する必要がなくなります。

クロススタックの参照を作成するには、`Export` 出力フィールドを使用してエクスポートのリソース出力の値を設定します。次に、値を`Fn::ImportValue` 組み込み関数を使用して値をインポートします。詳細については、「[デプロイされた CloudFormation スタックからエクスポートされた出力を取得する](using-cfn-stack-exports.md)」を参照してください。

**注記**  
CloudFormation は無料サービスです。ただし、スタックに追加する AWS リソースにはそれぞれ現在の料金が課金されます。AWS の料金の詳細については、[各製品の詳細ページ](https://aws.amazon.com/)を参照してください。

**Topics**
+ [サンプルテンプレートを使用してネットワークスタックを作成する](#walkthrough-crossstackref-create-vpc-stack)
+ [サンプルテンプレートを使用してウェブアプリケーションスタックを作成する](#walkthrough-crossstackref-create-ec2-stack)
+ [スタックが設計どおりに機能することを検証する](#walkthrough-crossstackref-verify)
+ [AMI マッピングエラーのトラブルシューティング](#walkthrough-crossstackref-troubleshooting-ami)
+ [リソースのクリーンアップ](#walkthrough-crossstackref-clean-up)

## サンプルテンプレートを使用してネットワークスタックを作成する
<a name="walkthrough-crossstackref-create-vpc-stack"></a>

このチュートリアルを開始する前に、IAM アクセス権限があり、Amazon VPC、Amazon EC2、CloudFormation のいずれのサービスも使用できることを確認してください。

ネットワークスタックは、ウェブアプリケーションスタックで使用する VPC、セキュリティグループ、サブネットで構成されます。これらのリソースに加えて、パブリックアクセスを可能にするインターネットゲートウェイとルーティングテーブルも、ネットワークスタックによって作成されます。

ウェブアプリケーションスタックの作成前に、このスタックを作成する必要があります。先にウェブアプリケーションスタックを作成した場合は、使用できるセキュリティグループやサブネットがない状態になります。

スタックテンプレートは、次の URL から入手できます: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template)。スタックによって作成されるリソースを表示するには、リンクを選択します。これにより、テンプレートが開きます。`Outputs` セクションでは、サンプルのテンプレートがエクスポートするネットワーキングリソースを表示できます。他のスタックからネットワーキングリソースをエクスポートした場合、エクスポートされたリソース名には、スタック名がプレフィックスとして付けられます。ユーザーがネットワーキングリソースをインポートするときは、リソースをどのスタックからインポートするかを指定できます。

**ネットワークスタックを作成するには**

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

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[テンプレートの準備完了]** を選択し、**[テンプレートを指定]** セクションで **[Amazon S3 URL]** を選択します。

1. **Amazon S3 URL **の場合は、次の URL を貼り付けます: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template**。

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

1. [**スタックの名前**] に **SampleNetworkCrossStack** を入力し、[**次へ**] を選択します。
**注記**  
このスタックの名前をメモしておきます。ウェブアプリケーションスタックを起動するときにこのスタック名が必要になります。

1. [**次へ**] を選択します。このチュートリアルでは、タグの追加も詳細設定の指定も不要です。

1. スタック名とテンプレート URL が正しいことを確認し、[**スタックの作成**] を選択します。

   CloudFormation によってスタックが作成されるまでに数分かかることもあります。ウェブアプリケーションスタックの作成に進む前に、すべてのリソースが正しく作成されるまで待ちます。

1. 進捗状況を監視するには、スタックイベントを確認します。詳細については、「[スタックの進行状況を監視する](monitor-stack-progress.md)」を参照してください。

## サンプルテンプレートを使用してウェブアプリケーションスタックを作成する
<a name="walkthrough-crossstackref-create-ec2-stack"></a>

ウェブアプリケーションスタックによって、ネットワークスタックのセキュリティグループとサブネットを使用する EC2 インスタンスが作成されます。

このスタックは、ネットワークスタックと同じ AWS リージョン に作成する必要があります。

スタックテンプレートは、次の URL から入手できます: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template)。スタックによって作成されるリソースを表示するには、リンクを選択します。これにより、テンプレートが開きます。`Resources` セクションで、EC2 インスタンスのプロパティを参照してください。`Fn::ImportValue` 関数を使用することで、別のスタックからどのようにネットワーキングリソースがインポートされたかを確認できます。

**ウェブアプリケーションスタックを作成するには**

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[テンプレートの準備完了]** を選択し、**[テンプレートを指定]** セクションで **[Amazon S3 URL]** を選択します。

1. **Amazon S3 URL **の場合は、次の URL を貼り付けます: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template**。

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

1. [**スタックの名前**] に **SampleWebAppCrossStack** を入力します。[**パラメータ**] セクションで、[**NetworkStackName**] パラメータのデフォルト値を使用し、[**次へ**] を選択します。

   サンプルテンプレートでは、パラメータ値を使用してどのスタックから値をインポートするかを指定しています。

1. [**次へ**] を選択します。このチュートリアルでは、タグの追加も詳細設定の指定も不要です。

1. スタック名とテンプレート URL が正しいことを確認し、[**スタックの作成**] を選択します。

   CloudFormation によってスタックが作成されるまでに数分かかることもあります。

## スタックが設計どおりに機能することを検証する
<a name="walkthrough-crossstackref-verify"></a>

スタックの作成後、そのリソースを表示し、インスタンス ID をメモしておきます。スタックリソースの表示の詳細については、「[CloudFormation コンソールからスタック情報を表示する](cfn-console-view-stack-data-resources.md)」を参照してください。

インスタンスのセキュリティグループとサブネットを確認するには、[Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)でインスタンスのプロパティを確認します。インスタンスが `SampleNetworkCrossStack` スタックからセキュリティグループとサブネットを使用しているなら、クロススタックの参照が正常に作成されています。

コンソールを使用してスタック出力と例のウェブサイト URL を表示し、てウェブアプリケーションが実行中であることを確認します。詳細については、「[CloudFormation コンソールからスタック情報を表示する](cfn-console-view-stack-data-resources.md)」を参照してください。

## AMI マッピングエラーのトラブルシューティング
<a name="walkthrough-crossstackref-troubleshooting-ami"></a>

エラー `Template error: Unable to get mapping for AWSRegionArch2AMI::[region]::HVM64` が表示された場合、テンプレートには AWS リージョン の AMI マッピングが含まれていません。マッピングを更新する代わりに、Systems Manager の公開パラメータを使用して最新の AMI を動的に参照することをお勧めします。

1. `SampleWebAppCrossStack` テンプレートを [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template) からローカルマシンにダウンロードします。

1. `AWSRegionArch2AMI` マッピングセクション全体を削除します。

1. 次の Systems Manager パラメータを追加します。

   ```
   "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"
     }
   ```

1. 既存の `ImageId` 参照を置き換えます。

   ```
   "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" } , "HVM64" ] }, 
   ```

   次と置き換えます。

   ```
   "ImageId": { "Ref": "LatestAmiId" },
   ```

   このパラメータは、スタックをデプロイするリージョンの最新の Amazon Linux 2 AMI に自動的に解決されます。

   他の Linux ディストリビューションの場合は、適切なパラメータパスを使用します。詳細については、「*AWS Systems Manager ユーザーガイド*」の「[Parameter Store でのパブリックパラメータの検出](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)」を参照してください。

1. 変更したテンプレートをアカウントの S3 バケットにアップロードします。

   ```
   aws s3 cp SampleWebAppCrossStack.template s3://amzn-s3-demo-bucket/
   ```

1. スタックを作成するときは、サンプル URL の代わりに S3 テンプレート URL を指定します。

## リソースのクリーンアップ
<a name="walkthrough-crossstackref-clean-up"></a>

不要なサービスに対して課金されないように、スタックを削除します。

**スタックを削除するには**

1. CloudFormation コンソールで、`SampleWebAppCrossStack` スタックを選択します。

1. [**アクション**] を選択してから、[**スタックの削除**] を選択します。

1. 確認メッセージで、[**削除**] を選択します。

1. このスタックの削除後、`SampleNetworkCrossStack` スタックに対して同じ手順を繰り返します。
**注記**  
CloudFormation によって `SampleWebAppCrossStack` スタックが完全に削除されるまで待ちます。EC2 インスタンスが VPC でまだ実行中であれば、CloudFormation は `SampleNetworkCrossStack` スタックの VPC を削除しません。