diff --git a/content/intermediate/index.ja.md b/content/intermediate/index.ja.md index 1def10fed..9e94e11e4 100644 --- a/content/intermediate/index.ja.md +++ b/content/intermediate/index.ja.md @@ -3,8 +3,8 @@ title: "中級" weight: 40 --- -ワークショップの**中級**の部分へようこそ。このパートでは、より高度なCloudFormationの概念を紹介します。 +ワークショップの**中級編**へようこそ。このパートでは、より高度な CloudFormation の概念を紹介します。 -**ネストされ、階層化されたスタック**を作成する方法と、Lambda関数を**パッケージ化してデプロイ**する方法を学びます。 +**ネストされたスタックや階層化されたスタック**を作成する方法、Lambda 関数を**パッケージ化してデプロイ**する方法等を学びます。 -ワークショップの**中級**の他のセクションでは、あなたが書いたルールに従い、JSONやYAML形式のPolicy as Code検証を行う[AWS CloudFormation Guard](https://github.com/aws-cloudformation/cloudformation-guard) などのトピックについて学びます。 +**中級編ワークショップ**の各セクションでは、独自で書いたルールに従い、JSON や YAML 形式の Policy as Code 検証を行う [AWS CloudFormation Guard](https://github.com/aws-cloudformation/cloudformation-guard) 等のトピックについて学びます。 diff --git a/content/intermediate/operations/drift-detection/index.ja.md b/content/intermediate/operations/drift-detection/index.ja.md index e8c54b09e..c9dbee5ca 100644 --- a/content/intermediate/operations/drift-detection/index.ja.md +++ b/content/intermediate/operations/drift-detection/index.ja.md @@ -5,9 +5,9 @@ weight: 500 ### 概要 -[AWS CloudFormation](https://aws.amazon.com/cloudformation/) を使用してリソースをプロビジョニングすることを選択した場合、必要に応じて CloudFormation を使用してリソースの設定を長期にわたって維持することになります。その後、そのようなリソースを CloudFormation の範囲外で管理することを選択した場合 (例えば、[AWS マネジメントコンソール](https://aws.amazon.com/console/)、[AWS Command Line Interface](https://aws.amazon.com/cli/) (AWS CLI)、[AWS SDK](https://aws.amazon.com/getting-started/tools-sdks/)、[AWS API](https://docs.aws.amazon.com/general/latest/gr/aws-apis.html))、リソースの設定とCloudFormationの設定と差分ができてしまいます。 +[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/) を使用してリソースをプロビジョニングすることを選択した場合、必要に応じて CloudFormation を使用してリソースの設定を長期にわたって維持することになります。その後、そのようなリソースを CloudFormation の範囲外で管理することを選択した場合 (例えば、[AWS マネジメントコンソール](https://aws.amazon.com/jp/console/)、[AWS Command Line Interface](https://aws.amazon.com/jp/cli/) (AWS CLI)、[AWS SDK](https://aws.amazon.com/jp/developer/tools/)、[AWS API](https://docs.aws.amazon.com/general/latest/gr/aws-apis.html))、リソースの設定と CloudFormation の設定と差分ができてしまいます。 -CloudFormation は [ドリフト検出](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html) を提供しています。これは、リソースの現在の構成と、リソースの作成または更新に使用したテンプレートで宣言した構成との違いに関する情報を提供します。ドリフト検出の結果には、影響を受けるリソースと、現在の状態とテンプレートの違いが表示されます。その後、リソースを元の設定に戻すか、テンプレートと CloudFormation スタックを更新して新しい希望の状態を反映させることができます。 +CloudFormation は[ドリフト検出](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html) を提供しています。これは、リソースの現在の構成と、リソースの作成または更新に使用したテンプレートで宣言した構成との違いに関する情報を提供します。ドリフト検出の結果には、影響を受けるリソースと、現在の状態とテンプレートの違いが表示されます。その後、リソースを元の設定に戻すか、テンプレートと CloudFormation スタックを更新して新しい希望の状態を反映させることができます。 ### 取り上げるトピック @@ -21,7 +21,7 @@ CloudFormation は [ドリフト検出](https://docs.aws.amazon.com/AWSCloudForm ### ラボを開始 -[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) テーブルと [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/) キューを新しいスタックとして含む AWS CloudFormation テンプレートの例をデプロイします。次に、プロビジョニングされたリソースにいくつかの設定変更を行い、ドリフト検出 を使用してそれらを特定します。次に、リソース構成を修正するか、新しい構成を反映するようにテンプレートを更新することで、ドリフトを解決します。 +[Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/) テーブルと [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/jp/sqs/) キューを新しいスタックとして含む AWS CloudFormation テンプレートの例をデプロイします。次に、プロビジョニングされたリソースにいくつかの設定変更を行い、ドリフト検出を使用して変更を特定します。次に、リソース構成を修正するか、新しい構成を反映するようにテンプレートを更新することで、ドリフトを解決します。 開始するには、次の手順に従います。 @@ -55,8 +55,8 @@ Resources: ``` 3. テンプレート内のリソース例をよく理解してください。 - 1. DynamoDB [テーブル](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) には、正常に作成するための `KeySchema` と`AttributeDefinitions` プロパティの最小限の定義があります。ワークショップ中は、テーブルにデータを保存したり、テーブルからデータを取得したりすることはありません。 - 2. SQS [キュー](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html) の`MessageRetentionPeriod` は 4 日間 (秒単位で表現) です。この値は [デフォルト](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-messageretentionperiod) ですが、CloudFormation はテンプレートで明示的に宣言したプロパティに対してのみドリフトを評価することに注意してください。このプロパティを含めない場合、CloudFormation は後でリソースの変更を報告しません。 + 1. DynamoDB [テーブル](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) には、正常に作成するための `KeySchema` と `AttributeDefinitions` プロパティの最小限の定義があります。ワークショップ中は、テーブルにデータを保存したり、テーブルからデータを取得したりすることはありません。 + 2. SQS [キュー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html) の `MessageRetentionPeriod` は 4 日間 (秒単位で表現) です。この値は [デフォルト](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-messageretentionperiod) ですが、CloudFormation はテンプレートで明示的に宣言したプロパティに対してのみドリフトを評価することに注意してください。このプロパティを含めない場合、CloudFormation は後でリソースの変更を報告しません。 次のステップでは、AWS CloudFormation コンソールを使用して、このテンプレートを使用して新しいスタックを作成します。 @@ -81,12 +81,12 @@ Resources: このステップでは、CloudFormation ドリフト検出を使用して、元のテンプレートと比較して `Table1` リソースに加えられた変更を特定します。 -1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。必要な場合は、**スタック**メニュー項目を選択してスタックを確認してください。 +1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。必要に応じて、**スタック**メニュー項目を選択してスタックを確認します。 2. 前のステップで作成したスタック (例えば、`drift-detection-workshop`) を選択します。 3. **スタックアクション**から、**ドリフトの検出**を選択します。 4. **スタックの情報**タブに移動し、**ドリフトステータス**フィールドに `DRIFTED` と表示されるまでページを更新します。なお、ドリフト検出が完了するまでに少し時間がかかります。 5. **スタックアクション**から、**ドリフト結果を表示**を選択します。 -6. ドリフトステータスページが表示されます。画面では、`Table1` が変更され、`Queue1`がテンプレートと同期されていることがわかります。 +6. ドリフトステータスページが表示されます。画面では、`Table1` が変更され、`Queue1` がテンプレートと同期されていることがわかります。 7. **リソースのドリフトステータス**ビューから `Table1` を選択し、次に**ドリフトの詳細を表示**を選択します。 8. 次に、`Table1` のドリフトの詳細を確認すると、3つの差分があります。コンソールで行った変更に応じて `BillingMode` プロパティが変更され、`ProvisionedThroughput` の値もその変更の一部として DynamoDB によって更新されました。**違い**ビューで各プロパティを選択すると、関連するテンプレートの違いが強調表示されます。 @@ -96,7 +96,7 @@ Resources: 2. **Table1** のエントリを選択し、**追加の設定**タブに移動します。 3. **編集**を選択します。 4. **プロビジョニング**キャパシティモードを選択します。 -5. **読み取りキャパシティー**と**書き込みキャパシティー**の両方で、**Auto Scaling**を**オフ**にします。 +5. **読み取りキャパシティー**と**書き込みキャパシティー**の両方で、**Auto Scaling** を**オフ**にします。 6. 読み取りキャパシティーと書き込みキャパシティーの**プロビジョンドキャパシティーユニット**両方に `1` を入力します。 7. **変更を保存**をクリックします。 @@ -111,7 +111,7 @@ Resources: 2. 必要に応じて、左側の折りたたまれたメニューを選択して展開し、**キュー**を選択します。 3. スタックの名前で始まる名前のキュー (例: `drift-detection-workshop`) を見つけて選択します。 4. **編集**を選択します。 -5. **メッセージ保持期間**を `4` ではなく`2` 日に変更し、ページの一番下にある**保存**をクリックします。 +5. **メッセージ保持期間**を `4` ではなく `2` 日に変更し、ページの一番下にある**保存**をクリックします。 このステップでは、CloudFormation を使用してキューリソースのドリフトを検出します。 @@ -122,7 +122,7 @@ Resources: 5. **スタックアクション**から、**ドリフト結果を表示**を選択します。 6. ドリフトステータスページが表示され、`Queue1` が変更されたことが示されます。 7. `Queue1` を選択し、**ドリフトの詳細を表示**を選択します。 -8. `Queue1` のドリフトの詳細を確認します。差分が1つあることが確認できます。コンソールで行った変更に応じて、`MessageRetentionPeriod`プロパティが変更されました。 +8. `Queue1` のドリフトの詳細を確認します。差分が1つあることが確認できます。コンソールで行った変更に応じて、`MessageRetentionPeriod` プロパティが変更されました。 次に、リソースの新しい状態に合わせてテンプレートを更新し、スタックを同期し直します。 @@ -130,7 +130,7 @@ Resources: 2. `Queue1` の `MessageRetentionPeriod` を、前のステップで見たドリフト詳細ページの**現在の値** 列に表示された値と一致するように変更します。テンプレートの `MessageRetentionPeriod` の値を `172800` に設定します。これは `2` 日の秒数です。 3. テンプレートファイルを保存します。 4. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。 -5. 以前と同じようにスタックを選択してください。 +5. 前で実施した操作と同様に、スタックを選択します。 6. **更新**を選択します。 7. **既存テンプレートを置き換える**を選択し、**テンプレートファイルのアップロード**を選択します。 8. **ファイルを選択**を使用して、更新されたテンプレートファイルを選択します。 @@ -148,12 +148,12 @@ Resources: ### チャレンジ -この演習では、このラボの前半で得た知識と、前回の [リソースインポート](/intermediate/operations/resource-importing.html) のラボで得た知識を使用して、CloudFormation スタックの範囲外でリソースが更新された場合の問題を解決します。その構成に差分ができましたが、リソースに [中断](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html) を引き起こさずにCloudFormationスタックを一致するように更新することはできません。スタックからリソースを削除し、更新されたプロパティを使用してリソースをインポートする必要があります。 +この演習では、このラボの前半で得た知識と、前回の [リソースインポート](/intermediate/operations/resource-importing.html) のラボで得た知識を使用して、CloudFormation スタックの範囲外でリソースが更新された場合の問題を解決します。その構成に差分が出ましたが、リソースを [中断](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html) せずに CloudFormation スタックを一致するように更新することはできません。スタックからリソースを削除し、更新されたプロパティを使用してリソースをインポートする必要があります。 はじめに、以下の手順に従ってください。 1. お気に入りのエディターで `drift-detection-challenge.yaml` ファイルを開きます。 -2. 以下の内容を `drift-detection-challenge.yaml`テンプレートに追加し、ファイルを保存します。このテンプレートは、最新の Amazon Linux 2 AMI を使用して [Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2) インスタンスを起動し、初回起動時に `Hello World` と出力されるスクリプトを実行するように設定します。 +2. 以下の内容を `drift-detection-challenge.yaml` テンプレートに追加し、ファイルを保存します。このテンプレートは、最新の Amazon Linux 2 AMI を使用して [Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2) インスタンスを起動し、初回起動時に `Hello World` と出力されるスクリプトを実行するように設定します。 ```yaml Parameters: @@ -175,7 +175,7 @@ Resources: Type: AWS::S3::Bucket ``` -::alert[この `UserData` スクリプトは、インスタンスの初回起動時にのみ実行されます。起動のたびにスクリプトを実行することで [設定を作成する](https://aws.amazon.com/premiumsupport/knowledge-center/execute-user-data-ec2/) のも良いですが、今回のワークショップではテンプレートの複雑さを低く抑えるため、このテンプレートでは簡単な内容だけを紹介します。] +::alert[この `UserData` スクリプトは、インスタンスの初回起動時にのみ実行されます。起動のたびにスクリプトを実行することで [設定を作成する](https://repost.aws/ja/knowledge-center/execute-user-data-ec2) のも良いですが、今回のワークショップではテンプレートの複雑さを低く抑えるため、このテンプレートでは簡単な内容だけを紹介します。] 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。 2. **スタックの作成**から、**新しいリソースを使用 (標準)** を選択します。 @@ -183,9 +183,9 @@ Resources: 4. スタック名 (例えば、`drift-detection-challenge`) を入力し、**次へ**をクリックします。 5. **スタックオプションの設定**ページで、**次へ**をクリックします。 6. 次のページで、**送信**をクリックします。 -7. スタックが作成されたら、`drift-detection-challenge` スタックを選択し、**リソース**を選択します。例えば、`i-1234567890abcdef0`のような形式で記述された、`Instance1`の**物理 ID**をメモしておきます。 +7. スタックが作成されたら、`drift-detection-challenge` スタックを選択し、**リソース**を選択します。例えば、`i-1234567890abcdef0` のような形式で記述された、`Instance1` の**物理 ID** をメモしておきます。 -次に、ドリフトを導入した最初のラボと同様の方法でこのリソースを変更します。変更する `UserData` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata) ではまずインスタンスを停止する必要があるため、この変更により中断が発生します。出力されるメッセージを `Hello Universe` に変更します。 +次に、ドリフトを導入した最初のラボと同様の方法でこのリソースを変更します。変更する `UserData` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata) ではまずインスタンスを停止する必要があるため、この変更により中断が発生します。出力されるメッセージを `Hello Universe` に変更します。 1. [Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/) に移動します。 2. **インスタンス** セクションを見つけて、上に記録された ID のインスタンスを選択します。 @@ -211,10 +211,10 @@ echo Hello Universe 4.ドリフト検出が完了するまでに少し時間がかかります。**ドリフトステータス** フィールドに `Drifted` と表示されるまで、スタック情報ページを更新します。 5. **スタックアクション**から、**ドリフト結果を表示**を選択します。 6. ドリフトステータスページが表示され、`Instance1` が変更されたことが示されます。 -7. `Instance1`を選択し、**ドリフトの詳細を表示**を選択します。 -8. ドリフトの詳細は、`UserData`プロパティが変更されたことを示しています。`UserData` プロパティは Base64 エンコーディングを使用して保存されるため、行った正確な変更は画面上では分かりません。 +7. `Instance1` を選択し、**ドリフトの詳細を表示**を選択します。 +8. ドリフトの詳細は、`UserData` プロパティが変更されたことを示しています。`UserData` プロパティは Base64 エンコーディングを使用して保存されるため、行った正確な変更は画面上では分かりません。 -::alert[ツールを使ってBase64のテキストをデコードし、それが表すシェルスクリプトを見ることができます。例えば、 Linux では、`base64` コマンドラインツールを使用して次のように処理できます。macOSなどの一部の実装では、`base64`コマンドのオプションとして `-d` の代わりに `-D` を使用していることに注意してください。] +::alert[ツールを使って Base64 のテキストをデコードし、それが表すシェルスクリプトを見ることができます。例えば、 Linux では、`base64` コマンドラインツールを使用して次のように処理できます。macOSなどの一部の実装では、`base64` コマンドのオプションとして `-d` の代わりに `-D` を使用していることに注意してください。] 例えば、次のコマンドを実行すると、 @@ -229,18 +229,18 @@ echo "IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvIEhlbGxvIFdvcmxkCg==" | base64 -d echo Hello World ::: -::alert[UserData の base64 テキストを第三者 Web サイトを使用してエンコードまたはデコードする場合、特に機密情報が含まれている可能性がある場合は注意が必要です。]{type="warning"} +::alert[UserData の base64 テキストを外部の Web サイトを使用してエンコードまたはデコードする場合、特に機密情報が含まれている可能性がある場合は注意が必要です。]{type="warning"} ここでのタスクは、それ以上中断することなく、スタックをリソースの新しい状態で更新することです。 :::expand{header= "ヒントが必要ですか?"} -* リソースをスタックからデタッチし、`UserData`を修正して再度インポートする必要があります。`UserData` を Base64 に変換する必要はありません。 +* リソースをスタックからデタッチし、`UserData` を修正して再度インポートする必要があります。`UserData` を Base64 に変換する必要はありません。 * 詳細なガイダンスについては、[リソースインポート](/intermediate/operations/resource-importing.html) ラボを参照してください。 ::: -:::expand{header= "解決策を見たいですか?"} +:::expand{header= "解決策を確認しますか?"} 1. `drift-detection-challenge.yaml` テンプレートを更新して、値が `Retain` の `DeeletionPolicy` 属性を `Instance1` リソースに追加し、ファイルを保存します。 2. 更新された `drift-detection-challenge.yaml` テンプレートでスタックを更新します。これにより、CloudFormation は、テンプレートからリソースを削除しても、そのリソースは削除せず、管理を停止するだけとなります。 @@ -283,7 +283,7 @@ Resources: 2. 最初のラボで作成したスタック (例えば、`drift-detection-workshop`) を選択します。 3. **削除**を選択し、**スタックの削除**をクリックします。 4. `drift-detection-challenge` スタックの場合は、テンプレートファイルを編集して `DeletionPolicy` を `Delete` に変更します。 -5. スタックを選択して**更新**を選択します。次に**既存テンプレートを置き換える**を選択し、更新されたファイルをアップロードすることでスタックを更新します。**次へ**を3回選択し、最後に**送信**をクリックします。スタックの更新が完了するまでお待ちください。 +5. スタックを選択して**更新**を選択します。次に**既存テンプレートを置き換える**を選択し、更新されたファイルをアップロードすることでスタックを更新します。**次へ**を 3 回選択し、最後に**送信**をクリックします。スタックの更新が完了するまでお待ちください。 6. `drift-detection-challenge` スタックを選択し、**削除**を選択し、**スタックを削除**を選択します。 ### まとめ diff --git a/content/intermediate/operations/resource-importing/index.ja.md b/content/intermediate/operations/resource-importing/index.ja.md index 55f5c30ac..49b2d3e6a 100644 --- a/content/intermediate/operations/resource-importing/index.ja.md +++ b/content/intermediate/operations/resource-importing/index.ja.md @@ -5,11 +5,11 @@ weight: 400 ### 概要 -[AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) を使用して、コードで記述したインフラストラクチャをプログラムで管理します。例えば、[AWS マネジメントコンソール](https://aws.amazon.com/console/) や [AWS Command Line Interface](https://aws.amazon.com/cli/) (CLI) を使用して AWS アカウントでリソースを作成した場合は、リソースを CloudFormation スタックに[インポート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html)すると、CloudFormation でリソースのライフサイクルを管理できます。 +[AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html) を使用して、コードで記述したインフラストラクチャをプログラムで管理します。例えば、[AWS マネジメントコンソール](https://aws.amazon.com/jp/console/) や [AWS Command Line Interface](https://aws.amazon.com/jp/cli/) (CLI) を使用して AWS アカウントでリソースを作成した場合は、リソースを CloudFormation スタックに[インポート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html)すると、CloudFormation でリソースのライフサイクルを管理できます。 -[スタック間でリソースを移動する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/refactor-stacks.html) 場合は、インポート機能を使用することもできます。これにより、スタックとリソースを [ライフサイクルと所有権](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html#organizingstacks) 別に整理できます。例えば、[Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2) セキュリティグループなどのリソースを、セキュリティグループのリソース専用の 1 つのスタック (またはスタック) に再編成することを選択します。 +[スタック間でリソースを移動する](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/refactor-stacks.html) 場合は、インポート機能を使用することもできます。これにより、スタックとリソースを [ライフサイクルと所有権](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html#organizingstacks) 別に整理できます。例えば、[Amazon Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/) (Amazon EC2) セキュリティグループなどのリソースを、セキュリティグループのリソース専用の 1 つのスタック (またはスタック) に再編成します。 -::alert[インポート操作でサポートされるリソースの詳細については、 [インポートおよびドリフト検出オペレーションをサポートするリソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html) を参照してください。]{type="info"} +::alert[インポート操作でサポートされるリソースの詳細については、 [インポートおよびドリフト検出オペレーションをサポートするリソース](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html) をご参照ください。]{type="info"} ### 取り上げるトピック @@ -29,20 +29,20 @@ weight: 400 ### ラボパート 1 -このラボでは、まず [Amazon SNS コンソール](https://console.aws.amazon.com/sns/) を使用して [Amazon Simple Notification Service](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html) (Amazon SNS) トピックを作成し、次に作成する新しい CloudFormation スタックにそのトピックをインポートします。次に、Amazon SNS コンソールで 2 つ目のトピックを作成し、それを既存のスタックにインポートします。 +このラボでは、まず [Amazon SNS コンソール](https://console.aws.amazon.com/sns/) を使用して [Amazon Simple Notification Service](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html) (Amazon SNS) トピックを作成します。次に、新しい CloudFormation スタックを作成し、SNS トピックをインポートします。さらに、Amazon SNS コンソールで 2 つ目のトピックを作成し、それを既存のスタックにインポートします。 開始するには、次に示す手順に従ってください。 -1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/) に移動し、**トピック** を選択します。次に、**トピックの作成**を選択します。 +1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/) に移動し、**トピック**を選択します。次に、**トピックの作成**を選択します。 2. **タイプ**セクションで、`スタンダード`を選択します。 3. トピックの**名前** (`Topic1` など) を指定します。 4. 準備ができたら、**トピックの作成**を選択します。 -5. トピックが正常に作成されたら、`Topic1` の**詳細**セクションの下にある [Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) をメモします。この ARN 値は、このラボの後半で使用します。参考に、Amazon SNS トピックの ARN パターンの例は `arn:aws:sns:us-east-1:123456789012:MyTopic`です。 +5. トピックが正常に作成されたら、`Topic1` の**詳細**セクションの下にある [Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference-arns.html) をメモします。この ARN 値は、このラボの後半で使用します。Amazon SNS トピックの ARN パターンの例は `arn:aws:sns:us-east-1:123456789012:MyTopic` です。 -次に、リソースのインポート機能を使用して、新しく作成したトピックを、これから作成する新しいスタックにインポートします。そのためには、CloudFormation テンプレートを使用して、既存のトピックを `AWS::SNS::Topic` [リソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html) で次のように記述します。 +次に、リソースのインポート機能を使用して、新しく作成したトピックを、これから作成する新しいスタックにインポートします。そのためには、CloudFormation テンプレートを使用して、既存のトピックを `AWS::SNS::Topic` [リソース](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html) で次のように記述します。 -* `TopicName` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-properties) には、既存のトピックの名前、つまり `Topic1` を指定します。この値を `Topic1Name` と呼ぶテンプレート[パラメータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) で渡します。次に、このパラメータの値を `Ref` [組み込み関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) で参照します。 -* インポートする各リソースには、`DeletionPolicy` [属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) が記述されている必要があります。トピックにはこの属性を指定し、属性値には `Retain` を指定します。`DeletionPolicy` 属性に `Retain` 値を使用するときは、スタックからリソースを削除するとき、またはスタックを削除するときにリソースを保持するように指定します。 +* `TopicName` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-properties) には、既存のトピックの名前、つまり `Topic1` を指定します。この値を `Topic1Name` と呼ぶテンプレート[パラメータ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html) で渡します。次に、このパラメータの値を `Ref` [組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html) で参照します。 +* インポートする各リソースには、`DeletionPolicy` [属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) が記述されている必要があります。トピックにはこの属性を指定し、属性値には `Retain` を指定します。`DeletionPolicy` 属性に `Retain` 値を使用するときは、スタックからリソースを削除するとき、またはスタックを削除するときにリソースを保持するように指定します。 * 以下のコードをコピーして `resource-importing.yaml` ファイルに追加し、ファイルを保存します。 ```yaml @@ -60,28 +60,28 @@ Resources: ``` -::alert[インポート操作を成功させるには、インポートするすべてのリソースにテンプレートに [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) 属性が設定されている必要があります。詳しい情報については、[インポートオペレーション中の考慮事項](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-considerations) を参照してください。]{type="info"} +::alert[インポート操作を成功させるには、インポートするすべてのリソースにテンプレートに [DeletionPolicy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) 属性が設定されている必要があります。詳しい情報については、[インポートオペレーション中の考慮事項](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-considerations) をご参照ください。]{type="info"} -この次のステップでは、AWS CloudFormation コンソールを使用して、`resource-importing.yaml` テンプレートを使用して [スタックを作成](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-new-stack.html) します。 +この次のステップでは、AWS CloudFormation コンソールを使用して、`resource-importing.yaml` テンプレートを使用して [スタックを作成](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-new-stack.html) します。 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。 2. **スタックの作成**から、**既存のリソースを使用 (リソースをインポート)** を選択します。 3. **概要をインポート**を読み、**次へ**をクリックします。 4. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**をクリックします。`resource-importing.yaml` テンプレートをアップロードし、**次へ**をクリックします。 -5. [識別子の値](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、`Topic1` を作成した後にメモしたトピック ARN の値を指定します。 -6. **スタックの名前**を入力します。例えば、`resource-importing`と指定します。`Topic1Name` パラメータ値には必ず `Topic1` を指定します。 +5. [識別子の値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、`Topic1` を作成した後にメモしたトピック ARN の値を指定します。 +6. **スタックの名前**を入力します。例えば、`resource-importing` と指定します。`Topic1Name` パラメータ値には必ず `Topic1` を指定します。 7. 次のページで、**リソースをインポート**をクリックします。 Amazon SNS トピックがスタックに正常にインポートされると、スタックのステータスに `IMPORT_COMPLETE` と表示されます。 -おめでとうございます! Amazon SNS コンソールで以前に作成したリソースを、新しいスタックにインポートしました。 [AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) を使用して既存のリソースを新しいスタックにインポートする方法については、[AWS CLI を使用した既存のリソースからのスタックの作成](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-new-stack.html#resource-import-new-stack-cli) を参照してください。 +おめでとうございます! Amazon SNS コンソールで以前に作成したリソースを、新しいスタックにインポートしました。 [AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html) を使用して既存のリソースを新しいスタックにインポートする方法については、[AWS CLI を使用した既存のリソースからのスタックの作成](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-new-stack.html#resource-import-new-stack-cli) をご参照ください。 ### ラボパート 2 このラボでは、リソースを既存のスタックにインポートする方法を学びます。開始するには、以下の手順に従ってください。 1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/) に移動して 2 つ目のトピックを作成します。ラボパート1で使用した手順に従い、新しいトピックの名前として **Topic2** を指定します。 -2. トピックが正常に作成されたら、`Topic2`の**詳細**セクションの下にある [Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) をメモします。この情報は、後でこのラボで使用します (ARN パターンの例: `arn:aws:sns:us-east-1:123456789012:MyTopic`)。 +2. トピックが正常に作成されたら、`Topic2` の**詳細**セクションの下にある [Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference-arns.html) をメモします。この情報は、後でこのラボで使用します (ARN パターンの例: `arn:aws:sns:us-east-1:123456789012:MyTopic`)。 3. 以下の例をコピーして、前のラボで使用した `resource-importing.yaml` テンプレートの `Parameters` セクションに追加します。 ```yaml @@ -106,18 +106,18 @@ SNSTopic2: 7. `resource-importing` という名前のスタックを選択し、**スタックアクション** から**リソースへのスタックのインポート** を選択します。 8. **概要をインポート**を読み、**次へ**をクリックします。 9. **テンプレートの指定**から、**テンプレートファイルのアップロード**を選択します。このラボパートで更新した `resource-importing.yaml` テンプレートをアップロードし、**次へ**をクリックします。 -10. [識別子の値](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、`Topic2` を作成した後に書き留めたトピックの ARN 値を指定します。 +10. [識別子の値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、`Topic2` を作成した後に書き留めたトピックの ARN 値を指定します。 11. パラメータについては、必ず `Topic1Name` に `Topic1` を指定し、`Topic2Name` に `Topic2` を指定します。**次へ**をクリックします。 12. 次のページで、**リソースをインポート**をクリックします。 Amazon SNS トピックがスタックに正常にインポートされると、スタックのステータス `IMPORT_COMPLETE` と表示されます。 -おめでとうございます! これで、リソースを既存のスタックにインポートする方法がわかりました。 追加の情報については、[AWS CLI を使用した既存のリソースのスタックへのインポート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-existing-stack.html#resource-import-existing-stack-cli) をご参照ください。 +おめでとうございます! これで、リソースを既存のスタックにインポートする方法がわかりました。 追加の情報については、[AWS CLI を使用した既存のリソースのスタックへのインポート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-existing-stack.html#resource-import-existing-stack-cli) をご参照ください。 ### ラボパート 3 -ラボのこの部分では、[スタック間でリソースを移動する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/refactor-stacks.html) 方法を学びます。`SNSTopic1` リソースを `resource-importing` スタックから削除し、新しいリソースにインポートします。`SNSTopic1` の `DeletionPolicy` 属性に `Retain` を指定したので、スタックを更新しても `SNSTopic1` リソースは削除されないことに注意します。さっそく始めましょう。 +ラボのこの部分では、[スタック間でリソースを移動する](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/refactor-stacks.html) 方法を学びます。`SNSTopic1` リソースを `resource-importing` スタックから削除し、新しいリソースにインポートします。`SNSTopic1` の `DeletionPolicy` 属性に `Retain` を指定したので、スタックを更新しても `SNSTopic1` リソースは削除されないことに注意します。さっそく始めましょう。 1. ラボパート 2 で使用した `resource-importing.yaml` テンプレートの **Parameters** セクションから以下のコードを削除します。 @@ -129,7 +129,7 @@ Topic1Name: Description: Name of the first Amazon SNS topic you created with the Amazon SNS console. ``` -2. `resource-importing.yaml` テンプレートの**Resources** セクションから以下のコードを削除し、テンプレートファイルを保存します。 +2. `resource-importing.yaml` テンプレートの **Resources** セクションから以下のコードを削除し、テンプレートファイルを保存します。 ```yaml SNSTopic1: @@ -145,7 +145,7 @@ SNSTopic1: 6. パラメータセクションで、`Topic2Name` のパラメータ値を `Topic2` のままにします。**次へ**をクリックします。 7. **スタックオプションの設定**ページでデフォルト値のまま、**次へ**をクリックします。 8. 次のページで**送信**をクリックします。 -9. スタックからの `SNSTopic1` リソースの削除を確認するには、`resource-importing` スタックを選択し、**リソース** を選択します。表示されるリソースは`SNSTopic2`だけです。 +9. スタックからの `SNSTopic1` リソースの削除を確認するには、`resource-importing` スタックを選択し、**リソース**を選択します。表示されるリソースは `SNSTopic2` のみです。 `SNSTopic1` リソースを新しいスタックにインポートします。 @@ -172,7 +172,7 @@ Resources: 5. **スタックの作成**から、**既存のリソースを使用 (リソースをインポート)** を選択します。 6. **概要をインポート**を読み、**次へ**をクリックします。 7. **テンプレートの指定**セクションで、**テンプレートファイルをアップロード**を選択します。`moving-resources.yaml` テンプレートをアップロードし、**次へ**をクリックします。 -8. [識別子の値](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、`Topic1` を作成した後にメモしたトピック ARN 値を指定します。 +8. [識別子の値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、`Topic1` を作成した後にメモしたトピック ARN 値を指定します。 9. **スタック名**を入力します。例えば、`moving-resources` と指定します。`Topic1Name` パラメータには必ず `Topic1` を指定します。 10. 次のページで**リソースをインポート**をクリックします。 @@ -193,20 +193,20 @@ aws ec2 describe-instances --instance-ids i-1234567890abcdef0 ::alert[予期しない変更を避けるため、テンプレートで定義するリソースプロパティがリソースの実際の設定と一致することを確認してください。]{type="info"} -2. インポートするリソースをテンプレートに記述するときは、リソースに必要なすべてのプロパティを必ず指定します。例えば、[AssumeRolePolicyDocument](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-assumerolepolicydocument) は [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) リソースタイプの必須プロパティです。 -3. リソースのインポートが成功したら、[ドリフト検出](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html) を実行して、テンプレート内のリソースプロパティがリソースの実際の設定と一致することを確認します。 +2. インポートするリソースをテンプレートに記述するときは、リソースに必要なすべてのプロパティを必ず指定します。例えば、[AssumeRolePolicyDocument](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-assumerolepolicydocument) は [AWS::IAM::Role](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) リソースタイプの必須プロパティです。 +3. リソースのインポートが成功したら、[ドリフト検出](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)を実行して、テンプレート内のリソースプロパティがリソースの実際の設定と一致することを確認します。 -詳細については、[インポートオペレーション中の考慮事項](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-considerations) を参照してください。 +詳細については、[インポートオペレーション中の考慮事項](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-considerations) を参照してください。 ### チャレンジ -この演習では、ラボパート1、2、3で得た知識を使用して、提供されたタスクを完了する必要があります。あなたには、CloudFormation テンプレートのリソースの 1 つである EC2 インスタンスに、人為的ミスの結果として CloudFormation の外部で変更されたプロパティ値があるという問題を解決する必要があります。この問題のトラブルシューティングと解決を行い、CloudFormation で希望するリソース構成を引き続き維持できるようにします。 +この演習では、ラボパート1、2、3で得た知識を使用して、提供されたタスクを完了する必要があります。あなたには、CloudFormation テンプレートのリソースの 1 つである EC2 インスタンスに、人為的ミスの結果として CloudFormation の外部で変更されたプロパティ値が存在するという問題を解決する必要があります。この問題のトラブルシューティングと解決を行い、CloudFormation で希望するリソース構成を引き続き維持できるようにします。 EC2 インスタンスと Amazon S3 バケットを説明するサンプルテンプレートから始めましょう。 はじめに、以下の手順に従ってください。 -1. `code/workspace/resource-importing` というディレクトリにいることを確認してください。 +1. `code/workspace/resource-importing` というディレクトリにいることを確認します。 2. `resource-import-challenge.yaml` ファイルを開きます。 3. 以下の例を `resource-import-challenge.yaml` テンプレートに追加し、ファイルを保存します。 @@ -242,9 +242,9 @@ Resources: 7. **スタックの名前**を入力します。例えば、`resource-import-challenge` と指定します。`InstanceType` には `t2.nano` を指定します。[**次へ**]をクリックします。 8. **スタックオプションの設定**ページはデフォルト値のまま、**次へ**をクリックします。 9. 次のページで、**送信**を選択します。 -10. スタックを作成したら、`resource-import-challenge` スタックを選択し、**リソース**を確認します。`i-12345abcd6789` という形式の `インスタンス`の**物理 ID**をメモしておきましょう。 +10. スタックを作成したら、`resource-import-challenge` スタックを選択し、**リソース**を確認します。`i-12345abcd6789` という形式の `インスタンス`の**物理 ID** をメモしておきましょう。 -次に、スタックの管理範囲外でインスタンスタイプを変更して、ヒューマンエラーを再現してみましょう。以下の手順に従って [既存の EBS-backed インスタンスのインスタンスタイプを変更](ehttps://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html#change-instance-type-of-ebs-backed-instanc) を実行します。 +次に、スタックの管理範囲外でインスタンスタイプを変更して、ヒューマンエラーを再現してみましょう。以下の手順に従って [既存の EBS-backed インスタンスのインスタンスタイプを変更](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-resize.html#change-instance-type-of-ebs-backed-instance) を実行します。 1. [Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/) に移動します。 2. **インスタンス**セクションを見つけて、`InstanceImport` という名前のインスタンスを選択し、**インスタンスの状態**、**インスタンスを停止**を選択します。 @@ -253,16 +253,16 @@ Resources: 5. `InstanceImport` インスタンスを再度選択し、**インスタンスの状態**、**インスタンスを開始**を選択します。 -最初に Amazon EC2 インスタンスをスタックで作成しました。ヒューマンエラーを再現するために、テンプレートの [InstanceType](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype) プロパティを使用する代わりに、(CloudFormation を使用せずに) インスタンスを更新し、次にスタックを更新しました。 +最初に Amazon EC2 インスタンスをスタックで作成しました。ヒューマンエラーを再現するために、テンプレートの [InstanceType](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype) プロパティを使用する代わりに、(CloudFormation を使用せずに) インスタンスを更新し、次にスタックを更新しました。 -::alert[インスタンスタイプを変更すると、インスタンスが停止して再起動するなど、 [一時的な中断を伴う更新](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) が発生します。インスタンスのサイズ変更の詳細については、[インスタンスタイプを変更する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-resize.html) を参照してください。]{type="info"} +::alert[インスタンスタイプを変更すると、インスタンスが停止して再起動するなど、 [一時的な中断を伴う更新](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-some-interrupt) が発生します。インスタンスのサイズ変更の詳細については、[インスタンスタイプを変更する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-resize.html) をご参照ください。]{type="info"} -今回のタスクは、スタックを更新するときに `InstanceType` プロパティに追加の変更を加えることなく、スタック内で現在 `t2.nano` に設定されているインスタンスタイプ値を、CloudFormation 以外の方法で行われた新しいインスタンス設定である `t2.micro` と一致させることです。 +今回のタスクは、スタックを更新するときに `InstanceType` プロパティに追加の変更を加えることなく、スタック内で現在 `t2.nano` に設定されているインスタンスタイプ値を、CloudFormation 以外の方法で設定された新しいインスタンス設定である `t2.micro` と一致させることです。 -::expand[* ラボパート3で学んだ概念の利用を検討します。]{header="ヒントが必要ですか?"} +::expand[* ラボパート 3 で学んだ概念の利用を検討します。]{header="ヒントが必要ですか?"} -:::expand{header= "解決策を見たいですか?"} -1. `resource-import-challenge.yaml` テンプレートを更新します。`Instance` リソースに、値が`Retain` の `DeletionPolicy` 属性を追加し、ファイルを保存します。 +:::expand{header= "解決策を確認しますか?"} +1. `resource-import-challenge.yaml` テンプレートを更新します。`Instance` リソースに、値が `Retain` の `DeletionPolicy` 属性を追加し、ファイルを保存します。 2. パラメータ値を変更せずに、更新された `resource-import-challenge.yaml` テンプレートを使用してスタックを更新します。 3. スタックを更新し、インスタンスの `DeletionPolicy` 属性が `Retain` に設定されたら、`Parameters` セクションにあるインスタンスリソース定義と関連パラメータをテンプレートから削除します。今回の例では、書くべきパラメーターが特に存在しないため、`Parameters` セクション自体を削除します。具体的には、`resource-import-challenge.yaml` テンプレートから次の 2 つのコードブロックを削除します。 @@ -298,8 +298,8 @@ Parameters: 5. このスタックの更新後、ステップ 3 で削除した 2 つのコードブロックを `resource-import-challenge.yaml` テンプレートに追加して保存します。 6. `resource-import-challenge`という名前のスタックを選択し、**スタックアクション**から**スタックへのリソースのインポート**を選択します。 7. **概要をインポート**を読み、**次へ**を選択してください。 -8. **テンプレートを指定**から、**テンプレートファイルのアップロード**を選択します。更新した`resource-import-challenge.yaml`テンプレートをアップロードし、**次へ**をクリックします。 -9. [識別子の値](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、このチャレンジの一部として先ほど書き留めたインスタンスの**物理 ID** を指定します。 +8. **テンプレートを指定**から、**テンプレートファイルのアップロード**を選択します。更新した`resource-import-challenge.yaml` テンプレートをアップロードし、**次へ**をクリックします。 +9. [識別子の値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import.html#resource-import-overview) には、このチャレンジの一部として先ほど書き留めたインスタンスの**物理 ID** を指定します。 10. インスタンスタイプパラメータとして `t2.micro` を選択します。ここでは、実際のインスタンスタイプ設定である `t2.micro` と一致しています。 11. 次のページで、**リソースをインポート**をクリックします。 ::: @@ -314,14 +314,14 @@ Parameters: 1. 以前に AWS マネジメントコンソールや AWS CLI などを使用して AWS リソース (Amazon S3 バケットなど) を作成していて、CloudFormation を使用してリソースを管理したい。 2. ライフサイクルと所有権ごとにリソースを 1 つのスタックに再編成して管理しやすくしたい (セキュリティグループのリソースなど)。 -3. 既存のスタックを既存のスタックにネストしたい。詳しい情報については、[既存のスタックのネスト化](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-nested-stacks.html) をご参照ください。 +3. 既存のスタックを既存のスタックにネストしたい。詳しい情報については、[既存のスタックのネスト化](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-nested-stacks.html) をご参照ください。 4. CloudFormation 以外の方法で更新されたリソースの CloudFormation 設定と一致させたい。 ### クリーンアップ このラボで作成したリソースをクリーンアップするには、次に示すクリーンアップ手順に従ってください。 -1. `code/workspace/resource-importing` というディレクトリにいることを確認してください +1. `code/workspace/resource-importing` というディレクトリにいることを確認します。 2. `resource-importing.yaml` テンプレートファイルを更新して、`SNSTopic2` リソース定義から `deletionPolicy: Retain` 行を削除し、テンプレートを保存します。 3. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。 4. `resource-importing` という名前のスタックを選択し、**更新**を選択します。 diff --git a/content/intermediate/operations/stack-policy-and-prevention-controls/index.ja.md b/content/intermediate/operations/stack-policy-and-prevention-controls/index.ja.md index 6c9dff0e2..e3f406609 100644 --- a/content/intermediate/operations/stack-policy-and-prevention-controls/index.ja.md +++ b/content/intermediate/operations/stack-policy-and-prevention-controls/index.ja.md @@ -1,19 +1,19 @@ --- -title: "スタックポリシーと防止コントロール" +title: "スタックポリシーと誤操作防止のためのコントロール" weight: 300 --- ### 概要 -[AWS CloudFormation](https://aws.amazon.com/cloudformation/) を使用してコードでインフラストラクチャを記述する場合、意図しない操作を防ぐためのポリシーを実装するかを選択できます。例えば、[スタックポリシー](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html)、[削除保護](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html)、[DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) 属性、[UpdateReplacePolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) 属性により、スタックに記述したリソースの偶発的な終了、更新、削除を防ぎます。 +[AWS CloudFormation](https://aws.amazon.com/cloudformation/) を使用してコードでインフラストラクチャを記述する場合、意図しない操作を防ぐためのポリシーを実装するかを選択できます。例えば、[スタックポリシー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html)、[削除保護](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html)、[DeletionPolicy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) 属性、[UpdateReplacePolicy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) 属性により、スタックに記述したリソースの偶発的な終了、更新、削除を防ぎます。 ### 取り上げるトピック このラボを修了すると、次のことができるようになります。 -* CloudFormation スタックに [スタックポリシー](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html) を設定して、スタックで管理しているリソースに対して実行できる更新アクションを決定する方法を学びます。 -* [削除保護](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html) を有効にしてスタックの削除を防ぐ方法を学びます。 -* [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) 属性を使用して、スタックからリソースを削除するとき、またはスタックを削除するときに、スタックに記述したリソースを保存 (場合によってはバックアップ) する方法について学びます。 +* CloudFormation スタックに [スタックポリシー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html) を設定して、スタックで管理しているリソースに対して実行できる更新アクションを決定する方法を学びます。 +* [削除保護](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html) を有効にしてスタックの削除を防ぐ方法を学びます。 +* [DeletionPolicy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) 属性を使用して、スタックからリソースを削除するとき、またはスタックを削除するときに、スタックに記述したリソースを保存 (場合によってはバックアップ) する方法について学びます。 @@ -25,9 +25,9 @@ weight: 300 ### **ラボパート 1 - スタックポリシーと削除保護** -[スタックポリシー](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html) は、スタックリソースの更新操作を定義および制御するためにスタック上にセットアップする JSON 形式のドキュメントです。[削除保護](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html) は、スタックが削除されないようにするためにスタック上で有効にするスタックオプションです。 +[スタックポリシー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html) は、スタックリソースの更新操作を定義および制御するためにスタック上にセットアップする JSON 形式のドキュメントです。[削除保護](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html) は、スタックが削除されないようにするためにスタック上で有効にするスタックオプションです。 -このラボでは、まず [Amazon Simple Notification Service](https://aws.amazon.com/sns/) (Amazon SNS) [トピック](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html) をスタック内に作成します。トピックの更新を拒否するスタックポリシーを設定し、スタックの削除保護を有効にします。次に、作成したスタックを更新してトピックを更新し、スタックリソースに設定したスタックポリシーをテストします。後ほど、スタックを削除して、有効にした削除保護設定をテストします。 +このラボでは、まず [Amazon Simple Notification Service](https://aws.amazon.com/jp/sns/) (Amazon SNS) [トピック](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-create-topic.html) をスタック内に作成します。トピックの更新を拒否するスタックポリシーを設定し、スタックの削除保護を有効にします。次に、作成したスタックを更新してトピックを更新し、スタックリソースに設定したスタックポリシーをテストします。後ほど、スタックを削除して、有効にした削除保護設定をテストします。 開始するには、次に示す手順に従ってください。 @@ -82,19 +82,19 @@ Resources: ::alert[スタックポリシーをスタックに適用すると、そのスタック内のすべてのリソースがデフォルトで保護されます。従って、他のすべてのリソースを更新できるようにするには、スタックポリシーに明示的な `Allow` ステートメントを指定する必要があります。] -上記で `stack-policy-lab` スタックに設定したスタックポリシーは、[論理 ID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-resource-fields) が `SNSTopic` であるリソースの更新を拒否します。 +上記で `stack-policy-lab` スタックに設定したスタックポリシーは、[論理 ID](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-resource-fields) が `SNSTopic` であるリソースの更新を拒否します。 それでは、作成したスタックを更新して、適用したスタックポリシーをテストしてみましょう。 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。 -2. `stack-policy-lab`という名前のスタックを選択し、**更新**を選択します。 +2. `stack-policy-lab` という名前のスタックを選択し、**更新**を選択します。 3. 次のページで、**現在のテンプレートの使用**を選択します。**次へ**をクリックします。 4. パラメーターセクションで、`SNSTopicTagValue` の値を `Topic-Tag-1` から `Topic-Tag-2` に更新します。**次へ**をクリックします。 5. **スタックオプションの設定**ページでデフォルト値のまま、**次へ**をクリックします。 6. 次のページで**送信**をクリックします。 -スタックの更新は失敗します。スタックの**イベント**ペインを見ると、[論理 ID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-resource-fields) が `SNSTopic` であるリソースの `Action denied by stack policy` というエラーが表示されます。 +スタックの更新は失敗します。スタックの**イベント**ペインを見ると、[論理 ID](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-resource-fields) が `SNSTopic` であるリソースの `Action denied by stack policy` というエラーが表示されます。 それでは、`stack-policy-lab` スタックで有効にした削除保護機能をテストしてみましょう。 @@ -103,12 +103,12 @@ Resources: スタックで**削除保護**が有効になっていることを知らせるメッセージウィンドウが表示されます。スタックを削除する前に無効にする必要があります。 -おめでとうございます! これで、CloudFormation スタック内のリソースの更新操作を定義し、スタックが削除されないようにする方法を学習しました。[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) を使用してスタックポリシーを適用する方法については、[スタックポリシーの設定](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html#protect-stack-resources-protecting)をご参照ください。AWS Command Line Interfaceを使用して削除保護を有効または無効にするには、[update-termination-protection](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-termination-protection.html) コマンドを使用します。 +おめでとうございます! これで、CloudFormation スタック内のリソースの更新操作を定義し、スタックが削除されないようにする方法を学習しました。[AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html) を使用してスタックポリシーを適用する方法については、[スタックポリシーの設定](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html#protect-stack-resources-protecting)をご参照ください。AWS Command Line Interface を使用して削除保護を有効または無効にするには、[update-termination-protection](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-termination-protection.html) コマンドを使用します。 ### **ラボパート 2 - DeletionPolicy** -[DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) は、スタックからリソースを削除する場合やスタック自体を削除する場合に、スタック内のリソースを保存 (場合によってはバックアップ) するように設定する CloudFormation リソース属性です。デフォルトでは、リソースに `DeletionPolicy` が設定されていない場合、またはその値が `Delete`に設定されている場合、CloudFormationはスタックの削除時にリソースを削除します。 +[DeletionPolicy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) は、スタックからリソースを削除する場合やスタック自体を削除する場合に、スタック内のリソースを保存 (場合によってはバックアップ) するように設定する CloudFormation リソース属性です。デフォルトでは、リソースに `DeletionPolicy` が設定されていない場合、またはその値が `Delete` に設定されている場合、CloudFormation はスタックの削除時にリソースを削除します。 このラボでは、まず Amazon SNS トピックリソースを含む CloudFormation スタックを作成し、`DeletionPolicy` 属性値を `Retain` に設定してリソースを保存します。次に、スタックを削除し、リソースがまだ存在するかどうかを確認します。 @@ -146,25 +146,25 @@ Resources: 1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/) に移動し、**トピック** を選択します。 2. スタックで作成したトピック `Topic-2` がまだ存在していることから、スタックの削除中に削除されなかったことが分かります。 -おめでとうございます! これで、リソースに `DeletionPolicy` リソース属性を定義して、スタックの削除時にその属性を保持する方法を学習しました。詳しい情報については、[`DeletionPolicy` 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) と [`DeletionPolicy` オプション](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html#aws-attribute-deletionpolicy-options)をご参照ください。 +おめでとうございます! これで、リソースに `DeletionPolicy` リソース属性を定義して、スタックの削除時にその属性を保持する方法を学習しました。詳しい情報については、[`DeletionPolicy` 属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) と [`DeletionPolicy` オプション](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html#aws-attribute-deletionpolicy-options)をご参照ください。 -::alert[スタックの更新時に、`UpdateReplacePolicy` [属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) を使用して、スタックの更新中にリソースが置き換えられたときに、特定のリソースを保持するか、場合によってはバックアップするかを選択できます。] +::alert[スタックの更新時に、`UpdateReplacePolicy` [属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html) を使用して、スタックの更新中にリソースが置き換えられた際、特定のリソースを保持するか、バックアップするかを選択できます。] ### チャレンジ -これで、[論理 ID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-resource-fields) に基づいてリソースの更新を拒否するスタックポリシーを作成する方法がわかりました。この演習では、特定のタイプのリソースに適用されるスタックポリシーを作成します。タスクは、`AWS::RDS::DBInstance` リソースタイプへのすべての更新アクションを拒否するスタックポリシーを作成することです。 +これで、[論理 ID](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html#resources-section-structure-resource-fields) に基づいてリソースの更新を拒否するスタックポリシーを作成する方法がわかりました。この演習では、特定のタイプのリソースに適用されるスタックポリシーを作成します。タスクは、`AWS::RDS::DBInstance` リソースタイプへのすべての更新アクションを拒否するスタックポリシーを作成することです。 :::expand{header= "ヒントが必要ですか?"} -- [Condition](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html#stack-policy-reference) キーを使用して `ResourceType` を定義します。 -- すべての更新アクションを含めるには、 `Action`をどのように指定しますか? -- `Resource`にはどの値を指定すべきですか? +- [Condition](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html#stack-policy-reference) キーを使用して `ResourceType` を定義します。 +- すべての更新アクションを含めるには、 `Action` をどのように指定しますか? +- `Resource` にはどの値を指定すべきですか? ::: -:::expand{header= "解決策を見たいですか?"} +:::expand{header= "解決策を確認しますか?"} -`"Effect" : "Deny"`に対して、次に示すように `Action`、`Resource`、`Condition` ブロックを含むスタックポリシーを作成します。 +`"Effect" : "Deny"` に対して、次に示すように `Action`、`Resource`、`Condition` ブロックを含むスタックポリシーを作成します。 ```json { diff --git a/content/intermediate/operations/understanding-changesets/index.ja.md b/content/intermediate/operations/understanding-changesets/index.ja.md index 2eee2df3d..02ee95d52 100644 --- a/content/intermediate/operations/understanding-changesets/index.ja.md +++ b/content/intermediate/operations/understanding-changesets/index.ja.md @@ -4,9 +4,9 @@ weight: 200 --- ### 概要 -[AWS CloudFormation](https://aws.amazon.com/cloudformation/) スタックを更新すると、そのスタック内の 1 つ以上のリソースを目的の新しい状態に更新します。リソースの依存関係、[スタックリソースの更新動作](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html)、またはユーザーエラーなどの要因により、特定の状態と実際の新しい状態との間に違いが生じる可能性があります。 +[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/) スタックを更新すると、そのスタック内の 1 つ以上のリソースを目的の新しい状態に更新します。リソースの依存関係、[スタックリソースの更新動作](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html)、またはユーザーエラーなどの要因により、特定の状態と実際の新しい状態との間に違いが生じる可能性があります。 -スタックを[直接](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html)更新するか、[変更セット](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html) で更新するかを選択します。後者では、適用前に提案された変更のプレビューが表示され、予期しないリソース構成や置換を防ぐのに役立ちます。 +スタックを[直接](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html)更新するか、[変更セット](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html) で更新するかを選択します。後者では、適用前に提案された変更のプレビューが表示され、予期しないリソース構成や置換を防ぐのに役立ちます。 変更セットは、テンプレートのパラメータ値を変更するか、変更内容を記述した最新のテンプレートを提供することで作成できます。要件に最も適した変更セットを実行する前に、同じスタックに対して複数の変更セットを作成することもできます。 @@ -15,7 +15,7 @@ weight: 200 * 変更セットの作成方法 * 更新後にスタックがどのようになるかを理解するための変更セットの読み方 -* CloudFormationがどのリソースを置き換える必要があるかを判断する方法と、静的評価と動的評価の仕組み +* CloudFormation がどのリソースを置き換える必要があるかを判断する方法と、静的評価と動的評価の仕組み ### ラボを開始 サンプルテンプレートを使用して、CloudFormation スタックを作成します。次に、このスタックに 2 つの異なる変更セットを作成します。1 つはテンプレートの編集によるもので、もう 1 つはパラメータ値の変更によるものです。 @@ -30,13 +30,13 @@ weight: 200 3. **テンプレートの準備**セクションで、**テンプレート準備完了**を選択します。 4. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。`bucket.yaml` テンプレートファイルを選択し、**次へ**をクリックします。 5. スタック名を指定します (例: `changesets-workshop`)。 - 6. `BucketName` パラメータには必ず一意の値を指定します。詳細については、[バケットの名前付け](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) をご参照ください。**次へ**をクリックします。 + 6. `BucketName` パラメータには必ず一意の値を指定します。詳細については、[バケットの名前付け](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucketnamingrules.html) をご参照ください。**次へ**をクリックします。 7. 次のページで、すべてのオプションをデフォルト値のままにし、**次へ**をクリックします。 8. レビューページで、**送信**をクリックします。 9. スタックのステータスが `CREATE_COMPLETE` になるまで、スタックの作成ページを更新します。 ### ラボパート 1 -ラボのこの部分では、特定のリソースタイプについて、スタックの更新時に [中断を伴わない更新](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt) を必要とするプロパティを指定します。次に、変更セットを作成して変更をプレビューし、変更セット操作の出力を確認します。 +ラボのこの部分では、特定のリソースタイプについて、スタックの更新時に [中断を伴わない更新](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt) を必要とするプロパティを指定します。次に、変更セットを作成して変更をプレビューし、変更セット操作の出力を確認します。 お好みのテキストエディタで `bucket.yaml` CloudFormation テンプレートを開き、以下に示すように `VersioningConfiguration` を追加し、ファイルを保存します。 @@ -51,12 +51,12 @@ MyS3Bucket: 次に、最初の変更セットを作成します。 -1. CloudFormation コンソールで`changesets-workshop`スタックを選択し、**スタックアクション** から **既存スタックの変更セットを作成** を選択します。 +1. CloudFormation コンソールで `changesets-workshop` スタックを選択し、**スタックアクション** から **既存スタックの変更セットを作成** を選択します。 2. **テンプレートの準備**セクションで、**既存テンプレートを置き換える**を選択します。**テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択し、更新した `bucket.yaml` テンプレートを選択し、**次へ**をクリックします。 3. **スタックの詳細を指定**ページと**スタックオプションの設定**ページの両方で **次へ**を**選択**し、**変更セットの作成**をクリックします。 4. 変更セットの名前を指定します (例: `bucket-versioning-update`)。また、`MyS3Bucket のバケットバージョニングを有効にする`などの説明を指定し、**変更セットの作成** をクリックします。 5. 変更セットのステータスが `CREATE_COMPLETE` になるまでページを更新します。 -6. ページの下部に、予想される変更の概要が表示されます。詳細については**JSONの変更**タブに移動します。以下のようになっているはずです。 +6. ページの下部に、予想される変更の概要が表示されます。詳細については **JSON の変更**タブに移動します。以下のようになっているはずです。 ```json [ @@ -91,20 +91,20 @@ MyS3Bucket: ] ``` -`resourceChange` 構造では、リソースの論理 ID、CloudFormation が実行するアクション、リソースの物理 ID、リソースのタイプ、および CloudFormation がリソースを置き換えるかどうかが表示されます。`Details` 構造では、CloudFormation は、[バージョニング設定](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties)プロパティを更新しても中断を必要としないため、バケットを再作成 (置換) する必要がない直接的な変更としてラベル付けしています。 +`resourceChange` 構造では、リソースの論理 ID、CloudFormation が実行するアクション、リソースの物理 ID、リソースのタイプ、および CloudFormation がリソースを置き換えるかどうかが表示されます。`Details` 構造では、CloudFormation は、[バージョニング設定](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties)プロパティを更新しても中断を必要としないため、バケットを再作成 (置換) する必要がない直接的な変更としてラベル付けしています。 この変更セットを実行しても、CloudFormation は指定した設定に基づいてバケットを置き換えることはありません。変更セットの実行を控えて、別の変更セットを作成しましょう。 ### ラボパート 2 -次に、スタックの更新時に [置換](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) を必要とするプロパティ `BucketName` の値を変更します。次に、変更セットを作成して変更をプレビューし、変更セット操作の出力を確認します。 +次に、スタックの更新時に [置換](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement) を必要とするプロパティ `BucketName` の値を変更します。次に、変更セットを作成して変更をプレビューし、変更セット操作の出力を確認します。 それでは、始めましょう。 -1. CloudFormation コンソールで `changesets-workshop` スタックを選択し、**スタックアクション** から **既存スタックの変更セットを作成** を選択します。 +1. CloudFormation コンソールで `changesets-workshop` スタックを選択し、**スタックアクション**から**既存スタックの変更セットを作成**を選択します。 2. **テンプレートの準備**セクションで、**現在のテンプレートの使用**を選択し、**次へ**をクリックします。 -3.新しい一意の[バケット名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)を指定して `BucketName` パラメータの値を変更し、前の手順に従って変更セットの作成を完了します。 +3.新しい一意の[バケット名](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucketnamingrules.html)を指定して `BucketName` パラメータの値を変更し、前の手順に従って変更セットの作成を完了します。 -この変更セットの**JSONの変更**は次のようになります。 +この変更セットの **JSON の変更**は次のようになります。 ```json @@ -150,9 +150,9 @@ MyS3Bucket: ] ``` -前の例とは2つの重要な違いがあることがわかります。まず、`resourceChange` 構造の`replacement`プロパティの値が `True` に設定されています。次に、`detail` 構造の下に `Static` と `Dynamic` の 2 つの評価が表示されます。これらの点について詳しく説明しましょう。 +前の例とは2つの重要な違いがあることがわかります。まず、`resourceChange` 構造の `replacement` プロパティの値が `True` に設定されています。次に、`detail` 構造の下に `Static` と `Dynamic` の 2 つの評価が表示されます。これらの点について詳しく説明しましょう。 -置換が必要な `BucketName` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties) を更新したため、`replacement` の値は `True` です。CloudFormation は新しいリソース (この場合は新しいバケット) を作成し、古いリソースを削除します。特定のリソースに複数の変更を加え、それぞれの`requiresRecreation` フィールドの値が異なる場合、CloudFormation は作作成が必要になったときにリソースを置き換えます。言い換えると、多くの変更のうちの 1 つだけを置き換える必要がある場合、CloudFormation はリソースを置き換えるため、`replacement` フィールドを `True` に設定します。 +置換が必要な `BucketName` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties) を更新したため、`replacement` の値は `True` です。CloudFormation は新しいリソース (この場合は新しいバケット) を作成し、古いリソースを削除します。特定のリソースに複数の変更を加え、それぞれの `requiresRecreation` フィールドの値が異なる場合、CloudFormation は作作成が必要になったときにリソースを置き換えます。言い換えると、多くの変更のうちの 1 つだけを置き換える必要がある場合、リソースを置き換えるために `replacement` フィールドを `True` に設定します。 `replacement` フィールドの値は、`target` 構造の `requiresRecreation` フィールドで示されます。`requiresRecreation` フィールドが `Never` の場合、`replacement` フィールドは `False` になります。`requiresRecreation` フィールドが `Always` で、`evaluation` フィールドが `Static` の場合、`replacement` は `True` になります。ただし、`RequiresRecreation` フィールドが`Always`で、`evaluation` フィールドが `Dynamic` の場合、`replacement` は`Conditionally` になります。 @@ -165,16 +165,16 @@ CloudFormation では、変更セットを実行した後に初めて値を決 次に、変更に関する静的評価関連データに注目しましょう。 上の例で、静的評価では、パラメータ参照値 `ParameterReference` が変更された結果であることが示されています。変更された正確なパラメータは `causingEntity` フィールド (この場合は `BucketName`) で示されます。 ### チャレンジ -お好みのテキストエディタで、`code/workspace/understanding-changesets` ディレクトリにある `changeset-challenge.yaml` という名前のテンプレートファイルを開きます。このファイルは、以前に使用した `bucket.yaml` テンプレートの修正版です。`MyS3Bucket` ではなく `News3Bucket` のAmazon S3 バケットリソースの論理 ID を書き留めてください。テンプレートには、`MySqsQueue` 論理 ID を持つ [Amazon Simple Queue Service](https://aws.amazon.com/sqs/) (SQS) [queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#aws-resource-sqs-queue-properties) という新しいリソースも記述されていることに注意してください。 +お好みのテキストエディタで、`code/workspace/understanding-changesets` ディレクトリにある `changeset-challenge.yaml` という名前のテンプレートファイルを開きます。このファイルは、以前に使用した `bucket.yaml` テンプレートの修正版です。`MyS3Bucket` ではなく `News3Bucket` の Amazon S3 バケットリソースの論理 ID を書き留めてください。テンプレートには、`MySqsQueue` 論理 ID を持つ [Amazon Simple Queue Service](https://aws.amazon.com/jp/sqs/) (SQS) [queue](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#aws-resource-sqs-queue-properties) という新しいリソースも記述されていることに注意してください。 -`changeset-challenge.yaml` ファイルを使用して `changesets-workshop` スタックの新しい変更セットを作成したらどうなると思いますか? リソースはいくつ追加されますか? リソースは削除されますか? 変更セットの**JSONの変更**からキューの物理 ID を取得できますか? +`changeset-challenge.yaml` ファイルを使用して `changesets-workshop` スタックの新しい変更セットを作成したらどうなると思いますか? リソースはいくつ追加されますか? リソースは削除されますか? 変更セットの **JSON の変更**からキューの物理 ID を取得できますか? このファイルを使用して変更セットを作成し、提案された変更を正しく判断できたかどうかを確認してください。 :::expand[* テンプレート内のリソースの論理 ID を変更し、更新したテンプレートでスタックを更新すると、CloudFormation はリソースを置き換えようとします。]{header="ヒントが必要ですか?"} ::: -:::expand{header= "解決策を見たいですか?"} -* CloudFormation は、新しい `MySQsQueue` キューリソースを追加することに加えて、`News3Bucket` 論理 ID を使用して新しいバケットを作成し、`MyS3Bucket` を削除しようとします。新しいリソースの物理 ID は作成されるまで使用できません。**JSONの変更**は次のようになるはずです。 +:::expand{header= "解決策を確認しますか?"} +* CloudFormation は、新しい `MySQsQueue` キューリソースを追加することに加えて、`News3Bucket` 論理 ID を使用して新しいバケットを作成し、`MyS3Bucket` を削除しようとします。新しいリソースの物理 ID は作成されるまで使用できません。**JSON の変更**は次のようになるはずです。 ```json [ @@ -230,7 +230,7 @@ CloudFormation では、変更セットを実行した後に初めて値を決 このラボで作成したリソースをクリーンアップするには -1. CloudFormation コンソールから、`changesets-workshop`という名前のスタックを選択します。 +1. CloudFormation コンソールから、`changesets-workshop` という名前のスタックを選択します。 2. **削除** を選択し、次に**スタックの削除** を選択してスタックと、スタック用に作成した変更セットを削除します。 --- diff --git a/content/intermediate/operations/update-behaviors-of-stack-resources/index.ja.md b/content/intermediate/operations/update-behaviors-of-stack-resources/index.ja.md index 55df8368f..d1ef7aac0 100644 --- a/content/intermediate/operations/update-behaviors-of-stack-resources/index.ja.md +++ b/content/intermediate/operations/update-behaviors-of-stack-resources/index.ja.md @@ -6,7 +6,7 @@ weight: 100 ### 概要 このラボでは、インフラストラクチャの設計および更新への対応方法に関する重要なポイントを学びます。アプリケーションと環境が進化するにつれて、テンプレートに記述されているリソース構成に更新を適用します。 -CloudFormation は、提供された更新されたテンプレートと、以前のバージョンのテンプレートで説明したリソース構成との変更を比較することによってリソースを更新します。変更されていないリソース構成は、更新プロセス中も影響を受けません。それ以外の場合、CloudFormation は次のいずれかの[更新動作](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html)を使用します。**中断を伴わない更新**、**一時的な中断を伴う更新**、**置換**の各更新動作は、特定の[リソースタイプ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)に従い、テンプレートに追加する新しいプロパティや、変更するプロパティ値によって決まります。 +CloudFormation は、提供された更新されたテンプレートと、以前のバージョンのテンプレートで説明したリソース構成との変更を比較することによってリソースを更新します。変更されていないリソース構成は、更新プロセス中も影響を受けません。それ以外の場合、CloudFormation は次のいずれかの[更新動作](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html)を使用します。**中断を伴わない更新**、**一時的な中断を伴う更新**、**置換**の各更新動作は、特定の[リソースタイプ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)に従い、テンプレートに追加する新しいプロパティや、変更するプロパティ値によって決まります。 ### 対象トピック このラボを修了すると、次のことができるようになります。 @@ -15,11 +15,11 @@ CloudFormation は、提供された更新されたテンプレートと、以 * 更新動作がプロビジョニングされたスタックリソースにどのように影響するかについての重要な考慮事項について学びます。 **ラボを開始** -* `code/workspace/update-behaviors-of-stack-resources`ディレクトリに移動します。 -* お好みのテキストエディタで`update-behaviors-of-stack-resources.yaml`ファイルを開きます。 +* `code/workspace/update-behaviors-of-stack-resources` ディレクトリに移動します。 +* お好みのテキストエディタで`update-behaviors-of-stack-resources.yaml` ファイルを開きます。 * ラボを進めながら、コンテンツをコピーしてファイルに追加します。 -テンプレートに[Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/)(Amazon EC2) インスタンスを記述することから始めましょう。`update-behaviors-of-stack-resources.yaml` テンプレートの横に表示されている `Paramaters` セクションをコピーして追加します。 +テンプレートに[Amazon Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/)(Amazon EC2) インスタンスを記述することから始めましょう。`update-behaviors-of-stack-resources.yaml` テンプレートの横に表示されている `Paramaters` セクションをコピーして追加します。 ```yaml Parameters: @@ -34,7 +34,7 @@ Parameters: Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 ``` -次に、`Resources`セクションとAmazon EC2インスタンス定義をコピーしてテンプレートに追加します。 +次に、`Resources` セクションと Amazon EC2 インスタンス定義をコピーしてテンプレートに追加します。 ```yaml Resources: @@ -56,7 +56,7 @@ Resources: 3. **スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 4. **テンプレートの準備**セクションで、**テンプレートの準備完了**を選択します。 5. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。前述の`update-behaviors-of-stack-resources.yaml` テンプレートを選択し、**次へ**をクリックします。 -6. スタック名を指定します。例えば、`cfn-workshop-update-behaviors-of-stack-resources` と入力します。`InstanceType`パラメータと`LatestAmiID`パラメータのデフォルト値をそのまま使用し、**次へ**をクリックします。 +6. スタック名を指定します。例えば、`cfn-workshop-update-behaviors-of-stack-resources` と入力します。`InstanceType` パラメータと `LatestAmiID` パラメータのデフォルト値をそのまま使用し、**次へ**をクリックします。 7. **スタックオプションの設定**ページはデフォルト値のまま、**次へ**をクリックします。 8. **レビュー**ページで一番下までスクロールし、**送信**をクリックします。 9. スタックの作成が完了するまでお待ちください。スタックのステータスが `CREATE_COMPLETE` になるまで、コンソールのビューを更新します。 @@ -64,14 +64,14 @@ Resources: **置換** -ここまで、スタックを使用してAmazon EC2インスタンスを作成しました。インスタンスの[Amazon Machine Image](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) (AMI) には、このラボで最新の `x86-64` Amazon Linux 2 AMIを使用しました。次に、Amazon EC2インスタンスに別の AMIを使用する必要があるシナリオを考えてみましょう。このラボでは、前に作成した CloudFormation スタック`cfn-workshop-update-behaviors-of-stack-resources` を更新し、`LatestAmiId`のパラメータ値を `/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs` でオーバーライドします。 +ここまで、スタックを使用して Amazon EC2 インスタンスを作成しました。インスタンスの[Amazon Machine Image](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html) (AMI) には、このラボで最新の `x86-64` Amazon Linux 2 AMI を使用しました。次に、Amazon EC2 インスタンスに別の AMI を使用する必要があるシナリオを考えてみましょう。このラボでは、前に作成した CloudFormation スタック`cfn-workshop-update-behaviors-of-stack-resources` を更新し、`LatestAmiId` のパラメータ値を `/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs` でオーバーライドします。 -::alert[リソースのプロパティ値を変更するときは、必ずドキュメント内の特定のリソースプロパティの[ Update requires](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid)の値を確認してください。この場合、`ImageID`プロパティの値を更新すると、リソース[置換](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement)動作が実行されます。]{type="info"} +::alert[リソースのプロパティ値を変更するときは、必ずドキュメント内の特定のリソースプロパティの[ Update requires](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid)の値を確認してください。この場合、`ImageID` プロパティの値を更新すると、リソース[置換](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement)動作が実行されます。]{type="info"} -いよいよスタックを更新しましょう![AWS CloudFormationコンソール](https://console.aws.amazon.com/cloudformation/)に移動し、`cfn-workshop-update-behaviors-of-stack-resources`スタックを更新します。 +いよいよスタックを更新しましょう![AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)に移動し、`cfn-workshop-update-behaviors-of-stack-resources` スタックを更新します。 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 -2. `cfn-workshop-update-behaviors-of-stack-resources`スタックを作成した[リージョン](https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/select-region.html)を必ず選択してください。 +2. `cfn-workshop-update-behaviors-of-stack-resources` スタックを作成した[リージョン](https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/select-region.html)を必ず選択してください。 3. 先ほど作成したスタック (例えば、`cfn-workshop-update-behaviors-of-stack-resources`) を選択します。 4. **更新**を選択します。 5. **テンプレートの準備**で**現在のテンプレートの使用**を選択し、**次へ**をクリックします。 @@ -87,9 +87,9 @@ Resources: **一時的な中断を伴う更新** -ワークロードの要件が変わり、CPUとメモリの要件に合わせて新しい[Amazon EC2](https://aws.amazon.com/ec2/instance-types/)インスタンスタイプが必要だと判断した例を見てみましょう。例えば、`cfn-workshop-update-behaviors-of-stack-resources` スタックで管理するインスタンスのタイプを、`t2.micro` から `t2.small` に変更します。 +ワークロードの要件が変わり、CPUとメモリの要件に合わせて新しい[Amazon EC2](https://aws.amazon.com/jp/ec2/instance-types/)インスタンスタイプが必要だと判断した例を見てみましょう。例えば、`cfn-workshop-update-behaviors-of-stack-resources` スタックで管理するインスタンスのタイプを、`t2.micro` から `t2.small` に変更します。 -::alert[インスタンスの `InstanceType` プロパティ値を変更する場合、まず[Update requires](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype) で説明されている動作を確認し、スタックを更新するとどうなるのかを理解する必要があります。]{type="info"} +::alert[インスタンスの `InstanceType` プロパティ値を変更する場合、まず [Update requires](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype) で説明されている動作を確認し、スタックを更新するとどうなるのかを理解する必要があります。]{type="info"} さっそくスタックを更新しましょう: @@ -98,11 +98,11 @@ Resources: 3. 先ほど作成したスタック (例えば、`cfn-workshop-update-behaviors-of-stack-resources`) を選択します。 4. **更新**を選択します。 5. **テンプレートの準備**で**現在のテンプレートの使用**を選択し、**次へ**をクリックします。 -6. 次のページで、`LatestAmiId`パラメータのデフォルト値をそのまま使用し、`InstanceType`パラメータ値として`t2.small`を選択します。**次へ**をクリックします。 +6. 次のページで、`LatestAmiId` パラメータのデフォルト値をそのまま使用し、`InstanceType` パラメータ値として `t2.small` を選択します。**次へ**をクリックします。 7. **スタックオプションの設定**ページでデフォルト値のまま、**次へ**をクリックします。 8. **レビュー**ページで一番下までスクロールし、**送信**をクリックします。 -スタックの更新中に、[Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)に移動し、**インスタンス**を選択します。インスタンスは最初に停止されるため、一時的に使用できなくなります。インスタンスタイプが`t2.small`に変更されると、まもなくrunningステータスになることに注意してください。この例は、**一時的な中断を伴う更新**の動作を示しています。 +スタックの更新中に、[Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)に移動し、**インスタンス**を選択します。インスタンスは最初に停止されるため、一時的に使用できなくなります。インスタンスタイプが `t2.small` に変更されると、まもなく running ステータスになることに注意してください。この例は、**一時的な中断を伴う更新**の動作を示しています。 おめでとうございます!**一時的な中断を伴う更新**動作について学習しました。 @@ -110,13 +110,13 @@ Resources: **中断を伴わない更新** -前の例を続けてみましょう。インスタンスは現在、[基本モニタリング](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)を使用しており、インスタンスのメトリクスデータが 5分間隔で[Amazon CloudWatch](https://aws.amazon.com/cloudwatch/)に送信されます。ワークロードのメトリクスデータを1分間隔で利用できるようにする必要があり、インスタンスの[詳細モニタリング](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)を有効にします。 +前の例を続けてみましょう。インスタンスは現在、[基本モニタリング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)を使用しており、インスタンスのメトリクスデータが 5分間隔で[Amazon CloudWatch](https://aws.amazon.com/jp/cloudwatch/) に送信されます。ワークロードのメトリクスデータを1分間隔で利用できるようにする必要があり、インスタンスの[詳細モニタリング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-cloudwatch-new.html)を有効にします。 -次に、`update-behaviors-of-stack-resources.yaml` テンプレートに記載したインスタンスに`Monitoring`[プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring)を `true`に設定して追加します。 +次に、`update-behaviors-of-stack-resources.yaml` テンプレートに記載したインスタンスに `Monitoring` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring)を `true` に設定して追加します。 -::alert[この新しいプロパティを追加する際は、`Monitoring` の[Update requires](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring)の値を見て、スタックを更新するとどうなるかを確認してください。]{type="info"} +::alert[この新しいプロパティを追加する際は、`Monitoring` の [Update requires](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring) の値を見て、スタックを更新するとどうなるかを確認してください。]{type="info"} -既存の `update-behaviors-of-stack-resources.yaml` テンプレートを更新し、`EC2Instance`の定義に`Monitoring`プロパティを指定します。 +既存の `update-behaviors-of-stack-resources.yaml` テンプレートを更新し、`EC2Instance` の定義に `Monitoring` プロパティを指定します。 ```yaml EC2Instance: @@ -133,25 +133,25 @@ EC2Instance: 変更をファイルに保存します。次に、スタックを更新します。 1. [AWS CloudFormationコンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 -2. `cfn-workshop-update-behaviors-of-stack-resources` スタックを作成した[リージョン](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/select-region.html)を選択してください。 +2. `cfn-workshop-update-behaviors-of-stack-resources` スタックを作成した[リージョン](https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/select-region.html)を選択してください。 3. 先ほど作成したスタック (例えば、`cfn-workshop-update-behaviors-of-stack-resources`) を選択します。 4. **更新**を選択します。 5. **テンプレートの準備**セクションで**既存テンプレートを置き換える**を選択し、**テンプレートの指定**セクションの**テンプレートファイルのアップロード**で、`update-behaviors-of-stack-resources.yaml` テンプレートファイルを選択します。準備ができたら、**次へ**をクリックします。 -6. パラメータページで、`LatestAmiId`パラメータと`InstanceType`パラメータのデフォルト値をそのまま使用し、**次へ**をクリックします。 +6. パラメータページで、`LatestAmiId` パラメータと `InstanceType` パラメータのデフォルト値をそのまま使用し、**次へ**をクリックします。 7. **スタックオプションの設定**ページでデフォルト値のまま、**次へ**をクリックします。 8. **レビュー**ページで一番下までスクロールし、**送信**をクリックします。 -[Amazon EC2コンソール](https://console.aws.amazon.com/ec2/)に移動し、**インスタンス**を選択します。スタックが更新されている間、インスタンスは実行中の状態のままであることに注意してください。これは、**中断を伴わない更新**の動作を示しています。 +[Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)に移動し、**インスタンス**を選択します。スタックが更新されている間、インスタンスは実行中の状態のままであることに注意してください。これは、**中断を伴わない更新**の動作を示しています。 おめでとうございます! **中断を伴わない更新**の動作を学習しました。 ### チャレンジ -このラボで使用したテンプレートの`EC2Instance`の`Name`タグキーの`Value`を更新する任務があります。この情報をインスタンスの`Tags`[プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags)に記述します。`update-behaviors-of-stack-resources.yaml`テンプレートで、`Name`タグの`Value`に`cfn-workshop-new-value`を指定します。スタックを更新するときに、3つの更新動作のうちどれが適用されるかわかりますか? +このラボで使用したテンプレートの `EC2Instance` の `Name` タグキーの `Value` を更新する任務があります。この情報をインスタンスの`Tags`[プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags)に記述します。`update-behaviors-of-stack-resources.yaml`テンプレートで、`Name` タグの `Value` に `cfn-workshop-new-value` を指定します。スタックを更新するときに、3つの更新動作のうちどれが適用されるかわかりますか? -::expand[* CloudFormationドキュメントのどこで、特定のリソースタイプ (この場合は`AWS::EC2:: Instance`[リソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html))について、特定のリソースプロパティの更新動作について知ることができますか?]{header="ヒントが必要ですか?"} +::expand[* CloudFormation ドキュメントのどこで、特定のリソースタイプ (この場合は`AWS::EC2:: Instance`[リソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html))について、特定のリソースプロパティの更新動作について知ることができますか?]{header="ヒントが必要ですか?"} -:::expand{header="解決策を見たいですか?"} -次に示すように、テンプレートの`Value`情報を更新します。 +:::expand{header="解決策を確認しますか?"} +次に示すように、テンプレートの `Value` 情報を更新します。 ```yaml EC2Instance: @@ -165,16 +165,16 @@ EC2Instance: Value: cfn-workshop-new-value ``` -変更内容を`update-behaviors-of-stack-resources.yaml`テンプレートに保存します。更新したテンプレートでスタックを更新する前に、`Tags`プロパティの**Update requires**[セクション](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags)を参照してください。この場合、[中断を伴わない更新](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)になります。 +変更内容を `update-behaviors-of-stack-resources.yaml` テンプレートに保存します。更新したテンプレートでスタックを更新する前に、`Tags` プロパティの **Update requires** [セクション](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags)を参照してください。この場合、[中断を伴わない更新](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)になります。 スタックの更新: 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 -2. `cfn-workshop-update-behaviors-of-stack-resources` スタックを作成した[リージョン](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/select-region.html)を選択してください。 -3. 先ほど作成したスタック (例えば`cfn-workshop-update-behaviors-of-stack-resources`) を選択します。 +2. `cfn-workshop-update-behaviors-of-stack-resources` スタックを作成した[リージョン](https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/select-region.html)を選択してください。 +3. 先ほど作成したスタック (例えば、`cfn-workshop-update-behaviors-of-stack-resources`) を選択します。 4. **更新**を選択します。 5. **テンプレートの準備**セクションで**既存テンプレートを置き換える**を選択し、次に `update-behaviors-of-stack-resources.yaml` テンプレートを選択します。準備ができたら、**次へ**をクリックします。 -6. 次のページで、`LatestAmiId`と`InstanceType`パラメータのデフォルト値をそのまま使用し、**次へ**をクリックします。 +6. 次のページで、`LatestAmiId` と `InstanceType` パラメータのデフォルト値をそのまま使用し、**次へ**をクリックします。 7. **スタックオプションの設定**ページでデフォルト値のまま、**次へ**をクリックします。 8. **レビュー**ページで一番下までスクロールし、**送信**をクリックします。 ::: @@ -182,7 +182,7 @@ EC2Instance: ### クリーンアップ 次に示す手順に従って、このラボで作成したリソースをクリーンアップしてください。 -* CloudFormationコンソールで、このラボで作成した`cfn-workshop-update-behaviors-of-stack-resources` スタックを選択します。 +* CloudFormationコンソールで、このラボで作成した `cfn-workshop-update-behaviors-of-stack-resources` スタックを選択します。 * **削除**を選択した後、**スタックの削除**を押して確定します。 --- diff --git a/content/intermediate/templates/architecting-templates/index.ja.md b/content/intermediate/templates/architecting-templates/index.ja.md index 646eed78b..a20960d20 100644 --- a/content/intermediate/templates/architecting-templates/index.ja.md +++ b/content/intermediate/templates/architecting-templates/index.ja.md @@ -5,37 +5,37 @@ weight: 650 ### 概要 -インフラストラクチャをコードで記述する場合、インフラストラクチャの成長に合わせて拡張できることと、時間の経過に伴う継続的な保守性を考慮する必要があります。[AWS CloudFormation ベストプラクティス](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) ページには、ワークフローで従って採用すべきベストプラクティスがまとめられています。このラボでは、コードで記述するリソースの _ライフサイクルと所有権_ の側面と _モジュール性と再利用_ のプラクティスを考慮して、テンプレートの設計に焦点を当てます。これらのプラクティスは、同じアカウントとリージョン内のスタックの値を参照して CloudFormation テンプレートに実装します。テンプレートの入力パラメータも同様です。このワークショップでは、ベストプラクティスの例を示す他のセルフペースラボもあります。例えば、[疑似パラメータ](/basics/templates/pseudo-parameters)、[リンティングとテスト](/basics/templates/linting-and-testing)、[動的参照](/intermediate/templates/dynamic-references) (AWS CloudFormation テンプレート内の機密情報の参照)、[Policy-as-Code with Guard](/intermediate/templates/policy-as-code-with-guard) (JSON および YAML 形式のデータのコードとしてのポリシー検証)です。 +インフラストラクチャをコードで記述する場合、インフラストラクチャの成長に合わせて拡張できることと、時間の経過に伴う継続的な保守性を考慮する必要があります。[AWS CloudFormation ベストプラクティス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html) ページには、ワークフローで採用すべきベストプラクティスがまとめられています。このラボでは、コードで記述するリソースの _ライフサイクルと所有権_ の側面と _モジュール性と再利用_ のプラクティスを考慮して、テンプレートの設計に焦点を当てます。これらのプラクティスは、同じアカウントとリージョン内のスタックの値を参照して CloudFormation テンプレートに実装します。テンプレートの入力パラメータも同様です。このワークショップでは、ベストプラクティスの例を示す他のセルフペースラボもあります。例えば、[疑似パラメータ](/basics/templates/pseudo-parameters)、[リンティングとテスト](/basics/templates/linting-and-testing)、[動的参照](/intermediate/templates/dynamic-references) (AWS CloudFormation テンプレート内の機密情報の参照)、[Policy-as-Code with Guard](/intermediate/templates/policy-as-code-with-guard) (JSON および YAML 形式のデータのコードとしてのポリシー検証) です。 ### 取り上げるトピック -このラボを修了すると、次のことができるようになります。 +このラボを修了すると、次のことを学ぶことができます。 -* ライフサイクルと所有権の基準による設計テンプレートを含むデザインパターンを学ぶ。 -* 依存関係の値をエクスポートして利用することでスタックを構成する方法を学ぶ。 -* モジュール型テンプレートの再利用方法についての概念を学ぶ。 +* ライフサイクルと所有権の基準による設計テンプレートを含むデザインパターンを学習 +* 依存関係の値をエクスポートして利用することでスタックを構成する方法を学習 +* モジュール型テンプレートの再利用方法についての概念を学習 ### ラボを開始 -このラボでは、以下で説明するAWS クラウドで実行される簡単なウェブアプリケーションのためのインフラストラクチャを作成します。 +このラボでは、AWS クラウドで実行される簡単な Web アプリケーションのためのインフラストラクチャを作成します。 -* 特定のリージョン (例: us-east-1) の 2 つの [アベイラビリティーゾーン](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) に 2 つのパブリックサブネットと 2 つのプライベートサブネットが存在する[Amazon Virtual Private Cloud](https://aws.amazon.com/vpc/) (Amazon VPC)を作成します。 +* 特定のリージョン (例: us-east-1) の 2 つの[アベイラビリティーゾーン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) に 2 つのパブリックサブネットと 2 つのプライベートサブネットが存在する [Amazon Virtual Private Cloud](https://aws.amazon.com/jp/vpc/) (Amazon VPC)を作成します。 -* 最低 2 つの [Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2) インスタンス、最大 4 つの [Auto Scaling グループ](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-groups.html) を作成します。インスタンスを 2 つのプライベートサブネットで起動し、簡単なウェブアプリケーションを実行します。 -* インターネット向けエンドポイントを持つ [Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/application-load-balancer/) を作成します。このロードバランサーは EC2 インスタンスの前に配置されます。 -* [Amazon Route 53](https://aws.amazon.com/route53/) [ホストゾーン](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-working-with.html) が1つあり、そこにロードバランサーを指す [エイリアス](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html) レコードを保存します。このサンプルラボの実行中にドメイン名を登録する必要はありません。[プライベートホストゾーン](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/hosted-zones-private.html) を作成して、ホストゾーンが関連付けられた VPC で起動したEC2 インスタンスなどのコンピュートリソースからサンプルアプリケーションに HTTP リクエストを送信できるようにします。そのためには、[AWS Cloud9](https://aws.amazon.com/cloud9/) 環境 (このラボの一部を実行するために使用) を作成し、デプロイするアプリケーションに HTTP リクエストを送信します。 +* 最低 2 つの [Amazon Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/) (Amazon EC2) インスタンス、最大 4 つの [Auto Scaling グループ](https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/auto-scaling-groups.html) を作成します。インスタンスを 2 つのプライベートサブネットで起動し、簡単な Web アプリケーションを実行します。 +* インターネット向けエンドポイントを持つ [Application Load Balancer](https://aws.amazon.com/jp/elasticloadbalancing/application-load-balancer/) を作成します。このロードバランサーは EC2 インスタンスの前に配置されます。 +* [Amazon Route 53](https://aws.amazon.com/jp/route53/) [ホストゾーン](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zones-working-with.html) が 1 つあり、そこにロードバランサーを指す [エイリアス](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html) レコードを保存します。このサンプルラボの実行中にドメイン名を登録する必要はありません。[プライベートホストゾーン](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/hosted-zones-private.html) を作成して、ホストゾーンが関連付けられた VPC で起動した EC2 インスタンスなどのコンピュートリソースからサンプルアプリケーションに HTTP リクエストを送信できるようにします。そのためには、[AWS Cloud9](https://aws.amazon.com/jp/cloud9/) 環境 (このラボの一部を実行するために使用) を作成し、デプロイするアプリケーションに HTTP リクエストを送信します。 -デプロイを始める前に、これから構築するアプリケーションについて考えてみましょう。特に、*ジョブロール*について考えてみてください。例えば、ある会社では、セキュリティ、ネットワーク、アプリケーション、データベースなどに関連する機能を所有するさまざまなチームがあります。すべての機能を 1 つのチームが所有することになったとしても、各テンプレートの各機能をその機能に特化した個人のグループが所有し、マッピングできるようにテンプレートを設計するのがベストプラクティスです。これは、トラブルシューティングや再利用が容易な小さなテンプレートを用意する場合にも役立ちます。このようなテンプレートは、必要に応じてさらに小さなテンプレートに分割できます。また、情報を保持するリソース (データベースなど) と、そのデータを消費するリソース (サーバー群など) を別々のスタックにまとめることも検討できます。これは、関連するリソースを管理するデータベースチームなど、専任のリソース所有者をマッピングするのに役立つだけでなく、また、時間の経過に伴うトラブルシューティングやリソースの維持も容易になります。例えば、データベースとアプリケーションスタック全体を同じテンプレートに記述する場合、次に作成するスタックで問題が発生した場合、問題の性質によっては、最悪、スタックを削除して新しいスタックを作成する必要があります。影響範囲を絞り込むだけでなく、別のテンプレートを使用してデータベースを記述すると、後でテンプレートを再利用する可能性も高くなります。 +デプロイを始める前に、これから構築するアプリケーションについて考えてみましょう。特に、*ジョブロール*について考えてみてください。例えば、ある会社では、セキュリティ、ネットワーク、アプリケーション、データベースなどに関連する機能を所有するさまざまなチームがあります。すべての機能を 1 つのチームが所有することになったとしても、各テンプレートの各機能をその機能に特化した個人のグループが所有し、マッピングできるようにテンプレートを設計するのがベストプラクティスです。これは、トラブルシューティングや再利用が容易な小さなテンプレートを用意する場合にも役立ちます。このようなテンプレートは、必要に応じてさらに小さなテンプレートに分割できます。また、情報を保持するリソース (データベースなど) と、そのデータを消費するリソース (サーバー群など) を別々のスタックにまとめることも検討できます。これにより、関連するリソースを管理するデータベースチームなど、専任のリソース所有者をマッピングするのに役立つだけでなく、時間の経過に伴うトラブルシューティングやリソースの維持も容易になります。例えば、データベースとアプリケーションスタック全体を同じテンプレートに記述する場合、次に作成するスタックで問題が発生した場合、問題の性質によっては、最悪、スタックを削除して新しいスタックを作成する必要があります。影響範囲を絞り込むだけでなく、別のテンプレートを使用してデータベースを記述すると、後でテンプレートを再利用する可能性も高くなります。 -では、これから構築するインフラストラクチャを見てみましょう。次のステップに進む前に、少し時間をとって、このインフラストラクチャをライフサイクルと所有権別に説明するための出発点について考える必要があります。どのように検討を進めますか? +では、これから構築するインフラストラクチャを見てみましょう。次のステップに進む前に、このインフラストラクチャをライフサイクルと所有権別に設計するための出発点について考えます。どのように検討を進めますか? ![architecting-templates-infrastructure-diagram.png](/static/intermediate/templates/architecting-templates/architecting-templates-infrastructure-diagram.png) -出発点としては、次に説明する手順を使用します。後続の各スタックで説明するリソースは、前のスタックで作成するリソースに依存している場合があることに注意してください。 +最初は、次に説明する手順を使用します。後続の各スタックで表現するリソースは、前のスタックで作成するリソースに依存している場合があることに注意してください。 * VPC 関連リソース用の 1 つのテンプレート * ホストゾーン用の 1 つのテンプレート @@ -44,7 +44,7 @@ weight: 650 また、別のテンプレートを使用して Cloud9 環境を記述します (上の図には示されていません)。 -前述の戦略では、所有権 (VPC 関連リソースを所有するネットワークチーム、セキュリティグループのリソースを所有するセキュリティチーム、インフラストラクチャとアプリケーションのデプロイを所有するアプリケーションチーム) を考慮しただけでなく、ライフサイクルも考慮してテンプレートを設計しました。例として、アプリケーションの新しいバージョンをロールアウトする必要があり、それをカットオーバーするための新しいアプリケーションスタックを作成したい場合、アプリケーションインフラストラクチャの依存関係を記述する他のすべての既存のスタックを(必要でない限り)必ずしも再デプロイまたは更新する必要はありません。 +前述の戦略では、所有権 (VPC 関連リソースを所有するネットワークチーム、セキュリティグループのリソースを所有するセキュリティチーム、インフラストラクチャとアプリケーションのデプロイを所有するアプリケーションチーム) を考慮しただけでなく、ライフサイクルも考慮してテンプレートを設計しました。例として、アプリケーションの新しいバージョンをロールアウトする必要があり、それをカットオーバーするための新しいアプリケーションスタックを作成したい場合、アプリケーションインフラストラクチャの依存関係を記述する他のすべての既存のスタックを(必要でない限り)必ずしも再デプロイ、または、更新する必要はありません。 ::alert[上のサンプルインフラストラクチャの一部としてデータベースを作成する場合、それを別のテンプレートで記述することも検討できます。また、同じテンプレート内のアプリケーションセキュリティグループから ingress/egress ルールを参照するために、アプリケーションスタックのセキュリティグループと同じテンプレートに、そのセキュリティグループを記述することも選択可能です。その場合、データベース用のセキュリティグループの情報をエクスポートし、データベースを作成するスタックで使用します。]{type="info"} @@ -55,7 +55,7 @@ weight: 650 まだ、以下の手順が実行できていない場合、前提条件に従い、次のものを自分のワークステーションにインストールします (Cloud9 はこのラボで後ほど使用しますが、最初にワークステーションを使用することから始めます)。 1. [Git をインストール](/prerequisites/git)。 -2. [ラボリソースを取得](/prerequisites/lab-resources): ラボリポジトリのクローンを作成します。これにより、リポジトリがワークステーションの `cfn101-workshop` ディレクトリにクローンされます。 +2. [ラボリソースを取得](/prerequisites/lab-resources): ラボリポジトリのクローンを作成します。本作業を実施すると、リポジトリがワークステーションの `cfn101-workshop` ディレクトリにクローンされます。 次に、クローンを作成したリポジトリの `cfn101-workshop/code/workspace/architecting-templates` ディレクトリに移動します。まずは、`base-network.template` ファイルと `cloud9.template` ファイルを使用して、ベースインフラストラクチャと Cloud9 環境をそれぞれ作成します。 @@ -64,39 +64,39 @@ weight: 650 ### VPC スタックの作成 -さあ、始めましょう! CloudFormation を使用してインフラストラクチャを説明するときに、このラボで使用するサンプルテンプレートが一連の依存関係とどのように結び付けられているかを見てみましょう。これらの依存関係は、あるスタックにエクスポートされ、別のスタックにインポートされます。 +さあ、始めましょう! CloudFormation を使用してインフラストラクチャを表現するときに、このラボで使用するサンプルテンプレートが一連の依存関係とどのように結び付けられているかを見てみましょう。これらの依存関係は、あるスタックにエクスポートされ、別のスタックにインポートされます。 `base-network.template` ファイルを使用して新しいスタックを作成します。 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動します。 -2. ページ上部のリージョンセレクターから、*バージニア北部* (`us-east-1`)などのリージョンを選択します。 +2. ページ上部のリージョンセレクターから、*バージニア北部* (`us-east-1`) などのリージョンを選択します。 3. **スタックの作成**から、**新しいリソースを使用 (標準)** を選択します。 4. **テンプレートの準備**セクションで、**テンプレート準備完了**を選択します。 5. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。前述の `base-network.template` ファイルを選択し、**次へ** をクリックします。 6. スタック名を指定します。例えば、`cloudformation-workshop-dev-base-network` と入力します。デフォルトのパラメータ値のまま、**次へ** をクリックします。 7. 次のページで、**次へ**をクリックします。 -8. 次のページで**送信**をクリックします。 +8. 次のページで、**送信**をクリックします。 -スタックの作成が開始されます。最後に、スタックのステータスが `CREATE_COMPLETE` になります。スタックの作成が進むにつれて、ワークステーションの任意のテキストエディタで `base-network.template` ファイルを開きます。次の点に注意してください。 +スタックの作成が開始されます。最後に、スタックのステータスが `CREATE_COMPLETE` になります。スタックの作成が進むにつれて、ワークステーションの任意のテキストエディタで `base-network.template` ファイルを開きます。次の点を確認してください。 -* リージョン内の別々のアベイラビリティーゾーン (例えば、`us-east-1` リージョンの `us-east-1a`、`us-east-1b` アベイラビリティーゾーン) にサブネットを作成する場合は、各サブネットで `AvailabilityZone` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) を指定します。サンプルテンプレートでは、アベイラビリティーゾーン名 (`us-east-1a` など) をハードコーディングする代わりに、`Fn::Sub` [組み込み関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html) を使用します (テンプレートでは YAML の短縮形 `!sub`) を使用して、リージョンの名前 (例: `AWS::Region` [疑似パラメータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html#cfn-pseudo-param-region) の `us-east-1`) を `a` または `b` のいずれかと連結します。例えば、`AvailabilityZone: !Sub '${AWS::Region}a'` と記述します。このように、テンプレートの移植性を高めることで、このテンプレートをリージョン間で再利用しやすくできます。 -* テンプレートの `Outputs` セクションで、[エクスポート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html) したいリソースの値を書き留めて、次に作成するスタックでそれらの値を使用できるようにします。特定の名前でエクスポートを作成すると、その名前を参照してエクスポートの値を別のスタックで使用できます。各エクスポートは、アカウントやリージョンごとに一意でなければなりません。サンプルテンプレートでは、各エクスポートの名前にはプレフィックスとしてスタック名が含まれています(前述のように、`AWS::StackName` 疑似パラメータが `Fn::Sub` と共に使用されていることに注意してください)。スタック名は特定のアカウントとリージョンでも一意でなければならないため、最初にプレフィックスとしてスタック名を選択するのが妥当な選択です。もちろん、選択するサフィックスとプレフィックスを組み合わせると、アカウントやリージョン内でも一意のエクスポート名になることを確認する必要があります。最終的には、選択したエクスポート名が一意で、使いやすく、同じ命名規則で後続のスタックで派生しやすい形になっていることが重要です。 +* リージョン内の別々のアベイラビリティーゾーン (例えば、`us-east-1` リージョンの `us-east-1a`、`us-east-1b` アベイラビリティーゾーン) にサブネットを作成する場合は、各サブネットで `AvailabilityZone` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) を指定します。サンプルテンプレートでは、アベイラビリティーゾーン名 (`us-east-1a` など) をハードコーディングする代わりに、`Fn::Sub` [組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html) を使用します (テンプレートでは YAML の短縮形 `!sub`) を使用して、リージョンの名前 (例: `AWS::Region` [疑似パラメータ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html#cfn-pseudo-param-region) の `us-east-1`) を `a` または `b` のいずれかと連結します。例えば、`AvailabilityZone: !Sub '${AWS::Region}a'` と記述します。連結し、テンプレートの移植性を高めることで、このテンプレートをリージョン間で再利用しやすくできます。 +* テンプレートの `Outputs` セクションで、[エクスポート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html) したいリソースの値を書き留めて、次に作成するスタックでそれらの値を使用できるようにします。特定の名前でエクスポートを作成すると、その名前を参照してエクスポートの値を別のスタックで使用できます。各エクスポートは、アカウントやリージョンごとに一意でなければなりません。サンプルテンプレートでは、各エクスポートの名前にはプレフィックスとしてスタック名が含まれています(前述のように、`AWS::StackName` 疑似パラメータが `Fn::Sub` と共に使用されていることに注意してください)。スタック名は特定のアカウントとリージョンでも一意でなければならないため、最初にプレフィックスとしてスタック名を選択するのが妥当な選択です。もちろん、選択するサフィックスとプレフィックスを組み合わせると、アカウントやリージョン内でも一意のエクスポート名になることを確認する必要があります。最終的には、選択したエクスポート名が一意で、使いやすく、同じ命名規則で後続のスタックで派生しやすい形になっていることが重要です。 ### Cloud9 環境の作成 -次に、Cloud9 環境を作成します。これを 2 つの目的で使用します。1 つは、このラボ用のインフラストラクチャのデプロイを継続すること、もう 1 つは VPC の範囲内で DNS 設定を検証することです。Cloud9 環境をデプロイする前に、環境そのものを記述するテンプレートでどのようにエクスポートを実行するかを見てみましょう。お好みのテキストエディタで `cloud9.template` ファイルを開き、`AWS::Cloud9:: EnvironmentEC2` リソースタイプの`SubnetId` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-subnetid) の値を書き留めておきます。Cloud9 環境の EC2 インスタンスを使用して、前述のプライベートホストゾーンの DNS レコードの名前解決をテストするには、プライベートホストゾーン自体に関連付けるのと同じ VPC に属するサブネットでインスタンスを起動します。このラボでは、前に作成した最初のパブリックサブネットを指定します。そのためには、値が最初のサブネットの ID を含むエクスポートの名前を参照します。この例ではまず、最初のパブリックサブネットのエクスポート名を作成します。目的の値をエクスポートしたスタックの名前を (このスタック名を `cloud9.template` に入力パラメータとして渡します) VPC スタックで選択したサフィックスに連結します: `Fn::Sub: ${NetworkStackName}-PublicSubnet1Id`。エクスポートの合成名を使用して、その値を `Fn::ImportValue` [組み込み関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) で利用します。これはサンプルテンプレートに YAML の短縮形で示されています。クロススタック参照の詳細については、この [ページ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) の `Fn::ImportValue` の **Note** セクションを参照してください。 +次に、Cloud9 環境を作成します。これを 2 つの目的で使用します。1 つは、このラボ用のインフラストラクチャのデプロイを継続すること、もう 1 つは VPC の範囲内で DNS 設定を検証することです。Cloud9 環境をデプロイする前に、環境そのものを記述するテンプレートでどのようにエクスポートを実行するかを見てみましょう。お好みのテキストエディタで `cloud9.template` ファイルを開き、`AWS::Cloud9::EnvironmentEC2` リソースタイプの `SubnetId` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cloud9-environmentec2.html#cfn-cloud9-environmentec2-subnetid) の値を書き留めておきます。Cloud9 環境の EC2 インスタンスを使用して前述のプライベートホストゾーンの DNS レコードの名前解決をテストするには、プライベートホストゾーン自体に関連付けるのと同じ VPC に属するサブネットでインスタンスを起動します。このラボでは、先ほど作成した最初のパブリックサブネットを指定します。サブネットを指定するには、サブネット ID を含むエクスポート名を参照します。この例では、最初に、エクスポートしたスタック名 (このスタック名を `cloud9.template` に入力パラメータとして渡します)を、 VPC スタックで選択したサフィックス (`Fn::Sub: ${NetworkStackName}-PublicSubnet1Id`) に連結し、最初のパブリックサブネットのエクスポート名を作成します。エクスポートの合成名を使用して、その値を `Fn::ImportValue` [組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) で利用します。なお、サンプルテンプレートには、YAML の短縮形で示されています。クロススタック参照の詳細については、この [ページ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) の `Fn::ImportValue` の **Note** セクションをご参照ください。 -Cloud9の環境を作ってみましょう! [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) を使用します。 +Cloud9 の環境を作ってみましょう! [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) を使用します。 -1. 前に選択したのと同じリージョン (*バージニア北部* (`us-east-1`)など) にいることを確認してください。 +1. 先ほど選択したリージョンと同一のリージョン (*バージニア北部* (`us-east-1`)など) であることを確認してください。 2. **スタックの作成**から、**新しいリソースを使用 (標準)** を選択します。 3. **テンプレートの準備**セクションで、**テンプレート準備完了**を選択します。 4. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。`cloud9.template` ファイルを選択し、**次へ**をクリックします。 5. スタック名を指定します。例えば、`cloudformation-workshop-dev-cloud9` と入力します。デフォルトのパラメータ値のまま、**次へ** をクリックします。 6. 次のページで、**次へ**をクリックします。 -7. 次のページで**送信**をクリックします。 +7. 次のページで、**送信**をクリックします。 8. スタックのステータスが `CREATE_COMPLETE` になるまで、スタックの作成ページを更新します。名前のプレフィックスが `aws-cloud9-aws-cloudformation-workshop-` となっている別のスタックも作成されることに注意してください。このスタックは、Cloud9 環境のセキュリティグループと EC2 インスタンスを作成します。 9. 準備ができたら、Cloud9 環境を開きます。[AWS Cloud9 コンソール](https://console.aws.amazon.com/cloud9/home) に移動し、`aws-cloudformation-workshop` 環境を見つけて、**Open IDE** を選択します。これで、環境が別のウィンドウで開かれるはずです。 @@ -104,9 +104,9 @@ Cloud9の環境を作ってみましょう! [AWS CloudFormation コンソー ### `cfn-lint` のインストール -ソフトウェア開発ライフサイクル (SDLC) の一環として、*フィードバックループを短縮して時間を節約* するために、コード開発中に問題の発見と修正を開始するには、早期テストが鍵となります。CloudFormation を使用する際のベストプラクティスの一環として、テンプレートが有効な JSON または YAML データ構造を使用しているだけでなく、[AWS CloudFormation リソース仕様](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html) にも準拠していることを検証する必要があります 。これを実施することで、例えば、間違ったリソースプロパティ名や値を指定した場合、ワークステーションでテンプレートを作成するときに、SDLCの非常に早い段階でこれを発見できます。 +ソフトウェア開発ライフサイクル (SDLC) の一環として、*フィードバックループを短縮して時間を節約* するために、コード開発中に問題の発見と修正を開始するには、早期テストが鍵となります。CloudFormation を使用する際のベストプラクティスの一環として、テンプレートが有効な JSON または YAML データ構造を使用しているだけでなく、[AWS CloudFormation リソース仕様](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html) にも準拠していることを検証する必要があります 。早期にテストを実施することで、例えば、間違ったリソースプロパティ名や値を指定した場合、ワークステーションでテンプレートを作成するときに、SDLC の非常に早い段階で誤りを発見できます。 -テンプレートを検証するには、次に [AWS CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) を使用します。Cloud9 環境で、ページの下部にあるコマンドラインターミナルを見つけます。まず、次に示すように、`virtualenv` を使用して Python 用の新しい仮想環境を作成してアクティブ化します。 +テンプレートを検証するには、[AWS CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) を使用します。Cloud9 環境のページの下部にあるコマンドラインターミナルを利用し、次に示すように、`virtualenv` を使用して Python 用の新しい仮想環境を作成し、アクティブ化します。 :::code{language=shell showLineNumbers=false showCopyAction=true} mkdir ~/my-virtual-environments @@ -120,17 +120,17 @@ source ~/my-virtual-environments/cloudformation-workshop-venv/bin/activate pip install cfn-lint ::: -::alert[Cloud9の現在のターミナルを閉じてから新しいターミナルを再度開く場合は、`source ~/my-virtual-environments/cloudformation-workshop-venv/bin/activate` コマンドをもう一度実行して、以前に作成した仮想環境を新しいターミナルでアクティブ化してください。]{type="info"} +::alert[Cloud9 の現在のターミナルを閉じてから新しいターミナルを再度開く場合は、`source ~/my-virtual-environments/cloudformation-workshop-venv/bin/activate` コマンドをもう一度実行して、以前に作成した仮想環境を新しいターミナルでアクティブ化してください。]{type="info"} -インフラストラクチャをデプロイし続ける中で、`cfn-lint` を使用する例を後で説明します。このワークショップでの CloudFormation テストツールの詳細については、[リンティングとテスト](/basics/templates/linting-and-testing) ラボを参照してください。`cfn-lint` をワークステーションで任意の [サポートされているエディタ](https://github.com/aws-cloudformation/cfn-lint#editor-plugins) のプラグインとしても実行可能です。あなたのプロジェクトにて、`cfn-lint` を `pre-commit` [フック](https://github.com/aws-cloudformation/cfn-lint#pre-commit) として実行するように選択することもできます。 +インフラストラクチャをデプロイし続ける中で、`cfn-lint` を使用する例を後で説明します。このワークショップでの CloudFormation テストツールの詳細については、[リンティングとテスト](/basics/templates/linting-and-testing) ラボをご参照ください。`cfn-lint` をワークステーションで任意の [サポートされているエディタ](https://github.com/aws-cloudformation/cfn-lint#editor-plugins) のプラグインとしても実行可能です。あなたのプロジェクトにて、`cfn-lint` を `pre-commit` [フック](https://github.com/aws-cloudformation/cfn-lint#pre-commit) として実行することもできます。 -::alert[フェイルファスト戦略や使用しているSDLCプロセスの一環として、コードで記述したインフラストラクチャが、会社が必要としている統制に準拠していることを確認するためのコンプライアンス検証チェックも含める必要があります。一例として、CloudFormation のツールや機能には [AWS CloudFormation Guard](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html) と [AWS CloudFormation Hooks](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/hooks.html) がありますが、これらはこのラボでは説明しません。この CloudFormation ワークショップの、[Policy-as-Code with Guard](/mediate/templates/policy-as-code-with-guard) ラボを試してみてください。]{type="info"} +::alert[フェイルファスト戦略や使用している SDLC プロセスの一環として、コードで記述したインフラストラクチャが、会社が必要としている統制に準拠していることを確認するためのコンプライアンス検証チェックも含める必要があります。一例として、CloudFormation のツールや機能には [AWS CloudFormation Guard](https://docs.aws.amazon.com/ja_jp/cfn-guard/latest/ug/what-is-guard.html) と [AWS CloudFormation Hooks](https://docs.aws.amazon.com/ja_jp/cloudformation-cli/latest/userguide/hooks.html) がありますが、このラボでは説明しません。CloudFormation ワークショップの、[Policy-as-Code with Guard](/mediate/templates/policy-as-code-with-guard) ラボを試してみてください。]{type="info"} ### Cloud9 環境からのデプロイの継続 -リソースのデプロイを続行します。今回は、[AWS Command Line Interface](https://aws.amazon.com/cli/) (AWS CLI) を使用してスタックを作成します。AWS CLI は既に Cloud9 に含まれています。今後の参考として、ご自身のワークステーションにインストールする方法の詳細については、[AWS CLI 入門ガイド](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html) を参照してください。 +リソースのデプロイを続行します。今回は、[AWS Command Line Interface](https://aws.amazon.com/jp/cli/) (AWS CLI) を使用してスタックを作成します。AWS CLI は既に Cloud9 に含まれています。今後の参考として、ご自身のワークステーションにインストールする方法の詳細については、[AWS CLI 入門ガイド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html) をご参照ください。 インフラストラクチャのデプロイを続けるには、まずこのラボのリポジトリを Cloud9 環境にクローンする必要があります。次に示すように、必ず `~/environment` ディレクトリ内から以下のコマンドを実行してください。 @@ -155,15 +155,15 @@ cd cfn101-workshop/code/workspace/architecting-templates/ cfn-lint *.template ::: -上記のコマンドの出力は表示されないはずです。つまり、エラーがないということです。このコマンドは、テンプレートが前述のリソースタイプの仕様に準拠していることを確認しました。このラボでは、テンプレートアーキテクチャの例に焦点を当て、ワークスペースを準備するために、VPC と Cloud9 環境のリソースを直接デプロイし始めました。ベストプラクティスの一環として、リソースをデプロイしたり、テンプレートをリポジトリに追加したりする前に `cfn-lint` を実行して、時間を節約し、プロセスの早い段階で変更を加えます。 +上記のコマンドの出力は表示されないはずです。つまり、エラーがないということを示しています。このコマンドを実行することで、テンプレートが前述のリソースタイプの仕様に準拠していることを確認できました。このラボでは、テンプレートアーキテクチャの例を示すことと、ワークスペースを準備するという2つの理由のために、VPC と Cloud9 環境のリソースをデプロイしました。ベストプラクティスの一環として、リソースをデプロイしたり、テンプレートをリポジトリに追加したりする前に `cfn-lint` を実行して、プロセスの早い段階で変更を加えます。 -`cfn-lint` の機能の例を説明するために、Cloud9 の左側にある *Environment* ナビゲーションタブを使用して `aws-cloudformation-workshop -> cfn101-workshop-> code -> workspace -> architecting-templates` ディレクトリの `hosted-zone.template` ファイルを開きます。 `Name: !Ref 'HostedZoneName'` の行を、一時的に `Names: !Ref 'HostedZoneName'` をに変更します (`Name` プロパティを一時的に `Names` に変更します)。次に、先ほど行ったように `cfn-lint` を実行すると、次のようなエラーが表示されるはずです。 +`cfn-lint` の機能の例を説明するために、Cloud9 の左側にある *Environment* ナビゲーションタブを使用して `aws-cloudformation-workshop -> cfn101-workshop-> code -> workspace -> architecting-templates` ディレクトリの `hosted-zone.template` ファイルを開きます。 `Name: !Ref 'HostedZoneName'` の行を、一時的に `Names: !Ref 'HostedZoneName'` に変更します (`Name` プロパティを一時的に `Names` に変更します)。次に、先ほど行ったように `cfn-lint` を実行すると、次のようなエラーが表示されるはずです。 :::code{language=shell showLineNumbers=false showCopyAction=false} E3002 Invalid Property Resources/HostedZone/Properties/Names ::: -ここで `cfn-lint` は、指定したプロパティが、[論理 ID](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html) が `HostedZone` のリソースに対して有効ではないことを示しています。ご覧のとおり、早めにチェックして、リンティングの観点からテンプレートを検証する機会があります。 +ここで `cfn-lint` は、指定したプロパティが、[論理 ID](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html) が `HostedZone` のリソースに対して有効ではないことを示しています。ご覧のとおり、早めにチェックして、リンティングの観点からテンプレートを検証する機会があります。 ::alert[ホストゾーンを作成する前に、忘れずに `Names` を `Name` に戻してください。]{type="warning"} @@ -171,12 +171,12 @@ E3002 Invalid Property Resources/HostedZone/Properties/Names ### ホストゾーンの作成 -Cloud9 の `hosted-zone.template` ファイルを開きます。次の点に注意してください。 +Cloud9 で `hosted-zone.template` ファイルを開きます。次の点をご確認ください。 -* このラボでは、これから作成するホストゾーンを VPC に関連付けます。VPC の ID を参照する `AWS::Route53::HostedZone` リソースタイプの設定を見ると、このサンプルテンプレートがどのように実装されているかがわかります。そのためには、まずエクスポート名を `Fn::Sub: ${NetworkStackName}-VpcId` で構成し、次に外側の `!ImportValue` 宣言でエクスポートの値を利用します。 +* このラボでは、これから作成するホストゾーンを VPC に関連付けます。VPC の ID を参照する `AWS::Route53::HostedZone` リソースタイプの設定を見ると、このサンプルテンプレートがどのように実装されているかがわかります。そのためには、まずエクスポート名を `Fn::Sub: ${NetworkStackName}-VpcId` で構成し、次に `!ImportValue` 宣言でエクスポート値を利用します。 * ホストゾーンを作成したら、ホストゾーン情報を利用するアプリケーションスタックを作成します。アプリケーションスタックには、同じスタックで作成するロードバランサーを指す DNS エイリアスレコードを記述し、このレコードの保存場所を知る必要があります。`hosted-zone.template` ファイルでは、ホストゾーンの ID と名前を `Outputs` セクションにエクスポートして、この情報を後でアプリケーションスタックで使用できるようにします。 -このテンプレートで説明されているビジネスロジックを理解できたので、次はホストゾーンを作成します。 これには、Cloud9 環境に既にインストールされている AWS CLI を使用します。まず、`hosted-zone.template` ファイルと `us-east-1` リージョンに `cloudformation-workshop-dev-hosted-zone` という名前の新しいスタックを作成します。 +このテンプレートで表現されているビジネスロジックを理解できたので、次はホストゾーンを作成します。 この作業の実行には、Cloud9 環境に既にインストールされている AWS CLI を使用します。まず、`hosted-zone.template` ファイルと `us-east-1` リージョンに `cloudformation-workshop-dev-hosted-zone` という名前の新しいスタックを作成します。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws cloudformation create-stack \ @@ -185,7 +185,7 @@ aws cloudformation create-stack \ --region us-east-1 ::: -これにより、次の抜粋のような出力が得られます。 +このコマンドを実行することで、次の抜粋のような出力が得られます。 :::code{language=json showLineNumbers=false showCopyAction=false} { @@ -207,7 +207,7 @@ aws cloudformation wait stack-create-complete \ ### セキュリティグループの作成 -Cloud9 の `security-groups.template` ファイルを開きます。このサンプルテンプレートでは、2 つのセキュリティグループについて説明しています。1 つは作成するロードバランサー用、もう 1 つはサンプル Web アプリケーションを実行する EC2 インスタンス用です。どちらのセキュリティグループも、前に見たのと同じ方法で VPC ID を消費することに注意してください。また、セキュリティグループ ID が `Outputs` セクションでエクスポートされ、後でアプリケーションスタックから使用できるようにするのにも注意してください。 +Cloud9 で `security-groups.template` ファイルを開きます。このサンプルテンプレートでは、2 つのセキュリティグループについて表現しています。1 つは作成するロードバランサー用、もう 1 つはサンプル Web アプリケーションを実行する EC2 インスタンス用です。どちらのセキュリティグループも、前に見たのと同じ方法で VPC ID を利用することに注意してください。また、セキュリティグループ ID が `Outputs` セクションでエクスポートされ、後でアプリケーションスタックから使用可能としている点にも注目します。 `cloudformation-workshop-dev-security-groups` という名前の新しいスタックでセキュリティグループを作成します。 @@ -218,7 +218,7 @@ aws cloudformation create-stack \ --region us-east-1 ::: -そして、作成が完了するのを待ってください。 +コマンド実行後は、作成が完了するのを待ちます。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws cloudformation wait stack-create-complete \ @@ -234,10 +234,10 @@ Cloud9 で `application.template` ファイルを開きます。このテンプ * このラボで簡単にテストできるように、ロードバランサーの HTTP リスナーを使用します。 -* Auto Scaling グループ [リソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) は `LaunchTemplate` [リソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) を使用して各インスタンスをブートストラップします。特に、 `LaunchTemplateData` の下にある `UserData` プロパティ内から、最初に`yum update -y aws-cfn-bootstrap` を使用して各インスタンスで [CloudFormation ヘルパースクリプト](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html) がどのようにセットアップされて、次に、`cfn-init` [ヘルパースクリプト](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html) がパッケージ (`httpd` など) インストールとコンテンツの設定にどのように使用されるかがわかります: 例として、デフォルト値が `Hello world!` となっているサンプルテンプレートパラメータから参照されている `/var/www/html/index.html` Web アプリケーションファイルの値に注目してください。 -* `UserData` セクションの `cfn-signal` [ヘルパースクリプト](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-signal.html) は、インスタンスが正常に作成されたか更新されたかを CloudFormation に伝えるように設定されています。さらに、`cfn-hup` [ヘルパー](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-hup.html) は、スタックの更新時に `Metadata` の変化を検出するように設定されています (この例では、検出の `interval` はデフォルト値の `15`の代わりに 2 分ごとにチェックするように設定されていることに注意してください)。必要に応じて変更を適用します。 -* Auto Scaling グループは、`Timeout` を 15 分に設定した CreationPolicy [属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html) を使用して、その間に少なくとも 2 つの `Count` シグナル (2 つのインスタンスのそれぞれから 1 つ) を受信して、インスタンスのブートストラップが成功しました。このような信号が 15 分以内に受信されない場合、スタックはロールバックされます。 -* Auto Scaling グループは、`UpdatePolicy` [属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html) と `autoScalingRollingUpdate` [ポリシー](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-rollingupdate) も使用しています。 スタックを更新し、関連するリソースの更新がトリガーされると、ポリシーは `MaxBatchSize` で指定されたとおりに一度に 1 つのインスタンスを更新し、最低 2 つのインスタンスをサービス状態のままにします (`MinInstanceInService` を参照)。さらに、`PauseTime` と `WaitOnResourceSignals` を組み合わせると、追加または置換されたインスタンスから正常にシグナルを受信するまで、Auto Scaling グループが 15 分間 (`PT15M`) 待つように CloudFormation に指示します。 +* Auto Scaling グループ [リソース](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html) は `LaunchTemplate` [リソース](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) を使用して各インスタンスをブートストラップします。特に、 `LaunchTemplateData` の下にある `UserData` プロパティ内から、最初に `yum update -y aws-cfn-bootstrap` を使用して各インスタンスで [CloudFormation ヘルパースクリプト](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-helper-scripts-reference.html) がどのようにセットアップされて、次に、`cfn-init` [ヘルパースクリプト](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-init.html) がパッケージ (`httpd` など) インストールとコンテンツの設定にどのように使用されるかがわかります: 例として、デフォルト値が `Hello world!` となっているサンプルテンプレートパラメータから参照されている `/var/www/html/index.html` Web アプリケーションファイルの値に注目してください。 +* `UserData` セクションの `cfn-signal` [ヘルパースクリプト](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-signal.html) は、インスタンスの作成や更新が成功したかどうかを CloudFormation に伝えるよう設定されています。さらに、`cfn-hup` [ヘルパー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-hup.html) は、スタックの更新時に `Metadata` の変化を検出するように設定されています (この例では、検出の `interval` はデフォルト値の `15` の代わりに 2 分ごとにチェックするように設定されていることに注意してください)。必要に応じて変更を適用します。 +* Auto Scaling グループは、`Timeout` を 15 分に設定した CreationPolicy [属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html) を使用して、その間に少なくとも 2 つの `Count` シグナル (2 つのインスタンスのそれぞれから 1 つ) を受信して、インスタンスのブートストラップが成功しました。このような信号が 15 分以内に受信されない場合、スタックはロールバックされます。 +* Auto Scaling グループは、`UpdatePolicy` [属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html) と `autoScalingRollingUpdate` [ポリシー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-rollingupdate) も使用しています。 スタックを更新し、関連するリソースの更新がトリガーされると、ポリシーは `MaxBatchSize` で指定されたとおりに一度に 1 つのインスタンスを更新し、最低 2 つのインスタンスをサービス状態のままにします (`MinInstanceInService` を参照)。さらに、`PauseTime` と `WaitOnResourceSignals` を組み合わせると、追加または置換されたインスタンスから正常にシグナルを受信するまで、Auto Scaling グループが 15 分間 (`PT15M`) 待つように CloudFormation に指示します。 アプリケーションとそのインフラストラクチャを、`cloudformation-workshop-dev-application` という新しいスタックでデプロイします。 @@ -256,7 +256,7 @@ aws cloudformation wait stack-create-complete \ --region us-east-1 ::: -デプロイの最後には、エイリアスの Route 53 レコードを含む、アプリケーションを作成したスタックが用意されているはずです。次に、デプロイがこのラボで意図したとおりに機能することを検証するときに、さらに詳しく説明します。 +デプロイの最後には、エイリアスの Route 53 レコードを含む、アプリケーションを作成したスタックが用意されているはずです。次に、このラボで意図したとおりにデプロイされていること検証します。 @@ -277,7 +277,7 @@ CloudFormation コンソールから、`cloudformation-workshop-dev-application` #### DNS レコード値の URL に接続して検証 -Cloud9 で `application.template` ファイルを開き、`AWS::Route53::RecordSet` タイプのリソースを探します。このリソースは、プライベートホストゾーンに `A` 型のエイリアスレコードを作成します (`$ {HostedZoneStackName}-HostedZoneId` から名前が派生したエクスポート経由で `HostedZoneId` で参照されます)。`Name` エイリアスレコードの値は `my-example-domain.com` という名前のエントリで、この例ではドメインのZone Apexと同じです。 +Cloud9 で `application.template` ファイルを開き、`AWS::Route53::RecordSet` タイプのリソースを探します。このリソースは、プライベートホストゾーンに `A` 型のエイリアスレコードを作成します (`${HostedZoneStackName}-HostedZoneId` のエクスポートを用いて、`HostedZoneId` を参照します)。`Name` エイリアスレコードの値は `my-example-domain.com` という名前のエントリで、この例ではドメインの Zone Apex と同一です。 このラボでは (代わりにパブリックホストゾーンを指すドメインを登録する代わりに) プライベートホストゾーンを作成したので、VPC のコンテキスト内から上記のエイリアスレコードを解決できるはずです。つまり、VPC で EC2 インスタンスを作成した Cloud9 環境は、名前解決を正常に実行できるはずです。Cloud9 のコンソールターミナルから、以下のコマンドを実行します。 @@ -287,23 +287,23 @@ curl http://my-example-domain.com `Hello world!` は、先ほど見たものと同じ出力です。 -おめでとうございます! これで、CloudFormation を使用してサンプルアプリケーションとそのインフラストラクチャのデプロイを正常に実行し、検証できました。 +おめでとうございます! CloudFormation を使用してサンプルアプリケーションとそのインフラストラクチャのデプロイを正常に実行し、検証することができました。 ### チャレンジ -この課題では、再利用とモジュール性に関連する主要な概念を思い出して適用し、それらをデプロイメントのオーケストレーションの観点から拡張します。あなたは、(Cloud9のワークスペースにある)`application.template`ファイルを `application-blue-green.template` という名前の新しいファイルにコピーし、この新しいファイルを更新して、blue/green のデプロイパターンのコンテキストで2つのスタックで使用できるようにします。[Amazon Route 53 DNSルーティングの更新](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/update-dns-routing-with-amazon-route-53.html)をご参照ください。このチャレンジの要件は次の通りでです。 +この課題では、再利用とモジュール性に関連する主要な概念を思い出して適用し、それらをデプロイメントのオーケストレーションの観点から拡張します。あなたは、(Cloud9 のワークスペースにある)`application.template` ファイルを `application-blue-green.template` という名前の新しいファイルにコピーし、この新しいファイルを更新して、blue / green のデプロイパターンのコンテキストで 2 つのスタックで使用できるようにします。[Amazon Route 53 DNS ルーティングの更新](https://docs.aws.amazon.com/ja_jp/whitepapers/latest/blue-green-deployments/update-dns-routing-with-amazon-route-53.html)をご参照ください。このチャレンジの要件は次の通りでです。 -* 2つのスタックを用意します。作成した既存の `cloudformation-workshop-dev-application` を更新し、`cloudformation-workshop-dev-application-v2` という名前の新しいスタックを作成して、それぞれ`Hello world!` の代わりに `Blue` と `Green` を出力として表示します。両方のスタックをそれぞれ *Blue* と *Green* と呼び、両方のスタックに新しい `application-blue-green.template` ファイルを使用します。 -* 各スタックは、前に使用したものと同じ `名前` (ホストゾーン名) を持つ新しいエイリアスレコードを作成する必要があります。ただし、これらのレコードは両方とも [加重セット](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-values-weighted.html#rrsets-values-weighted-weight) である必要があります。これにより、Route 53 は、[特定のリソースの合計に対する重みの比率](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html) に基づいてユーザーが発行したクエリに応答します。最初に、 *Blue* スタックに重み `255` (大きい重み) を割り当て、*Green* スタックに重み `1` (少ない重み) を割り当てます。この方法では、*Blue* は最初にトラフィックの 255/256、*Green* はトラフィックの 1/256 に割り当てられます。 -* テンプレート内の _set identifier_ を必ず更新して、同じテンプレートを使用する 2 つのスタックで値が一意になるようにしてください。 +* 2つのスタックを用意します。作成した既存の `cloudformation-workshop-dev-application` を更新し、`cloudformation-workshop-dev-application-v2` という名前の新しいスタックを作成して、それぞれ `Hello world!` の代わりに `Blue` と `Green` を出力として表示します。両方のスタックをそれぞれ *Blue* と *Green* と呼び、両方のスタックに新しい `application-blue-green.template` ファイルを使用します。 +* 各スタックは、前に使用したものと同じ `名前` (ホストゾーン名) を持つ新しいエイリアスレコードを作成する必要があります。ただし、これらのレコードは両方とも [加重セット](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-values-weighted.html#rrsets-values-weighted-weight) である必要があります。これにより、Route 53 は、[特定のリソースの合計に対する重みの比率](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-policy-weighted.html) に基づいてユーザーが発行したクエリに応答します。最初に、 *Blue* スタックに重み `255` (大きい重み) を割り当て、*Green* スタックに重み `1` (少ない重み) を割り当てます。この方法では、*Blue* は最初にトラフィックの 255 / 256、*Green* はトラフィックの 1 / 256 に割り当てられます。 +* 必ず、テンプレート内の _set identifier_ を更新し、同じテンプレートを使用する 2 つのスタックで値が一意となるようにします。 このラボの例で望ましい状態を示す図を以下に示します。 ![architecting-templates-blue-green-diagram.png](/static/intermediate/templates/architecting-templates/architecting-templates-blue-green-diagram.png) -`AWS::Route53::RecordSet` リソースタイプの CloudFormation ドキュメント [ページ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html) を参照して、上記の要件を満たすために追加または更新するプロパティを特定してください。 +`AWS::Route53::RecordSet` リソースタイプの CloudFormation ドキュメント [ページ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html) を参照して、上記の要件を満たすために追加または更新するプロパティを特定してください。 2 つのスタックを作成したら、`my-example-domain.com` エイリアスが最初はほとんどが *Blue* を指していることを `curl` で検証します。次に、両方のスタックで作成したエイリアスレコードのウェイト値を反転させて、もう一度テストすると、ほとんどのトラフィックが *Green* にルーティングされます(つまり、出力が `Green` のサンプルアプリのバージョン 2 をロードします)。 @@ -311,24 +311,24 @@ curl http://my-example-domain.com :::expand{header= "ヒントが必要ですか?"} -* サンプルの `PageTextContent` テンプレートパラメータを再利用して、新しい値を追加して、テンプレートを使用する特定のスタックでの `Blue` または `Green` の実行を実証および検証できるようにする方法を検討してください。 -* `SetIdentifier` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-setidentifier) を参照してください。*Blue* スタックを起動するか、*Green* スタックを起動するかに応じて、このプロパティに一意の値を指定する方法を選択します。 -* `Weight` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-weight) を参照してください。 -* 更新したレコードセットで `Region` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-region) を指定する必要はありません。 +* サンプルの `PageTextContent` テンプレートパラメータを再利用し、新しい値を追加して、テンプレートを使用する特定のスタックでの `Blue` または `Green` の実行を実証および検証できるようにする方法をご検討ください。 +* `SetIdentifier` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-setidentifier) をご参照ください。*Blue* スタックを起動するか、*Green* スタックを起動するかに応じて、このプロパティに一意の値を指定します。 +* `Weight` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-weight) をご参照ください。 +* 更新したレコードセットで `Region` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html#cfn-route53-recordset-region) を指定する必要はありません。 ::: -::::expand{header= "解決策を見たいですか?"} +::::expand{header= "解決策を確認しますか?"} 解決策は、`code/solutions/architecting-templates` ディレクトリにある `application-blue-green.template` ファイルにあります。 代わりに、`application-blue-green.template` ファイルを参照しつつ、以下の手順に従ってあなたのワークスペースを更新してください。 -* `AllowedValues` を `PageTextContent` サンプル入力パラメータ(`-Blue`、`-Green`)を、インデントに注意し、2 行に分けて追加します。 -* 新しいテンプレートパラメータ `RecordSetWeight` を追加します。`Type`を `Number` に、`Default` の値を `0`に、`MinValue` を `0` に、`MaxValue` を `255` に設定します。 パラメータの目的をユーザに伝えるための `Decription` を追加します。 +* `AllowedValues` を `PageTextContent` サンプル入力パラメータ (`-Blue`、`-Green`) を、インデントに注意し、2 行に分けて追加します。 +* 新しいテンプレートパラメータ `RecordSetWeight` を追加します。`Type` を `Number` に、`Default` の値を `0` に、`MinValue` を `0` に、`MaxValue` を `255` に設定します。 パラメータの目的をユーザに伝えるための `Decription` を追加します。 * セット識別子を、ホストゾーンの両方のレコードで一意となる値に更新します。次の例のように、レコードセットの `SetIdentifier` プロパティを更新します。例: `SetIdentifier: !Sub '${AppNameTagValue} application managed with the ${AWS::StackName} stack.'` -* `AWS::Route53::RecordSet` リソースタイプに `Weight` プロパティを追加して、`RecordsetWeight` テンプレートパラメータを参照します:`Weight: !Ref 'RecordSetWeight'`。 +* `AWS::Route53::RecordSet` リソースタイプに `Weight` プロパティを追加して、`RecordsetWeight` テンプレートパラメータを参照します: `Weight: !Ref 'RecordSetWeight'`。 * レコードセットリソースから `Region: !Ref 'AWS::Region'` 行を削除します。 * 既存のスタック `cloudformation-workshop-dev-application` を、新しい application-blue-green.template ファイルで更新します。`Blue` を `PageTextContent` のパラメータ値として、`255` を `RecordSetWeight `に渡します。例: @@ -376,7 +376,7 @@ aws cloudformation update-stack \ ParameterKey=RecordSetWeight,ParameterValue=255 ::: -* スタックの更新が完了したら、`my-example-domain.com` レコードが主に `Green` を指すようになったことをテストします。 +* スタックの更新が完了したら、`my-example-domain.com` レコードが主に `Green` を指していることをテストします。 :::code{language=shell showLineNumbers=false showCopyAction=true} curl http://my-example-domain.com @@ -388,9 +388,9 @@ curl http://my-example-domain.com ### クリーンアップ -ワークステーションの CloudFormation コンソールに移動します。このラボで作成したスタックを次の順序で選択して削除します。クロススタック参照を使用していくつかのスタックを参照しているため、値をエクスポートするスタックが利用側スタックでまだ使用されている場合は削除できないことに注意してください。 +ワークステーションの CloudFormation コンソールに移動します。このラボで作成したスタックを次の順序で削除します。クロススタック参照を使用していくつかのスタックを参照しているため、値をエクスポートするスタックが利用側スタックで使用されている場合は削除できない点に注意してください。 -1. `cloudformation-workshop-dev-application-v2` と`cloudformation-workshop-dev-application` は、互いに依存していないため、それぞれが削除されるのを待たずに削除可能です。こ両方のスタックが削除されたら、次のステップに進みます。 +1. `cloudformation-workshop-dev-application-v2` と `cloudformation-workshop-dev-application` は互いに依存していないため、それぞれが削除されるのを待たずに削除可能です。両方のスタックが削除されたら、次のステップに進みます。 2. `cloudformation-workshop-dev-security-groups` と `cloudformation-workshop-dev-hosted-zone` は、それぞれが削除されるのを待たずに削除可能です。次のステップに進みます。 3. `cloudformation-workshop-dev-cloud9` を削除します。このスタックを削除すると、開始した削除アクションによって、名前が `aws-cloud9-aws-cloudformation-workshop-` で始まるスタックも削除されます。両方のスタックが削除されたら、最後のステップに進みます。 4. `cloudformation-workshop-dev-base-network` スタックを削除します。 @@ -398,4 +398,4 @@ curl http://my-example-domain.com ### まとめ -おめでとうございます! ライフサイクルと所有権を考慮したテンプレートの設計方法と、再利用性とモジュール性を優先して多数の擬似パラメータと組み込み関数を使用する方法を学び、実践してきました。また、値をエクスポートおよびインポートしてスタックを作成する方法や、Blue/Greenデプロイパターンを例にしてテンプレートを再利用する方法についても学びました。 +おめでとうございます! ライフサイクルと所有権を考慮したテンプレートの設計方法と、再利用性とモジュール性を優先して多数の擬似パラメータと組み込み関数を使用する方法を学び、実践しました。また、値をエクスポートおよびインポートしてスタックを作成する方法や、Blue / Green デプロイパターンを例にしてテンプレートを再利用する方法についても学びました。 diff --git a/content/intermediate/templates/conditions/index.ja.md b/content/intermediate/templates/conditions/index.ja.md index 6e32ee454..b29b8920b 100644 --- a/content/intermediate/templates/conditions/index.ja.md +++ b/content/intermediate/templates/conditions/index.ja.md @@ -5,31 +5,31 @@ weight: 100 ### 概要 -[AWS CloudFormation](https://aws.amazon.com/cloudformation/) を使用してインフラストラクチャを記述する場合、CloudFormationテンプレートでリソースとリソースプロパティを宣言します。リソースを作成したり、条件に基づいてリソースプロパティ値を指定するようなユースケースがあります。 +[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/) を使用してインフラストラクチャを記述する場合、CloudFormation テンプレートでリソースとリソースプロパティを宣言します。リソースを作成したり、条件に基づいてリソースプロパティ値を指定するようなユースケースで利用します。 -ベストプラクティスの一環として、アプリケーションのインフラストラクチャ用に作成したテンプレートを、`テスト`や`本番`などのライフサイクル環境全体で最大限に再利用する必要があります。コスト削減のため、`テスト`環境でリソースを少ない容量で実行することを選択したとします。例えば、`本番`環境には`t2.small` [Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2) [インスタンスタイプ](https://aws.amazon.com/ec2/instance-types/)、`テスト`環境には `t2.micro` インスタンスタイプを選択します。また、`本番`インスタンスでは 2 GiB の [Amazon Elastic Block Store](https://aws.amazon.com/ebs/) (Amazon EBS) [ボリューム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volumes.html) を作成し、`テスト`インスタンスでは 1 GiB のボリュームを作成します。その他、条件が満たされたときだけリソースを作成するユースケースがあります。 +ベストプラクティスの一環として、アプリケーションのインフラストラクチャ用に作成したテンプレートを、`テスト`や`本番`などのライフサイクル環境全体で最大限に再利用します。例えば、コスト削減のため、`テスト`環境でリソースを少ない容量で実行するケースを想定しましょう。`本番`環境には `t2.small` [Amazon Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/) (Amazon EC2) [インスタンスタイプ](https://aws.amazon.com/jp/ec2/instance-types/)、`テスト`環境には `t2.micro` インスタンスタイプを選択します。また、`本番`インスタンスでは 2 GiB の [Amazon Elastic Block Store](https://aws.amazon.com/jp/ebs/) (Amazon EBS) [ボリューム](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volumes.html) を作成し、`テスト`インスタンスでは 1 GiB のボリュームを作成します。その他にも、条件が満たされたときだけリソースを作成するといったユースケースがあります。 -条件付きでリソースを作成するには、オプションの[条件](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)セクションをテンプレートに追加します。条件と関連する基準を定義したら、[Resources](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resources-section-structure.html)と[Outputs](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) のテンプレートセクションで条件を使用します。例えば、条件をリソースまたはテンプレートに記述した出力に関連付けると、条件付きで特定のリソースを作成したり、条件が満たされた場合は指定された出力を作成したりできます。リソースプロパティ値 (EC2 インスタンスのインスタンスタイプなど) を条件付きで指定するには、[条件関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html) を使用します。 +条件付きでリソースを作成するには、オプションの [Conditions](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html) セクションをテンプレートに追加します。条件と関連する基準を決めたら、[Resources](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resources-section-structure.html) と [Outputs](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) のテンプレートセクションで条件を使用します。例えば、Conditions を Resources またはテンプレートに記述した Outputs に関連付けると、条件付きで特定のリソースを作成したり、条件が満たされた場合は指定された出力を作成したりできます。リソースプロパティ値 (EC2 インスタンスのインスタンスタイプなど) を条件付きで指定するには、[条件関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html) を使用します。 テンプレートで条件を使用するには、次のテンプレートセクションにステートメントを含めます。 -* **Parameters**: 条件を評価したいテンプレート入力パラメータを指定します。 -* **Conditions**: [組み込み条件関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html)を使用して条件を定義します。 -* **Resources と Outputs**: - * 条件付きで作成したいリソースまたは出力に条件を関連付けます。 - * `Fn:: If` [組み込み関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)を使用して、定義した条件に基づいてリソースプロパティ値を条件付きで指定します。 +* **Parameters** : 条件を評価したいテンプレート入力パラメータを指定 +* **Conditions** : [組み込み条件関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html)を使用して条件を定義 +* **Resources と Outputs** : + * 条件付きで作成したい Resources または Outputs に条件を関連付け + * `Fn::If` [組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)を使用して、定義した条件に基づいてリソースプロパティ値を条件付きで指定 -CloudFormationは、スタックの作成時またはスタックの更新時にリソースを作成する前に、テンプレート内のすべての条件を評価します。条件が満たされたリソースは、スタックの作成中または更新時にのみ作成されます。 +CloudFormation は、スタックの作成時またはスタックの更新時にリソースを作成する前に、テンプレート内のすべての条件を評価します。条件が満たされたリソースは、スタックの作成中または更新時にのみ作成されます。 ### 対象トピック このラボを修了すると、次のことができるようになります。 -* Condition 関数を活用するためのサンプルユースケースを定義します。 -* 条件評価に基づいてリソースをプロビジョニングします。 -* Condition 関数を使用してリソースプロパティ値を指定します。 +* Condition 関数を活用するためのサンプルユースケースを定義 +* 条件評価に基づいてリソースをプロビジョニング +* Condition 関数を使用してリソースプロパティ値を指定 -条件関数の使い方の例を見ていきましょう! +条件関数の利用例を見ていきましょう! ### ラボを開始 @@ -37,13 +37,13 @@ CloudFormationは、スタックの作成時またはスタックの更新時に * `code/workspace/conditions` ディレクトリに移動します。 * `condition-resource.yaml` テンプレートを開きます。 -* このラボの手順に従ってテンプレートの内容を更新します。 +* ラボの手順に従ってテンプレートの内容を更新します。 それでは、始めましょう! -まず、テンプレートをより再利用可能にすることに集中しましょう。テンプレートに、ライフサイクル環境の入力パラメータを含む`Parameters`セクションを追加します。`EnvType`パラメータを呼び出し、使用可能な入力値として`test`と`prod`という2つの環境名の例を記述します。使用する[Amazon Machine Image](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) (AMI)の入力パラメータを定義します。この例では、[AWS Systems Manager](https://aws.amazon.com/systems-manager/)[Paramater Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)を使用して、使用可能な最新のAmazon Linux AMIを参照し、`LatestAmiId`というパラメータを呼び出しています。 +まず、テンプレートを再利用可能にすることに集中しましょう。テンプレートに、ライフサイクル環境の入力パラメータを含む `Parameters` セクションを追加します。`EnvType` パラメータを呼び出し、使用可能な入力値として `test` と `prod` という2つの環境名の例を記述します。使用する [Amazon Machine Image](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html) (AMI) の入力パラメータを定義します。この例では、[AWS Systems Manager](https://aws.amazon.com/jp/systems-manager/) [Paramater Store](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html) を使用して、使用可能な最新の Amazon Linux AMI を参照し、`LatestAmiId` というパラメータを呼び出しています。 -::alert[詳細については、[Query for the latest Amazon Linux AMI IDs using AWS Systems Manager Parameter Store](https://aws.amazon.com/blogs/compute/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/)を参照してください。]{type="info"} +::alert[詳細については、[AWS Systems Manager Parameter Store を使用して最新の Amazon Linux AMI ID を取得する](https://aws.amazon.com/jp/blogs/news/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/)をご参照ください。]{type="info"} 以下に示すコンテンツをコピーし、`condition-resource.yaml` ファイルに貼り付けます。 @@ -62,9 +62,9 @@ Parameters: Default: test ConstraintDescription: Specify either test or prod. ``` -次に、[テンプレート](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)の `Conditions` セクションの条件の例である `isProduction` について説明します。この条件では、 `EnvType` パラメータ値が `prod` に等しいかどうかを評価します。 +次に、[テンプレート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-anatomy.html)の `Conditions` セクションの条件の例である `IsProduction` について説明します。この条件では、`EnvType` パラメータ値が `prod` に等しいかどうかを評価します。 -既存のファイルコンテンツに次のコンテンツを追加します。 +既存のファイルに次のコンテンツを追加します。 ```yaml Conditions: @@ -72,7 +72,7 @@ Conditions: - !Ref EnvType - prod ``` -次に、`IsProduction` 条件に基づいて条件付きでプロビジョニングするリソースに条件を関連付けます。次の例では、`Volume` リソースと `MountPoint` リソースを、`IsProduction` に関連付けます。したがって、これらのリソースが作成されるのは、`IsProduction` 条件がtrueの場合、つまり、`EnvType` パラメータ値が` prod`と等しい場合だけです。それ以外の場合は、EC2インスタンスリソースのみがプロビジョニングされます。 +次に、`IsProduction` 条件に基づいて条件付きでプロビジョニングするリソースに条件を関連付けます。次の例では、`Volume` リソースと `MountPoint` リソースを `IsProduction` に関連付けます。`Volume` および `MountPoint` リソースが作成されるのは、`IsProduction` 条件が満たされた場合、つまり、`EnvType` パラメータ値が `prod` と等しい場合だけです。それ以外の場合は、EC2 インスタンスリソースのみがプロビジョニングされます。 以下のコンテンツをコピーし、`condition-resource.yaml` ファイルに貼り付けます。 @@ -103,35 +103,35 @@ Resources: ソリューションをデプロイしましょう! -スタックを作成する時に、`test` を `envType` の値として渡すと、CloudFormationによってEC2インスタンスリソースのみがプロビジョニングされることがわかります。上記の内容で更新したテンプレートを保存します。次に、AWS CloudFormation[コンソール](https://console.aws.amazon.com/cloudformation)に移動し、このテンプレートを使用してスタックを作成します。 +スタックを作成する時に、`test` を `EnvType` の値として渡すと、CloudFormation によって EC2 インスタンスリソースのみがプロビジョニングされることがわかります。更新したテンプレートを保存します。次に、AWS CloudFormation [コンソール](https://console.aws.amazon.com/cloudformation) に移動し、スタックを作成します。 -* CloudFormationコンソールで、**スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 +* CloudFormation コンソールで、**スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 * **テンプレートの準備**セクションで、**テンプレートの準備完了**を選択します。 * **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 -* `condition-resource.yaml`テンプレートを選択します。 -* **スタックの名前**を入力します。例えば、`cfn-workshop-condition-test`と入力します。 +* `condition-resource.yaml` テンプレートを選択します。 +* **スタックの名前**を入力します。例えば、`cfn-workshop-condition-test` と入力します。 * `EnvType` パラメータの値として `test` を選択します。**次へ**をクリックします。 * **スタックオプションの設定**ページはデフォルト値のまま**次へ**をクリックします。 -* レビューページで、**送信**をクリックします。CloudFormationコンソールで作成中のスタックの進行状況を確認できます。 +* レビューページで、**送信**をクリックします。CloudFormation コンソールで作成中のスタックの進行状況を確認できます。 * スタックの作成が完了するまでお待ちください。スタックのステータスが `CREATE_COMPLETE` になるまで、コンソールのビューを更新します。 スタックが `CREATE_COMPLETE` ステータスになったら、スタックの**リソース**タブに移動します。`EnvType` に渡した `test` 値と、テンプレート内の他の2つのリソースに追加して関連付けた条件に基づき作成したロジックをベースに、プロビジョニングされているリソースがEC2インスタンスだけであることを確認します。 ![condition-test](/static/intermediate/templates/conditions/condition-test.ja.png) -次のステップでは、同じテンプレートを使用して新しいスタックを作成します。今回は、`envType`パラメータの値として`prod`を渡し、CloudFormationを使用して`Volume`と`MountPoint`リソースもプロビジョニングすることを確認します。AWS CloudFormation[コンソール](https://console.aws.amazon.com/cloudformation)に移動し、既存のテンプレートを使用してスタックを作成します。 +次のステップでは、同じテンプレートを使用して新しいスタックを作成します。今回は、`envType` パラメータの値として `prod` を渡し、`Volume` と `MountPoint` リソースもプロビジョニングされることを確認します。AWS CloudFormation [コンソール](https://console.aws.amazon.com/cloudformation)に移動し、既存のテンプレートを使用してスタックを作成します。 -* CloudFormationコンソールで、**スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 +* CloudFormation コンソールで、**スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 * **テンプレートの準備**セクションで、**テンプレートの準備完了**を選択します。 * **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 * `condition-resource.yaml` テンプレートを選択します。 * **スタックの名前**を入力します。例えば、`cfn-workshop-condition-prod` と入力します。 * `EnvType` パラメータの値として `prod` を選択します。**次へ**をクリックします。 * **スタックオプションの設定**ページはデフォルト値のまま**次へ**をクリックします。 -* レビューページで、**送信**をクリックします。CloudFormationコンソールで作成中のスタックの進行状況を確認できます。 +* レビューページで、**送信**をクリックします。CloudFormation コンソールで作成中のスタックの進行状況を確認できます。 * スタックの作成が完了するまでお待ちください。スタックのステータスが `CREATE_COMPLETE` になるまで、コンソールのビューを更新します。 -今回は `IsProduction` 条件が真です。スタックの **リソース** タブに移動し、EC2インスタンスリソースと共に、`Volume` および`MountPoint` リソースもプロビジョニングされていることを確認します。 +今回は `IsProduction` 条件が満たされます。スタックの**リソース**タブに移動し、EC2インスタンスリソースと共に、`Volume` および `MountPoint` リソースもプロビジョニングされていることを確認します。 ![condition-prod](/static/intermediate/templates/conditions/condition-prod.ja.png) @@ -140,13 +140,13 @@ Resources: #### **プロパティレベルでの条件の定義** -リソースプロパティ値を条件付きで定義するユースケースの例を見てみましょう。たとえば、`test` 環境用に `t2.micro` タイプのEC2インスタンスを作成し、`prod` 環境用に `t2.small` タイプのEC2インスタンスを作成するとします。`InstanceType` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype)として、リソースプロパティレベルで関連付ける条件を定義します。 +リソースプロパティ値を条件付きで定義するユースケースの例を見てみましょう。例えば、`test` 環境用に `t2.micro` タイプの EC2 インスタンスを作成し、`prod` 環境用に `t2.small` タイプの EC2 インスタンスを作成するとします。`InstanceType` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype)として、リソースプロパティレベルで関連付ける条件を定義します。 -まず、条件を設計します。例えば、`EnvType` パラメータの入力パラメータとして `prod` を指定した場合、その条件は真になります。次に、条件をEC2インスタンスに関連付け、希望する動作を次のように記述します。条件が当てはまる場合、インスタンスはインスタンスタイプとして `t2.small` を使用し、それ以外の場合は `t2.micro` を使用します。次の例で、これがどのように機能するか見てみましょう。 +まず、条件を設計します。例えば、`EnvType` パラメータの入力パラメータとして `prod` を指定した場合、条件は満たされます。次に、条件を EC2 インスタンスに関連付け、希望する動作を次のように記述します。条件が当てはまる場合、インスタンスはインスタンスタイプとして `t2.small` を使用し、それ以外の場合は `t2.micro` を使用します。次の例で、これがどのように機能するか見てみましょう。 -1. 次のディレクトリにいることを確認します: `code/workspace/conditions`。 +1. `code/workspace/conditions` ディレクトリにいることを確認します。 2. `condition-resource-property.yaml` ファイルを開きます。 -3. このラボの手順に従ってテンプレートの内容を更新します。 +3. ラボの手順に従ってテンプレートの内容を更新します。 それでは、始めましょう!この例では、前の例と同様に、`EnvType` パラメータと `IsProduction` 条件を定義して、渡したパラメータ値に基づいてリソースを作成します。以下に示すコンテンツをコピーし、`condition-resource-property.yaml` ファイルに貼り付けます。 @@ -171,7 +171,7 @@ Conditions: - prod ``` -次に、`IsProduction` 条件により、条件付きでプロパティ値を指定しましょう。この例では、`Fn::if`[条件関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)を使用して、`IsProduction` 条件が真かどうかを評価します。その場合、`t2.small` プロパティの値が `InstanceType` に使用されます。条件を満たさない場合は `t2.micro` が使用されます。次のコードをコピーしてテンプレートに追加します。 +次に、`IsProduction` 条件により、条件付きでプロパティ値を指定します。この例では、`Fn::If` [条件関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)を使用して、`IsProduction` 条件が満たされるかどうかを評価します。条件が満たされる場合、`t2.small` プロパティの値が `InstanceType` に使用されます。条件を満たさない場合は `t2.micro` が使用されます。次のコードをコピーしてテンプレートに追加します。 ```yaml Resources: @@ -182,23 +182,23 @@ Resources: InstanceType: !If [IsProduction, t2.small, t2.micro] ``` -リソースをデプロイする時が来ました! +リソースをデプロイしましょう! -このセクションでは、`EnvType` パラメータの値として `test` を指定、EC2 インスタンスのタイプが `t2.micro` であることを確認します。AWS CloudFormation[コンソール](https://console.aws.amazon.com/cloudformation)に移動し、次のテンプレートを使用してスタックを作成します。 +このセクションでは、`EnvType` パラメータの値として `test` を指定、EC2 インスタンスのタイプが `t2.micro` であることを確認します。AWS CloudFormation [コンソール](https://console.aws.amazon.com/cloudformation)に移動し、次のテンプレートを使用してスタックを作成します。 -* CloudFormationコンソールで、**スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 +* CloudFormation コンソールで、**スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 * **テンプレートの準備**セクションで、**テンプレートの準備完了**を選択します。 * **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 * `condition-resource-property.yaml` テンプレートを選択します。 -* **スタックの名前**を入力します。例えば、`cfn-workshop-condition-property-test`と入力します。 +* **スタックの名前**を入力します。例えば、`cfn-workshop-condition-property-test` と入力します。 * `EnvType` パラメータの値として `test` を渡します。**次へ**をクリックします。 * **スタックオプションの設定**ページはデフォルト値のまま**次へ**をクリックします。 -* レビューページで、**送信**をクリックします。CloudFormationコンソールで作成中のスタックの進行状況を確認できます。 +* レビューページで、**送信**をクリックします。CloudFormation コンソールで作成中のスタックの進行状況を確認できます。 * スタックの作成が完了するまでお待ちください。スタックのステータスが `CREATE_COMPLETE` になるまで、コンソールのビューを更新します。 -スタックのステータスが `CREATE_COMPLETE` になったら、スタックの**リソース**タブに移動し、スタックで作成したEC2インスタンスを探します。 +スタックのステータスが `CREATE_COMPLETE` になったら、スタックの**リソース**タブに移動し、スタックで作成した EC2 インスタンスを探します。 -次に、インスタンスタイプが想定通りであることを確認します。インスタンスの物理IDのリンクをクリックして、Amazon EC2 コンソールでインスタンスを表示します。 +次に、インスタンスタイプが想定通りであることを確認します。インスタンスの物理 ID のリンクをクリックして、Amazon EC2 コンソールでインスタンスを表示します。 ![condition-test-property](/static/intermediate/templates/conditions/condition-test-property.ja.png) 次の例のように、インスタンスタイプが `t2.micro` であることを示すビューが表示されます。 @@ -210,54 +210,54 @@ Resources: ### **チャレンジ** -ここまで、CloudFormationテンプレート内のリソースとプロパティ値で条件を使用する方法を学んできました。このチャレンジでは、`condition-resource.yaml` CloudFormationテンプレートの[Outputs](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)セクションに条件付きで出力を作成します。 +ここまで、CloudFormation テンプレート内のリソースとプロパティ値で条件を使用する方法を学んできました。このチャレンジでは、`condition-resource.yaml` CloudFormation テンプレートの [Outputs](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) セクションに条件付きで出力を作成します。 -**タスク:** `condition-resource.yaml` テンプレートに [Outputs](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)セクションを記述してください。出力の論理IDとして `VolumeId` を指定し、`Ref` 組み込み関数を使用して [VolumeIDを返します](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#aws-properties-ec2-instance-return-values)。このチャレンジのゴールは、`isProduction`条件が満たされた場合にのみ出力を作成することです。この意図をどのようにテンプレートに反映させることができますか?準備ができたら、更新したテンプレートで既存の`cfn-workshop-condition-prod`スタックを更新し、変更によって期待どおりの出力が作成されたことを確認します。 +**タスク:** `condition-resource.yaml` テンプレートに [Outputs](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html) セクションを記述してください。出力の論理IDとして `VolumeId` を指定し、`Ref` 組み込み関数を使用して [VolumeID を返します](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html#aws-resource-ec2-volume-return-values)。このチャレンジのゴールは、`IsProduction` 条件が満たされた場合にのみ出力を作成することです。チャレンジのゴールに向けて、どのようにテンプレートに反映させますか?準備ができたら、更新したテンプレートで既存の `cfn-workshop-condition-prod` スタックを更新し、変更によって期待どおりの出力が作成されたことを確認します。 :::expand{header="ヒントが必要ですか?"} -* [スタック出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html#outputs-section-structure-examples)のドキュメントを参照し、テンプレートで `VolumeID` 出力を定義してください。 -* [条件](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)と[条件の関連付け](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#associating-a-condition) のドキュメントを確認してください。どのように条件付きで出力を作成しますか? +* [スタック出力](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html#outputs-section-structure-examples)のドキュメントを参照し、テンプレートで `VolumeId` 出力を定義してください。 +* [条件](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)と[条件の関連付け](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html#associating-a-condition)のドキュメントを確認してください。どのように条件付きで出力を作成しますか? ::: -:::expand{header="解決策を見たいですか?"} -`condition-resource.yaml`ファイルに次の内容を追加します。 +:::expand{header="解決策を確認しますか?"} +`condition-resource.yaml` ファイルに次の内容を追加します。 ```yaml Outputs: - VolumeId: - Value: !Ref Volume - Condition: IsProduction + VolumeId: + Value: !Ref Volume + Condition: IsProduction ``` -次に、AWS CloudFormation[コンソール](https://console.aws.amazon.com/cloudformation)に移動して、`cfn-workshop-condition-prod`スタックの更新を選択します。 +次に、AWS CloudFormation [コンソール](https://console.aws.amazon.com/cloudformation)に移動して、`cfn-workshop-condition-prod` スタックの更新を選択します。 -* CloudFormationコンソールで、**更新**をクリックします。 +* CloudFormation コンソールで、**更新**をクリックします。 * **テンプレートの準備**セクションで、**既存のテンプレート置き換える**を選択します。 * **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 * `condition-resource.yaml` テンプレートを選択します。 * `EnvType` は既に `prod` に設定されているはずです。**次へ**をクリックします。 * **スタックオプションの設定**ページはデフォルト値のまま**次へ**をクリックします。 -* レビューページで、**送信**をクリックします。CloudFormationコンソールで作成中のスタックの進行状況を確認できます。 +* レビューページで、**送信**をクリックします。CloudFormation コンソールで作成中のスタックの進行状況を確認できます。 * スタックの作成が完了するまでお待ちください。スタックのステータスが `UPDATE_COMPLETE` になるまで、コンソールのビューを更新します。 -スタックの`出力`セクションに移動し、`VolumeID` の出力が存在することを確認します。 -![ondition-prod-update](/static/intermediate/templates/conditions/condition-prod-update.ja.png) +スタックの`出力`セクションに移動し、`VolumeId` の出力が存在することを確認します。 +![condition-prod-update](/static/intermediate/templates/conditions/condition-prod-update.ja.png) ::: -このソリューションは、`code/solutions/conditions/condition-output.yaml` テンプレートファイルでも入手できます。 +解決策は、`code/solutions/conditions/condition-output.yaml` テンプレートファイルでも入手できます。 ### クリーンアップ 次に示す手順に従って、このラボで作成したリソースをクリーンアップしてください。 -* CloudFormationコンソールで、このラボで作成した `cfn-workshop-condition-test` スタックを選択します。 -* このラボで作成したスタックの**削除**を選択した後、**スタックの削除**を押して確定します。 +* CloudFormation コンソールで、このラボで作成した `cfn-workshop-condition-test` スタックを選択します。 +* このラボで作成したスタックの**削除**を選択した後、**スタックの削除**をクリックして確定します。 -このラボで作成した他のスタック、`cfn-workshop-condition-prod` と `cfn-workshop-condition-property-test` に対して上記と同じクリーンアップ手順を実行します。 +このラボで作成した他のスタック `cfn-workshop-condition-prod`、`cfn-workshop-condition-property-test` に対して、上記と同じクリーンアップ手順を実行します。 --- ### まとめ -おめでとうございます!リソースを条件付きで作成する方法と、リソースプロパティ値を条件付きで指定する方法を学習しました。詳細については、[条件](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)と[条件関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html)を参照してください。 +おめでとうございます!リソースを条件付きで作成する方法と、リソースプロパティ値を条件付きで指定する方法を学習しました。詳細については、[条件](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/conditions-section-structure.html)と[条件関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-conditions.html)をご参照ください。 diff --git a/content/intermediate/templates/dynamic-references/index.ja.md b/content/intermediate/templates/dynamic-references/index.ja.md index 78cfd06bf..3706018d3 100644 --- a/content/intermediate/templates/dynamic-references/index.ja.md +++ b/content/intermediate/templates/dynamic-references/index.ja.md @@ -4,38 +4,38 @@ weight: 300 --- ### 概要 -このモジュールでは、CloudFormationテンプレートの[動的な参照](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)を使用して、[AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)(SSM)、[Paramater Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)、[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)を含むAWSサービスに保存されている外部値を参照する方法を学びます。 +このモジュールでは、CloudFormation テンプレートの[動的な参照](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html)を使用して、[AWS Systems Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html) (SSM)、[Parameter Store](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html)、[AWS Secrets Manager](https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/intro.html) を含む AWS サービスに保存されている外部値を参照する方法を学びます。 -前に説明したように、CloudFormation テンプレートでは、AWSリソースの[ライフサイクルと所有権](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) の基準とベストプラクティスを考慮すると、一元化された場所に保存されている設定値を参照することもできます。Parameter Storeは、構成データ管理のための安全な階層型ストレージを提供します。 + 前のセクションで説明したように、CloudFormation テンプレートでは、AWS リソースの[ライフサイクルと所有権](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html) の基準とベストプラクティスを考慮し、一元化された場所に保存されている設定値を参照することもできます。Parameter Store は、構成データ管理のための安全な階層型ストレージを提供します。 -また、AWS CloudFormationテンプレート内の機密情報を参照する必要がある場合もあります。[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) を使用すると、データベースやその他のサービスの認証情報をプログラムで安全に暗号化、保存、取得できます。SSM [Secure Stringパラメータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm-secure-strings)を使用して機密データを保存および参照することもできます。 +また、AWS CloudFormation テンプレートから機密情報を参照する必要がある場合もあります。[AWS Secrets Manager](https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/intro.html) を使用すると、データベースやその他のサービスの認証情報をプログラムで安全に暗号化、保存、取得できます。SSM [Secure String パラメータ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm-secure-strings)を使用して機密データを保存および参照することもできます。 -動的な参照を使用すると、CloudFormation はスタックおよび [変更セット](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html)操作中に必要に応じて指定された参照値を取得します。ただし、CloudFormationが実際の参照値を保存することはありません。 +動的参照を使用すると、CloudFormation はスタックおよび [変更セット](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html)操作中に、必要に応じて指定された参照値を取得します。ただし、CloudFormation が実際の参照値を保存することはありません。 ### 取り上げるトピック このラボを修了すると、次のことができるようになります。 -* CloudFormationテンプレートの外部値にアクセスするための*動的参照文字列*を作成します。 -* 特定のバージョン、または*最新*バージョンのParameter Storeパラメータを取得する。 -* Secrets Managerシークレットの特定のバージョンを取得する。 - * JSON データ形式を使用するシークレットから特定のキーの値を抽出します。 +* CloudFormation テンプレートの外部値にアクセスするための*動的参照文字列*を作成 +* 特定のバージョン、または*最新*バージョンの Parameter Store パラメータを取得 +* Secrets Manager シークレットの特定のバージョンを取得 + * JSON データ形式を使用するシークレットから特定のキーの値を抽出 ### ラボを開始 -#### Paramater Storeの動的リファレンス -開発チームにライフサイクル環境を提供する必要があるシナリオを考えてみましょう。このプラクティスには、多くの場合、最新のオペレーティングシステムアップデート、強化要件、および必要なサードパーティのソフトウェアエージェントを含むカスタム [Amazon Machine Images](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html) (AMI) の構築と配布が含まれます。 +#### Paramater Store の動的リファレンス +開発チームにライフサイクル環境を提供する必要があるシナリオを考えてみましょう。このプラクティスには、多くの場合、最新のオペレーティングシステムアップデート、セキュリティの強化要件、必要なサードパーティのソフトウェアエージェントを含むカスタム [Amazon Machine Images](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html) (AMI) の構築と配布が含まれます。 -あなた (または組織のチーム) がカスタムAMIを作成したら、Parameter Storeを使用してAMIの識別子を保存することを選択できます。これにより、EC2インスタンスを起動するときに使用するAMIをプログラムで指定しやすくなり、設定ミスの可能性が低くなります。 +あなた (または組織のチーム) がカスタム AMI を作成したら、Parameter Store を使用して AMI の識別子を保存することができます。これにより、EC2 インスタンスを起動するときに使用する AMI をプログラムで指定しやすくなり、設定ミスの可能性が低くなります。 -このラボでは、AMI IDを永続化するParameter Storeパラメータを作成します。カスタムAMIの代わりに、選択したリージョンで利用できる最新の _Amazon Linux 2 AMI, 64-bit x86_ を使用します。次に、テンプレートに記述したEC2インスタンスの`ImageId` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid)でパラメータを参照します。 +このラボでは、AMI ID を永続化する Parameter Store パラメータを作成します。カスタム AMI の代わりに、選択したリージョンで利用できる最新の _Amazon Linux 2 AMI, 64-bit x86_ を使用します。次に、テンプレートに記述した EC2 インスタンスの `ImageId` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid)でパラメータを参照します。 それでは、始めましょう!次に示す手順に従って選択してください: -1. Amazon EC2[コンソール](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#LaunchInstanceWizard:)に移動し、使用する[リージョンを選択](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/select-region.html)します。次に、最新の *Amazon Linux 2 AMI, (64-bit x86)* を探し、AMI ID(例:`ami-abcd1234`)をメモします。この値は次のステップで使用します。 +1. Amazon EC2 [コンソール](https://us-east-1.console.aws.amazon.com/ec2/v2/home?region=us-east-1#LaunchInstances:)に移動し、使用する[リージョンを選択](https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/select-region.html)します。次に、最新の *Amazon Linux 2 AMI, (64-bit x86)* を探し、AMI ID (例: `ami-abcd1234`) をメモします。この値は次のステップで使用します。 ![ec2](/static/intermediate/templates/dynamic-references/ec2-console-ami-picker.ja.png) -2. [AWS Command Line Interface](https://aws.amazon.com/cli/) (CLI) を使用してパラメータを作成します。次に示すコマンドを実行するときは、必ず `YOUR_AMI_ID` と `YOUR_REGION` のプレースホルダーを必要な値に置き換えてください。あなたは、特定のAWSリージョンを指定できます。[リージョンエンドポイント](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints) の表の**コード**を参照してください。前のステップで使用するAMIを選択したときに選択したリージョンと同じリージョンを必ず使用してください。 +2. [AWS Command Line Interface](https://aws.amazon.com/jp/cli/) (CLI) を使用してパラメータを作成します。以下に示すコマンドを実行するときは、必ず `YOUR_AMI_ID` と `YOUR_REGION` のプレースホルダーを必要な値に置き換えてください。必要値の入力時には、特定の AWS リージョンを指定します。リージョンの詳細については、[リージョンエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#regional-endpoints) の表の**コード**をご参照ください。また、必ず、前のステップで AMI を選択したときのリージョンと同一のリージョンを使用してください。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws ssm put-parameter \ @@ -45,37 +45,37 @@ weight: 300 --region YOUR_REGION ::: -::alert[CloudFormationを使用して、`String` または `StringList` タイプのParamater Storeパラメータを作成できます。詳細については、[AWS::SSM::Parameter](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html)のドキュメントをご覧ください。]{type="info"} +::alert[CloudFormation を使用して、`String` または `StringList` タイプの Paramater Store パラメータを作成可能です。詳細については、[AWS::SSM::Parameter](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ssm-parameter.html) のドキュメントをご覧ください。]{type="info"} -3. 次に示す手順に従って、テンプレートに記述したEC2インスタンスのパラメータへの動的参照を作成します。 +3. 次の手順に従って、テンプレートに記述した EC2 インスタンスのパラメータへの動的参照を作成します。 1. `code/workspace/dynamic-references` ディレクトリに移動します。 - 2. お好みのテキストエディタで `ec2-instance.yaml` CloudFormationテンプレートを開きます。 + 2. お好みのテキストエディタで `ec2-instance.yaml` CloudFormation テンプレートを開きます。 3. テンプレート内の `AWS::EC2::Instance` リソースタイプブロックを探し、`Properties` セクションのプロパティに `ImageId` プロパティとパラメータへの動的参照を追加してテンプレートを更新します。 :::code{language=yaml showLineNumbers=false showCopyAction=true} ImageId: '{{resolve:ssm:/golden-images/amazon-linux-2}}' ::: -上記の動的リファレンスを使って、スタックの実行時に `/golden-images/amazon-linux-2` パラメータの `LATEST` バージョンを解決する意図を説明しました。 +上記の動的参照を使って、スタックの実行時に `/golden-images/amazon-linux-2` パラメータの `LATEST` バージョンの値を解決します。 -::alert[CloudFormationは、[動的参照](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm)による[パブリックパラメータ](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)をサポートしていません。[SSMパラメータタイプ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-types)を使用してパブリックパラメータの値を取得することができます。]{type="info"} +::alert[CloudFormationは、[動的参照](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm)による[パブリックパラメータ](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)をサポートしていません。[SSM パラメータタイプ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-types)を使用してパブリックパラメータの値を取得することができます。]{type="info"} 4. いよいよスタックを作成しましょう! 以下の手順に従ってください。 - 1. [AWS CloudFormationコンソール](https://console.aws.amazon.com/cloudformation/) に移動し、**新しいリソースを使用 (標準)** を選択します。 + 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/) に移動し、**新しいリソースを使用 (標準)** を選択します。 2. **テンプレートの準備**セクションで、**テンプレート準備完了**を選択します。 3. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 4. ファイル `ec2_instance.yaml` を選択します。 5. スタック名を入力します。例えば、`cfn-workshop-ec2-stack` を入力します。 6. **スタックオプションの設定**ページはデフォルト値のまま、**次へ**をクリックします。 7. スタックの**レビュー**ページで、一番下までスクロールし、**送信**をクリックします。 - 8. スタックの作成ページを更新することで、CloudFormationコンソールでスタックの作成の進行状況を確認できます。 + 8. スタックの作成ページを更新することで、CloudFormation コンソールでスタックの作成の進行状況を確認できます。 9. スタックの `CREATE_COMPLETE` ステータスが表示されるまでページを更新してください。 -::alert[SSMパラメータへの動的参照を使用して、特定のパラメータバージョンを指すこともできます。たとえば、CloudFormationにパラメータのバージョン `1` を解決させるには、`ImageId: '{{resolve:ssm:/golden-images/amazon-linux-2:1}}'` を使用します。特定のバージョンへの動的参照をロックすると、スタックの更新時にリソースが意図せず更新されるのを防ぐのに役立ちます。]{type="info"} +::alert[SSM パラメータへの動的参照を使用して、特定のパラメータバージョンを指すこともできます。例えば、CloudFormation にパラメータのバージョン `1` を解決させるには、`ImageId: '{{resolve:ssm:/golden-images/amazon-linux-2:1}}'` を使用します。特定のバージョンへの動的参照をロックすると、スタックの更新時にリソースが意図せず更新されることを防止するのに役立ちます。]{type="info"} -5. EC2 インスタンスに使用したイメージのIDが、Parameter Storeパラメータに保存したイメージIDと一致することを確認します。まず、CloudFormationコンソールの**リソース** タブに移動してEC2 インスタンス ID を確認します。EC2インスタンスの物理 ID を探し、その値を書き留めます。次に、以下のコマンドを実行します (コマンドを実行する前に、`YOUR_INSTANCE_ID` と `YOUR_REGION` プレースホルダーを置き換えてください)。 +5. EC2 インスタンスに使用したイメージの ID が、Parameter Store パラメータに保存したイメージ ID と一致することを確認します。まず、CloudFormation コンソールの**リソース** タブに移動して EC2 インスタンス ID を確認します。EC2 インスタンスの物理 ID を探し、その値を書き留めます。次に、以下のコマンドを実行します (コマンドを実行する前に、`YOUR_INSTANCE_ID` と `YOUR_REGION` プレースホルダーを置き換えてください)。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws ec2 describe-instances \ @@ -84,20 +84,20 @@ weight: 300 --query 'Reservations[0].Instances[0].ImageId' ::: -おめでとうございます!ダイナミックリファレンスの使用方法は、Parameter Storeを使用した例で学習しました。 +おめでとうございます!Parameter Store を使用して、動的参照の利用方法の例を学習しました。 -#### AWS シークレットマネージャーの動的リファレンス -[AWS Secrets Manager](https://aws.amazon.com/secrets-manager) は、データベース認証情報などの認証情報を保護するのに役立ちます。これにより、コードにシークレットをハードコーディングしなくても、後でプログラムで利用できるようになります。例えば、[AWS Lambda](https://aws.amazon.com/lambda/) 関数を作成して、[Amazon Relational Database Service (RDS)](https://aws.amazon.com/rds/) データベースインスタンスのデータベース接続情報 (ホスト名やポートなど) を使用します。 +#### AWS Secrets Manager の動的参照 +[AWS Secrets Manager](https://aws.amazon.com/jp/secrets-manager/) は、データベース認証情報などの認証情報を保護するのに役立ちます。AWS Secrets Manager を用いると、コードにシークレットをハードコーディングしなくても、後でプログラムで利用できるようになります。例えば、[AWS Lambda](https://aws.amazon.com/jp/lambda/) 関数を作成して、[Amazon Relational Database Service (RDS)](https://aws.amazon.com/jp/rds/) データベースインスタンスのデータベース接続情報 (ホスト名やポートなど) を使用します。 -このラボでは、Secrets Managerを使用してデータベースの*ホスト名*、*ポート*、*ユーザー名*、および*パスワード*を保存します。次に、動的参照を使用して、テンプレートに記述する `AWS::Lambda::Function`リソースから*ホスト名*と*ポート*情報を読み取ります。 +このラボでは、Secrets Manager を使用してデータベースの*ホスト名*、*ポート*、*ユーザー名*、および*パスワード*を保存します。次に、動的参照を使用して、テンプレートに記述する `AWS::Lambda::Function` リソースから*ホスト名*と*ポート*情報を読み取ります。 -それでは、始めましょう!次に示す手順に従って選択してください。 +それでは、始めましょう!次に示す手順に従って実行します。 -1. まず、Amazon RDSデータベースを作成し、接続情報をAWS Secrets Managerにシークレットとして保存します。 +1. Amazon RDS データベースを作成し、接続情報を AWS Secrets Manager にシークレットとして保存します。 1. `code/workspace/dynamic-references` ディレクトリにいることを確認します。 2. お好みのテキストエディタで `database.yaml` CloudFormationテンプレートを開きます。 3. テンプレート内の次のリソースに注意してください。 - 1. `AWS::RDS::DBInstance` タイプのリソース。これを使用して Amazon RDSインスタンスを記述します。 + 1. `AWS::RDS::DBInstance` タイプのリソース。本リソースを使用して Amazon RDSインスタンスを記述します。 2. `AWS::SecretsManager::Secret` タイプのリソース。データベース接続パラメータをJSONキーと値のペアとして、`DatabaseConnParams` という名前のシークレットに保存します。 ```json { @@ -113,39 +113,39 @@ weight: 300 3. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 4. ファイル `database.yaml` を選択します。 5. スタック名を入力します。例えば、`cfn-workshop-database-stack` と入力します。 - 6. `DBUserName` には、DBインスタンスのプライマリユーザー名を指定します。 + 6. `DBUserName` には、DB インスタンスのプライマリユーザー名を指定します。 7. `DBPassword` には、プライマリユーザーのパスワードを指定します。 8. **スタックオプションの設定**ページはデフォルト値のまま、**次へ**をクリックします。 9. スタックの**レビュー**ページで、一番下までスクロールして、**送信**をクリックします。 - 10. スタックの作成ページを更新することで、CloudFormationコンソールでスタックの作成の進行状況を確認できます。 + 10. スタックの作成ページを更新することで、CloudFormation コンソールでスタックの作成の進行状況を確認できます。 11. スタックの `CREATE_COMPLETE` ステータスが表示されるまでページを更新してください。 -3. 次に、AWS Lambda関数を作成し、以前に作成した Secrets Managerシークレットへの動的参照を使用して、いくつかのデータベース接続パラメータを[環境変数](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html)としてLambda関数に読み取ります。 - 1. `code/workspace/dynamic-references`ディレクトリにいることを確認します。 - 2. お好みのテキストエディタで `lambda-function.yaml` CloudFormationテンプレートを開きます。 - 3. テンプレートには `AWS::Lambda::Function`リソースタイプが記述されています。`Properties`セクションに`Environment`プロパティを追加し、先ほど作成したAWS Secret Managerシークレットへの動的参照を使用する変数を追加してテンプレートを更新します。 +3. 次に、AWS Lambda 関数を作成し、以前に作成した Secrets Manager シークレットへの動的参照を使用して、いくつかのデータベース接続パラメータを[環境変数](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html)として Lambda 関数に読み取ります。 + 1. `code/workspace/dynamic-references` ディレクトリにいることを確認します。 + 2. お好みのテキストエディタで `lambda-function.yaml` CloudFormation テンプレートを開きます。 + 3. テンプレートには `AWS::Lambda::Function` リソースタイプが記述されています。`Properties` セクションに `Environment` プロパティを追加し、先ほど作成した AWS Secret Manager シークレットへの動的参照を使用する変数を追加してテンプレートを更新します。 ```yaml Environment: Variables: RDS_HOSTNAME: '{{resolve:secretsmanager:DatabaseConnParams:SecretString:RDS_HOSTNAME}}' RDS_PORT: '{{resolve:secretsmanager:DatabaseConnParams:SecretString:RDS_PORT}}' ``` -4. Lambdaスタックをデプロイするには、以下の手順に従います。 +4. Lambda スタックをデプロイするには、以下の手順に従います。 1. [AWS CloudFormationコンソール](https://console.aws.amazon.com/cloudformation/) に移動し、**新しいリソースを使用 (標準)** を選択します。 2. **テンプレートの準備**セクションで、**テンプレートの準備完了**を選択します。 3. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**をクリックします。 - 4. ファイル `lambda_function.yaml`を選択します。 - 5. スタック名を入力します。例えば、`cfn-workshop-lambda-stack`と入力し、**次へ**をクリックします。 + 4. ファイル `lambda_function.yaml` を選択します。 + 5. スタック名を入力します。例えば、`cfn-workshop-lambda-stack` と入力し、**次へ**をクリックします。 6. **スタックオプションの設定**ページはデフォルト値のまま、**次へ**をクリックします。 - 7. スタックの**レビュー**ページで、一番下までスクロールし、次の例に示すように IAM Capabilitiesチェックボックスを選択します。 + 7. スタックの**レビュー**ページで、一番下までスクロールし、次の例に示すように IAM Capabilities チェックボックスを選択します。 ![Acknowledge IAM Capability](/static/intermediate/templates/dynamic-references/iam-capability.ja.png) 8. **送信**を選択します。スタックのステータスが `CREATE_COMPLETE` になるまでページを更新します。 - 先ほど使用したテンプレートでは、データベース接続パラメーターはスタックの実行時に動的文字列を使用して取得されます。`RDS_HOSTNAME` などの特定のキーの値を、`'{{resolve:secretsmanager:DatabaseConnParams:SecretString:RDS_HOSTNAME}}'`で取得しました。ここで、`DatabaseConnParams` はシークレットIDです。 + 先ほど使用したテンプレートでは、データベース接続パラメーターはスタックの実行時に動的文字列を使用して取得されます。`RDS_HOSTNAME` などの特定のキーの値を、`'{{resolve:secretsmanager:DatabaseConnParams:SecretString:RDS_HOSTNAME}}'` で取得しました。なお、`DatabaseConnParams` はシークレット ID を示しています。 - ::alert[AWS Secrets Manager のシークレットには、暗号化されたシークレット値のコピーを保持する [*versions*](https://docs.aws.amazon.com/secretsmanager/latest/userguide/getting-started.html#term_version) があります。シークレットの値を変更すると、Secrets Managerは新しいバージョンを作成します。シークレットには常に、現在のシークレット値であるステージングラベル `AWSCURRENT` のバージョンがあります。必要に応じて、*バージョンステージ*または*バージョンID*を指定して、この文字列を次のように変更できます。`'{{resolve:secretsmanager:prod-DatabaseConnParams:SecretString:RDS_HOSTNAME::}}'`。バージョンを指定しない場合、CloudFormationはステージ `AWSCURRENT` に関連するシークレットをデフォルトで解決します。]{type="info"} + ::alert[AWS Secrets Manager のシークレットには、暗号化されたシークレット値のコピーを保持する [*versions*](https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/getting-started.html#term_version) があります。シークレットの値を変更すると、Secrets Manager は新しいバージョンを作成します。シークレットには常に、現在のシークレット値であるステージングラベル `AWSCURRENT` のバージョンがあります。必要に応じて、*バージョンステージ*または*バージョン ID* を指定して、この文字列を次のように変更できます: `'{{resolve:secretsmanager:prod-DatabaseConnParams:SecretString:RDS_HOSTNAME::}}'`。バージョンを指定しない場合、CloudFormation はステージ `AWSCURRENT` に関連するシークレットをデフォルトで解決します。]{type="info"} -5. 作成したサンプルのLambda関数を呼び出すと、関数は `RDS_HOSTNAME` と `RDS_PORT` 環境変数をフェッチし、それらの値を出力します。まず、CloudFormationコンソールの**リソース** タブに移動してLambda 関数名を見つけます。Lambda関数の物理IDを探し、その値を書き留めます。次に、次のコマンドを使用してデータベース接続パラメーターを Lambda関数に渡していることを確認します (`YOUR_FUNCTION_NAME` を Lambda関数名に、`YOUR_REGION` を必要な値に置き換えてください)。 +5. 作成したサンプルの Lambda 関数を呼び出すと、関数は `RDS_HOSTNAME` と `RDS_PORT` 環境変数をフェッチし、それらの値を出力します。まず、CloudFormation コンソールの**リソース** タブに移動し、Lambda 関数名を見つけます。Lambda 関数の物理 ID を探し、その値を書き留めます。次に、次のコマンドを使用し、データベース接続パラメーターを Lambda 関数に渡していることを確認します (`YOUR_FUNCTION_NAME` を Lambda 関数名に、`YOUR_REGION` を必要な値に置き換えてください)。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws lambda invoke \ --function-name YOUR_FUNCTION_NAME \ @@ -153,27 +153,27 @@ weight: 300 output.json ::: - Print the output for the above command using the following command: + 次のコマンドを使用して、上記コマンドの出力を表示します。 :::code{language=shell showLineNumbers=false showCopyAction=true} cat output.json "Database: db.us-east-1.rds.amazonaws.com:3306" ::: -おめでとうございます! AWS Secrets Managerで動的参照を使用する方法を学びました。 +おめでとうございます! AWS Secrets Manager で動的参照を使用する方法を学びました。 ### チャレンジ この演習では、*動的参照*についての理解を深めます。 -AWS Lambda では、`MemorySize` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-memorysize)で、[関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)のメモリ構成をサポートします。ここでのタスクは、AWS CLI でParamater Storeパラメータを作成することです。ここで、`Lambda_memory_size.yaml` テンプレートに記述するLambda関数に使用するメモリサイズを設定します。次に、作成したパラメーターのバージョン`1`への動的参照を作成し、テンプレートを使用してスタックを作成してビルドした内容が機能することを確認します。`cfn-workshop-lambda-memory-size-stack` スタックを呼び出します。Parameter Storeパラメータは、スタックの作成時に選択したものと同じAWSリージョンに作成します。 +AWS Lambda では、`MemorySize` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-memorysize)で、[関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)のメモリ構成をサポートします。ここでのタスクは、AWS CLI でParamater Store パラメータを作成することです。ここで、`Lambda_memory_size.yaml` テンプレートに記述する Lambda 関数に使用するメモリサイズを設定します。次に、作成したパラメーターのバージョン `1` への動的参照を作成し、テンプレートを使用してスタックを作成してビルドした内容が機能することを確認します。`cfn-workshop-lambda-memory-size-stack` スタックを呼び出します。Parameter Store パラメータは、スタックの作成時に選択したものと同じ AWS リージョンに作成します。 :::expand{header= "ヒントが必要ですか?"} -* CloudFormation[ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-memorysize) を参照し、Lambda関数の`MemorySize`設定を指定する方法を理解してください。 -* 特定のバージョンのParameter Storeパラメータへの動的参照文字列を作成する方法については、CloudFormation[ユーザーガイド](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm-pattern)を参照してください。 +* CloudFormation [ユーザーガイド](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-memorysize) を参照し、Lambda 関数の `MemorySize` 設定を指定する方法を理解してください。 +* 特定のバージョンの Parameter Store パラメータへの動的参照文字列を作成する方法については、CloudFormation [ユーザーガイド](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm-pattern)をご参照ください。 ::: -::::expand{header="解決策を見たいですか?"} -* 以下のコマンドを使用して、必要なメモリ設定を指定するParameter Storeパラメータを作成します (この例では `us-east-1` リージョンを使用しています。この値を適宜更新してください)。 +::::expand{header="解決策を確認しますか?"} +* 以下のコマンドを使用して、必要なメモリ設定を指定する Parameter Store パラメータを作成します (この例では `us-east-1` リージョンを使用しています。この値を適宜更新してください)。 :::code{language=yaml showLineNumbers=false showCopyAction=true} aws ssm put-parameter \ @@ -183,7 +183,7 @@ aws ssm put-parameter \ --region YOUR_REGION ::: -* お好みのテキストエディタで `code/workspace/dynamic-references/lambda-memory-size.yaml` テンプレートを開きます。パラメータへの動的参照を使用して `MemorySize`プロパティを含む以下の例を`Resources`セクションに追加して、テンプレートを更新します。 +* お好みのテキストエディタで `code/workspace/dynamic-references/lambda-memory-size.yaml` テンプレートを開きます。パラメータへの動的参照を使用して `MemorySize` プロパティを含む以下の例を `Resources` セクションに追加して、テンプレートを更新します。 ```yaml HelloWorldFunction: Type: AWS::Lambda::Function @@ -199,28 +199,28 @@ HelloWorldFunction: return "Hello World!" ``` -テンプレートで説明および更新したリソースをプロビジョニングするには、`cfn-workshop-lambda-memory-size-stack` CloudFormationスタックを作成します。 +テンプレートで説明および更新したリソースをプロビジョニングするには、`cfn-workshop-lambda-memory-size-stack` CloudFormation スタックを作成します。 -解決策は、`code/solutions/dynamic-references/lambda-memory-size.yaml`サンプルテンプレートにあります。 +解決策は、`code/solutions/dynamic-references/lambda-memory-size.yaml` サンプルテンプレートにあります。 :::: ### クリーンアップ -1. `cfn-workshop-lambda-stack`と`cfn-workshop-lambda-memory-size-stack`で作成した Lambda関数に関連付けられたCloudWatchロググループを削除します (チャレンジセクションのLambda関数を呼び出した場合は、関連するロググループが存在しているはずです)。スタックごとに、CloudFormationコンソールの**リソース**タブに移動してLambda関数名を検索し、Lambda関数の物理 ID を探して、その値を書き留めます。次に、作成した各Lambda関数に対して以下のコマンドを使用します (`YOUR_FUNCTION_NAME`をLambda関数名に置き換え、`YOUR_REGION`を必要な値に置き換えてください)。 +1. `cfn-workshop-lambda-stack` と `cfn-workshop-lambda-memory-size-stack` で作成した Lambda 関数に関連付けられた CloudWatch ロググループを削除します (チャレンジセクションの Lambda 関数を呼び出した場合は、関連するロググループが存在しているはずです)。スタックごとに、CloudFormation コンソールの**リソース**タブに移動して Lambda 関数名を検索し、Lambda 関数の物理 ID を探して、その値を書き留めます。次に、作成した各 Lambda 関数に対して以下のコマンドを使用します (`YOUR_FUNCTION_NAME` を Lambda 関数名に置き換え、`YOUR_REGION` を必要な値に置き換えてください)。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws logs delete-log-group \ --log-group-name /aws/lambda/YOUR_FUNCTION_NAME \ --region YOUR_REGION ::: -2. 次のコマンドを使用して、AMI IDと`MemorySize`設定を保存するために作成した2つのParameter Storeパラメータを削除します (`YOUR_REGION` は必要な値に置き換えてください)。 +2. 次のコマンドを使用して、AMI ID と `MemorySize` 設定を保存するために作成した 2 つの Parameter Store パラメータを削除します (`YOUR_REGION` は必要な値に置き換えてください)。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws ssm delete-parameters \ --names "/golden-images/amazon-linux-2" "/lambda/memory-size" \ --region YOUR_REGION ::: -3. 次に、CloudFormationコンソールで、最後に作成したスタック (例:`cfn-workshop-lambda-memory-size-stack`) を選択します。 -4. **削除**を選択した後、**スタックの削除**を押して確定します。 -5. このラボで作成した他のスタックについても上記の手順を繰り返します。例えば、`cfn-workshop-lambda-stack`、`cfn-workshop-database-stack`、`cfn-workshop-ec2-stack`です。 +3. 次に、CloudFormation コンソールで、最後に作成したスタック (例: `cfn-workshop-lambda-memory-size-stack`) を選択します。 +4. **削除**を選択した後、**スタックの削除**をクリックして確定します。 +5. このラボで作成した他のスタックについても上記の手順を繰り返します。具体的には、`cfn-workshop-lambda-stack`、`cfn-workshop-database-stack`、`cfn-workshop-ec2-stack` スタックです。 --- ### まとめ -これで、動的参照を使用して、AWS Systems ManagerパラメータストアやAWS Secrets Managerなどのサービスで保存および管理する外部値を指定する方法がわかりました。詳しい情報については、[動的な参照を使用してテンプレート値を指定する](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html)を参照ください。 +動的参照を使用して、AWS Systems Manager Parameter Store や AWS Secrets Manager などのサービスで保存および管理する外部値を指定する方法がわかりました。詳しい情報については、[動的な参照を使用してテンプレート値を指定する](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/dynamic-references.html)をご参照ください。 diff --git a/content/intermediate/templates/layered-stacks/index.ja.md b/content/intermediate/templates/layered-stacks/index.ja.md index 67eb58f8d..1c2c42106 100644 --- a/content/intermediate/templates/layered-stacks/index.ja.md +++ b/content/intermediate/templates/layered-stacks/index.ja.md @@ -4,45 +4,44 @@ weight: 500 --- ### 概要 -前のラボでは、`Outputs` セクションと `Fn::GetAtt` 関数を使って子スタックから親スタックへ値を渡す方法について学びました。これにより、VPC と IAM ロール専用のテンプレートを用意できました。 -再利用可能なテンプレートを作成できます。しかし、**スタック** を再利用したい場合はどうでしょうか? +前のラボでは、`Outputs` セクションと `Fn::GetAtt` 関数を使って子スタックから親スタックへ値を渡す方法について学びました。そして、再利用可能なテンプレートを作成することができるようになりました。例えば、ネストされたスタックを利用すると、VPC と IAM ロール専用のテンプレートを用意することができます。 +しかし、**スタック** を再利用したい場合はどうでしょうか? -例えば、多数のテンプレートを使用して多数のワークロードをデプロイする計画があっても、すべての EC2 インスタンスが Systems Manager Session Manager によるすべての EC2 インスタンスへのアクセスを有効にします。 -同様に、1 つのスタックで VPC をデプロイし、それを将来の複数のスタックやワークロードで使用したい場合があります。 +例えば、多数のテンプレートを使用して多数のワークロードをデプロイする計画があったとします。すべての EC2 インスタンスが Systems Manager Session Manager によるすべての EC2 インスタンスへのアクセスを有効にする必要があります。 +同様に、1 つのスタックで VPC をデプロイし、それを将来、複数のスタックやワークロードで使用したい場合があります。 このような一対多の関係は、ネストされたスタックのシナリオでは実現できません。 ここで階層化されたスタックの出番です。 -私たちは [Export](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html) を使用し、任意の CloudFormation スタックに -[Import](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) できるグローバル変数を作成します。 +私たちは [Export](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html) を使用し、任意の CloudFormation スタックに [Import](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) できるグローバル変数を作成します。 ### 取り上げるトピック このラボでは、以下を作成します。 -1. **VPC スタック**: これには、前のラボで使用したものと同じシンプルな VPC テンプレートが含まれていますが、出力に Export が追加されています。 -2. **IAM インスタンスロールスタック**: これには、前のラボで使用したのと同じ IAM インスタンスロールが含まれていますが、出力に Export が追加されています。 -3. **EC2 スタック**: ここには前のラボで定義した EC2 インスタンスが含まれていますが、ここでは Fn::ImportValue 関数を使用します。 +1. **VPC スタック**: 前のラボで使用したものと同じシンプルな VPC テンプレートが含まれていますが、出力に Export が追加されています。 +2. **IAM インスタンスロールスタック**: 前のラボで使用したのと同じ IAM インスタンスロールが含まれていますが、出力に Export が追加されています。 +3. **EC2 スタック**: 前のラボで定義した EC2 インスタンスが含まれていますが、ここでは Fn::ImportValue 関数を使用します。 -> 以下は、階層化されたスタックの階層を示す図です。 +> 階層化されたスタックの階層を示す図 ![layered-stack-hierarchy.png](/static/intermediate/templates/layered-stacks/layered-stack-hierarchy.ja.png) -> 以下の図は、導入されるインフラストラクチャの大まかな概要を示しています。 +> 導入されるインフラストラクチャの概要 ![layered-stack-hierarchy.png](/static/intermediate/templates/layered-stacks/ls-architecture.png) ### ラボを開始 -作業ファイルは `code/workspace/layered-stacks` にあります。このラボの残りの部分では、ここのテンプレートにコードを追加する必要があります。ソリューションは `code/solutions/layered-stacks` フォルダにあります。これらをコードと照合して参照できます。 +作業ファイルは `code/workspace/layered-stacks` にあります。このラボの残りの部分では、テンプレートにコードを追加する必要があります。なお、解決策は `code/solutions/layered-stacks` フォルダにありますので、こちらを参照することも可能です。 #### VPC スタックの作成 -VPC テンプレートは自動的に作成されました。タイトルは `vpc.yaml` です。このテンプレートは、2 つのパブリックサブネット、1 つのインターネットゲートウェイ、およびルートテーブルを含む VPC スタックを作成します。 +VPC テンプレートは既に作成されており、タイトルは `vpc.yaml` です。このテンプレートは、2 つのパブリックサブネット、1 つのインターネットゲートウェイ、および、ルートテーブルを含む VPC スタックを作成することができます。 -##### 1. VPC テンプレートを準備する +##### 1. VPC テンプレートの準備 -::alert[このラボで参照されているファイルはすべて `code/workspace/layered-stacks` 内にあります]{type="info"} +::alert[このラボで参照されているファイルはすべて `code/workspace/layered-stacks` 内にあります。]{type="info"} -`vpc.yaml` ファイルを見ると、テンプレートの **Outputs** セクションにいくつかの出力があることがわかります。次に、これらそれぞれにエクスポートを追加して、他の CloudFormation スタックから使用できるようにします。 +`vpc.yaml` ファイルを見ると、テンプレートの **Outputs** セクションにいくつかの出力があることがわかります。次に、Export を追加して、他の CloudFormation スタックから使用できるようにします。 以下の [4-5、9-10、14-15] 行目をテンプレートファイルに追加します。 @@ -72,16 +71,16 @@ Outputs: 4. `vpc.yaml` ファイルを選択します。 5. **スタック名**を入力します。例えば、`cfn-workshop-vpc` と入力します。 6. **AvaliabilityZone** パラメータには、**2 つの AZ** を選択します。 -7. 残りのパラメータは **デフォルト** のままとします。 +7. 残りのパラメータは**デフォルト**のままとします。 8. すべてデフォルトのままウィザード内を移動します。 9. レビューページで一番下までスクロールし、**送信**をクリックします。 #### IAM スタックの作成 -##### 1. IAM ロールテンプレートを準備する +##### 1. IAM ロールテンプレートの準備 1. `iam.yaml` ファイルを開きます。 -2. 以下の[4~5] 行目をテンプレートの **Outputs** セクションにコピーします。 +2. 以下の [4~5] 行目をテンプレートの **Outputs** セクションにコピーします。 ```yaml {hl_lines=[4,5]} Outputs: WebServerInstanceProfile: @@ -99,19 +98,19 @@ Outputs: 5. **スタック名**を入力します。例えば、`cfn-workshop-iam` と入力します。 6. **次へ**をクリックします。 7. すべてデフォルトのままウィザード内を移動します。 -8. **Acknowledge IAM capabilities**をクリックし、**送信**をクリックします。 +8. **Acknowledge IAM capabilities** をクリックし、**送信**をクリックします。 #### EC2 階層化されたスタックの作成 -##### 1. EC2 テンプレートを準備する -**階層化されたStack**のコンセプトは、**Paramaters** を使用する代わりに、組み込み関数を使用して、以前にエクスポートされた値をインポートすることです。 -したがって、`ec2.yaml` に最初に加えるべき変更は、今後使用されなくなる `SubnetId`、`VpcID`、`WebServerInstanceProfile`のパラメータを削除することです。 +##### 1. EC2 テンプレートの準備 +**階層化された Stack** のコンセプトは、**Paramaters** を使用する代わりに、組み込み関数を使用して、以前にエクスポートされた値をインポートすることです。 +従って、`ec2.yaml` に最初に加えるべき変更は、今後使用されなくなる `SubnetId`、`VpcID`、`WebServerInstanceProfile` のパラメータを削除することです。 -##### 2. Parameters セクションを更新 +##### 2. Parameters セクションの更新 -次の例のような形で、**Parameters**セクションを更新します。 -つまり、**Parameters**セクションから、`VpcId`、`SubnetId`、`WebServerInstanceProfile` の項目を削除します。 +次の例のような形で、**Parameters** セクションを更新します。 +つまり、**Parameters** セクションから、`VpcId`、`SubnetId`、`WebServerInstanceProfile` の項目を削除します。 ```yaml Parameters: @@ -131,10 +130,10 @@ Parameters: Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 ``` -##### 3. WebServerInstanceリソースの更新 +##### 3. WebServerInstance リソースの更新 -次に、テンプレートの`Ref`を更新して、以前に作成した VPC と IAM スタックからエクスポートされた値をインポートする必要があります。 -このインポートは [Fn::ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) 組み込み関数を使用して実行します。 +次に、テンプレートの `Ref` を更新して、以前に作成した VPC と IAM スタックからエクスポートされた値をインポートする必要があります。 +このインポートは [Fn::ImportValue](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html) 組み込み関数を使用して実行します。 `ec2.yaml` テンプレートのリソースセクションにある WebServerInstance リソースを更新します。 @@ -151,7 +150,7 @@ WebServerInstance: ``` ##### 4. セキュリティグループの更新 -最後に、セキュリティグループリソースを更新します。`ec2.yaml` テンプレートの**Resources** セクション`WebServerSecurityGroup` リソース [19] 行目を更新します。 +最後に、セキュリティグループリソースを更新します。`ec2.yaml` テンプレートの **Resources** セクション `WebServerSecurityGroup` リソース [19] 行目を更新します。 ```yaml {hl_lines=[19]} WebServerSecurityGroup: @@ -199,22 +198,22 @@ WebServerSecurityGroup: Session Manager を使用してインスタンスにログインできることを確認します。 -方法が不明な場合は、[Session Manager](/basics/operations/session-manager#challenge)ラボの指示に従ってください。 +やり方がわからない場合は、[Session Manager](/basics/operations/session-manager#challenge) ラボをご参照ください。 ### クリーンアップ ::alert[スタックが出力値をインポートした後は、出力値をエクスポートしているスタックを削除したり、エクスポートされた出力値を変更したりすることはできません。エクスポートするスタックを削除したり、出力値を変更したりする前に、すべてのインポートを削除する必要があります。]{type="info"} -例えば、**EC2 スタック**を削除する前に**VPC スタック**を削除することはできません。次のエラーメッセージが表示されます。 +例えば、**EC2 スタック**を削除する前に **VPC スタック**を削除することはできません。次のエラーメッセージが表示されます。 ![delete-export-before-import.png](/static/intermediate/templates/layered-stacks/delete-export-before-import.ja.png) -1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation) で、**EC2 スタック** を選択します (例:`cfn-workshop-ec2`)。 +1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation) で、**EC2 スタック** を選択します (例: `cfn-workshop-ec2`)。 2. 右上の**削除**をクリックします。 3. ポップアップウィンドウで、**スタックの削除**をクリックします。 4. **DELETE_COMPLETE** のステータスが表示されるまで、**更新**ボタンを数回クリックします。 -5. 依存関係がなくなったため、**IAM**と**VPC**スタックが削除できます。 +5. 依存関係がなくなったため、**IAM** と **VPC** スタックが削除できます。 --- ### まとめ -**階層化されたスタック**では、複数のスタックで繰り返し使用できるリソースを作成できます。全てのスタックには、**エクスポート**名が必要です。この機能を利用することで、役割と責任を分けることができます。例えば、ネットワークチームは、承認された VPC デザインをテンプレートとして作成して提供できます。それをスタックとしてデプロイし、必要に応じて、エクスポートを参照するだけです。同様に、セキュリティチームは IAM ロールや EC2 セキュリティグループについても同じ操作を行うことができます。 +**階層化されたスタック**では、複数のスタックで繰り返し使用できるリソースを作成できます。利用する全てのスタックで、**Export** で指定した名前を知る必要があります。この機能を利用することで、役割と責任を分けることができます。例えば、ネットワークチームは、承認された VPC デザインをテンプレートとして作成して提供できます。必要に応じて、VPCスタックの Export を参照すれば良いです。同様に、セキュリティチームは IAM ロールや EC2 セキュリティグループについても同じ操作を行うことができます。 diff --git a/content/intermediate/templates/nested-stacks/index.ja.md b/content/intermediate/templates/nested-stacks/index.ja.md index ca21b0b0b..f7a714758 100644 --- a/content/intermediate/templates/nested-stacks/index.ja.md +++ b/content/intermediate/templates/nested-stacks/index.ja.md @@ -5,41 +5,41 @@ weight: 400 ### 概要 -CloudFormationテンプレートは、このワークショップの過程でかなり大きくなりました。 +CloudFormation テンプレートは、このワークショップを進めることでボリュームが多くなりました。 インフラが拡大するにつれ、それぞれのテンプレートで同じコンポーネントを宣言するパターンが出てくることがあります。 -これらの共通コンポーネントを分離して、専用のテンプレートを作成できます。 -その方法は、[**ネストされたスタック**](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)を用いて、様々なテンプレートを組み合わせ、1つの統合されたスタックを作成することができます。 +同じコンポーネントを宣言するケースにおいては、共通コンポーネントを分離して、専用のテンプレートを作成することが可能です。 +具体的には、[**ネストされたスタック**](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)を用いて、様々なテンプレートを組み合わせ、1つの統合されたスタックを作成することができます。 例えば、Systems Manager Session Manager によるすべての EC2 インスタンスへのアクセスを有効にしたい場合があります。 -コピーする代わりに同じ IAM ロール設定を貼り付けると、インスタンスの IAM ロールを含む専用テンプレートを作成できます。 -そして、[AWS::CloudFormation::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html)リソースを使用して、他のテンプレート内からそのテンプレートを参照するだけです。 +同じ IAM ロール設定をコピー & ペーストする代わりに、インスタンスの IAM ロールを含む専用テンプレートを作成できます。 +そして、[AWS::CloudFormation::Stack](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html)リソースを使用して、他のテンプレート内からそのテンプレートを参照することができます。 ### 取り上げるトピック このラボでは、以下を作成します。 -1. **_root_ スタック**: (第1レベルにある親スタックでもあります)。このルートスタックには、他のすべてのスタックが含まれます。 -2. **VPC スタック**。これには、EC2 インスタンスを配置するシンプルな VPC テンプレートが含まれています。 -3. **IAM インスタンスロールスタック**: これには、EC2 テンプレートから切り離された IAM インスタンスロールテンプレートが含まれています。 -4. **EC2 スタック**: これには、以前の CloudFormation テンプレートで定義した EC2 インスタンスが含まれます。 +1. **_root_ スタック**: (第1レベルにある親スタックでもあります)。root スタックには、他のすべてのスタックが含まれます。 +2. **VPC スタック**: EC2 インスタンスを配置するシンプルな VPC テンプレートが含まれています。 +3. **IAM インスタンスロールスタック**: EC2 テンプレートから切り離された IAM インスタンスロールテンプレートが含まれています。 +4. **EC2 スタック**: 以前の CloudFormation テンプレートで定義した EC2 インスタンスが含まれます。 > ネストされたスタックの最上位レベルと第1レベルの階層 ![nested-stack-hierarchy](/static/intermediate/templates/nested-stacks/nested-stack-hierarchy.ja.png) -> 次の図は、インフラストラクチャの概要を示しています。 +> インフラストラクチャの概要 ![ested-stack-architecture](/static/intermediate/templates/nested-stacks/ns-architecture.png) ### ラボを開始 -1. `code/workspace/nested-stacks`ディレクトリに移動します。 -2. 以下のトピックを読みながら、コードをコピーしてください。 +1. `code/workspace/nested-stacks` ディレクトリに移動します。 +2. 以下のトピックを読みながら、コードをコピーします。 -#### 1. ネストされたスタックリソース +#### 1. ネストされたスタックのリソース テンプレート内の CloudFormation スタックを参照するには、`AWS::CloudFormation::Stack` リソースを使用します。 @@ -61,19 +61,17 @@ Resources: #### 2. S3 バケットを準備 -ローカルマシンから単一のテンプレートをデプロイできますが、ネストされたスタックでは、ネストされたテンプレートを S3 バケットに保存する必要があります。 +単一のテンプレートの場合は、ローカルマシンからデプロイできますが、ネストされたスタックでは、ネストされたテンプレートを S3 バケットに保存する必要があります。 最初のラボで、S3 バケットを作成する簡単な CloudFormation テンプレートを作成しました。作成したバケット名をメモします。 -次に例を示します。 +バケット名の例: `cfn-workshop-s3-s3bucket-2cozhsniu50t` -バケット名: `cfn-workshop-s3-s3bucket-2cozhsniu50t` +S3 バケットをお持ちでない場合は、[テンプレートとスタック](/basics/templates/template-and-stack) ラボに戻って、S3 バケットを作成します。 -S3 バケットをお持ちでない場合は、[テンプレートとスタック](/basics/templates/template-and-stack) ラボに戻って作成してください。 +#### 3. ネストされた VPC スタックの作成 -#### 3. VPC ネストされたスタックの作成 - -VPC テンプレートは既に作成されています。タイトルは `vpc.yaml` です。このテンプレートは、2 つのパブリックサブネット、インターネットゲートウェイ、ルートテーブルを含む VPC スタックを作成します。 +VPC テンプレートは既に作成されており、タイトルは `vpc.yaml` です。このテンプレートは、2 つのパブリックサブネット、インターネットゲートウェイ、ルートテーブルを含む VPC スタックを作成することができます。 ##### 1. メインテンプレートで VPC パラメータを作成 @@ -116,10 +114,10 @@ PublicSubnet2Cidr: ``` ##### 2. メインテンプレートに VPC リソースを作成 -以下のコードでは、リソースにパラメータ値を渡すことが単一のスタンドアロンテンプレートを使用する場合と同じように機能することに注意してください。 +以下のコードでは、単一のスタンドアロンテンプレートを使用する場合と同じように、リソースにパラメータ値を渡すことができます。 メインテンプレートのパラメータ名が VPC テンプレートのパラメータ名と一致することを確認してください。 -このコードをメインテンプレート (`main.yaml`) の**Resources**セクションに追加します +このコードをメインテンプレート (`main.yaml`) の **Resources** セクションに追加します ```yaml VpcStack: @@ -145,32 +143,32 @@ VpcStack: 3. `vpc.yaml` ファイルを選択します。 4. **アップロード**ボタンをクリックし、ファイルをアップロードします。 -##### 4. VPC ネストされたスタックをデプロイ +##### 4. ネストされた VPC スタックをデプロイ :::alert{type="info"} -**YAML** はインデントを区別するマークダウン言語であることに注意してください。`cfn-lint`、または、 CloudFormation コンソールが`Template format error: [/Resources/VpcStack] resource definition is malformed`というエラーを報告した場合、**Parameters** と **Resources** セクションが正しくフォーマットされていることを再確認してください。 +**YAML** はインデントを区別するマークダウン言語であることに注意してください。`cfn-lint`、または、 CloudFormation コンソールが`Template format error: [/Resources/VpcStack] resource definition is malformed` というエラーを報告した場合、**Parameters** と **Resources** セクションが正しくフォーマットされていることを再確認してください。 ::: 1. コンソールで CloudFormation に移動し、**新しいリソースを使用 (標準)** をクリックします。 2. **テンプレートの準備**セクションで、**テンプレート準備完了**を選択します。 3. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 4. `main.yaml` ファイルを選択します。 -5. **スタック名**を入力します。例えば、`cfn-workshop-nested-stack`と入力します。 -6. **AvaliabilityZone**パラメータには、2 つの AZ を選択します。 +5. **スタック名**を入力します。例えば、`cfn-workshop-nested-stack` と入力します。 +6. **AvaliabilityZone** パラメータには、2 つの AZ を選択します。 7. **S3BucketName** には、[S3 バケットを準備](#2-prepare-s3-bucket) セクションに書き留めたバケット名を入力します。 8. 残りのパラメータはデフォルトのままとします。 9. **スタックオプションの設定**はデフォルトのままにして、**次へ**をクリックします。 -10. **レビュー **ページで一番下までスクロールし、両方の**IAM Capabilities**チェックボックスにチェックを入れます。 +10. **レビュー ** ページで一番下までスクロールし、両方の **IAM Capabilities** チェックボックスにチェックを入れます。 ![iam-capabilities.png](/static/intermediate/templates/nested-stacks/iam-capabilities.ja.png) 11. **スタックの作成**をクリックします。CloudFormation コンソールで作成中のネストスタックの進行状況を確認できます。 12. 数分後にスタックが作成されます。`CREATE_COMPLETE` のステータスが表示されるまで、更新ボタンを数回クリックします。 -#### 4. IAM ネストされたスタックの作成 +#### 4. ネストされた IAM スタックの作成 ##### 1. IAM ロールテンプレートの準備 **IAM ロール** テンプレートが既に作成されています。タイトルは `iam.yaml` です。 -このテンプレートは、[Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) がEC2インスタンスにアクセスすることを許可する `AmazonSSMManagedInstanceCore` ポリシーを使用して IAM ロールを作成します。 +このテンプレートは、[Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html) が EC2 インスタンスにアクセスすることを許可する `AmazonSSMManagedInstanceCore` ポリシーを使用して IAM ロールを作成します。 1. `iam.yaml` ファイルを開きます。 @@ -200,7 +198,7 @@ WebServerInstanceProfile: ``` ##### 2. メインテンプレートに IAM リソースを作成 -以下のコードを `main.yaml` テンプレートの**Resources**セクションにコピーします。 +以下のコードを `main.yaml` テンプレートの **Resources** セクションにコピーします。 ```yaml IamStack: @@ -216,16 +214,16 @@ IamStack: [VPC スタック](#3-upload-the-vpc-stack-to-s3) と同様に、IAM テンプレートを S3 にアップロードします。 1. コンソールで S3 バケットに移動して選択します。 -2. **アップロード**ボタン-> **ファイルを追加**をクリックします。 -3. `iam.yaml` ファイルを見つけて選択します。 +2. **アップロード**ボタン -> **ファイルを追加**をクリックします。 +3. `iam.yaml` ファイルを選択します。 4. **アップロード**ボタンをクリックしてファイルをアップロードします。 -##### 4. IAM ネストされたスタックをデプロイ +##### 4. ネストされた IAM スタックをデプロイ 以前に作成したネストスタックを新しいテンプレートで更新します。 1. AWS コンソールの Cloudformation サービスに移動します。 -2. **root** スタック (**ネストされた** タグが関連付けられていないスタック) を選択します。 +2. **root** スタック (**ネストされた**タグが関連付けられていないスタック) を選択します。 3. 右上の**更新**をクリックします。 4. **テンプレートの準備**セクションで、**既存のテンプレートを置き換える**を選択します。 5. **テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。 @@ -233,7 +231,7 @@ IamStack: 7. `main.yaml` テンプレートファイルを選択し、**次へ**をクリックします。 8. ウィザードに従い、IAM Capabilities を確認し、**送信**をクリックします。 -#### 5. EC2 ネストされたスタックの作成 +#### 5. ネストされた EC2 スタックの作成 ##### 1. メインテンプレートで EC2 パラメータを作成する @@ -241,9 +239,9 @@ VPC テンプレートと同様に、`ec2.yaml` テンプレートの **Paramete * `SubnetId` - このプロパティは VPC スタックが作成されると VPC スタックから渡されます。 * `EnvironmentType` - このプロパティにはデフォルト値があり、頻繁に変更される可能性があるので、Parameters に追加します。 -* `AmiId` - このプロパティにはデフォルト値があり、メインテンプレートから除外してもかまいません。 +* `AmiId` - このプロパティにはデフォルト値があるため、メインテンプレートから除外してもかまいません。 -`main.yaml` テンプレートの**Paramaters**セクションに以下のコードを追加します。 +`main.yaml` テンプレートの **Paramaters** セクションに以下のコードを追加します。 ```yaml EnvironmentType: @@ -259,7 +257,7 @@ EnvironmentType: ##### 2. メインテンプレートに EC2 リソースを作成 -以下のコードを `main.yaml` テンプレートの**Resources**セクションにコピーします。 +以下のコードを `main.yaml` テンプレートの **Resources** セクションにコピーします。 ```yaml EC2Stack: @@ -273,7 +271,7 @@ EC2Stack: テンプレートに `EnvironmentType` パラメータを追加したので、これを `EC2Stack` リソースで参照する必要があります。 -`main.yaml` テンプレートのEC2 スタック[6-7] 行目に、`Parameters` セクションと`EnvironmentType` を追加します。 +`main.yaml` テンプレートのEC2 スタック [6-7] 行目に、`Parameters` セクションと `EnvironmentType` を追加します。 ```yaml {hl_lines=[6,7]} EC2Stack: Type: AWS::CloudFormation::Stack @@ -288,13 +286,13 @@ EC2Stack: CloudFormation のネストスタックを更新する前に、やるべきことが他にもいくつかあります。 -+ EC2 セキュリティグループを作成する VPC を指定する必要があります。VPC パラメータを指定しないと、セキュリティグループは**デフォルト VPC**に作成されます。 ++ EC2 セキュリティグループを作成する VPC を指定する必要があります。VPC パラメータを指定しないと、セキュリティグループは**デフォルト VPC** に作成されます。 + EC2 インスタンスを作成するサブネットを指定する必要があります。 ##### 1. セキュリティグループリソースを準備 -1. `ec2.yaml` ファイルを開き、テンプレートの**Parameters**セクションに `VpcId` と `SubnetId` の 2 つのパラメータを作成します。 +1. `ec2.yaml` ファイルを開き、テンプレートの **Parameters** セクションに `VpcId` と `SubnetId` の 2 つのパラメータを作成します。 ```yaml VpcId: @@ -307,7 +305,7 @@ CloudFormation のネストスタックを更新する前に、やるべきこ ``` 2. 次に、`WebServerSecurityGroup` リソースを探します。 -3. `WebServerSecurityGroup` リソース[18] 行目に `VpcId` プロパティを追加し、 `VpcId` パラメータを参照します。セキュリティグループリソースは以下のコードのようになっているはずです。 +3. `WebServerSecurityGroup` リソース [18] 行目に `VpcId` プロパティを追加し、 `VpcId` パラメータを参照します。セキュリティグループリソースは以下のコードのようになっているはずです。 ```yaml {hl_lines=[18]} WebServerSecurityGroup: @@ -334,7 +332,7 @@ CloudFormation のネストスタックを更新する前に、やるべきこ あるスタックから別のスタックに変数を渡すには、その変数を渡すスタックの値を含む出力を作成する必要があります。 -組み込み関数 `!GetAtt`を利用すると、CloudFormationはそのスタックの値にアクセスでき、それをパラメータとして渡します。 +組み込み関数 `!GetAtt` を利用すると、CloudFormation はそのスタックの値にアクセスでき、それをパラメータとして渡します。 以下のコードを `vpc.yaml` テンプレートに追加します。 @@ -354,7 +352,7 @@ Outputs: これで、VPC スタックから値を取得して EC2 スタックに渡すことができます。 -`VpcId` と `SubnetId `パラメータを `main.yaml` テンプレートの EC2 スタックに追加します。 +`VpcId` と `SubnetId` パラメータを `main.yaml` テンプレートの EC2 スタックに追加します。 ```yaml {hl_lines=[8,9]} EC2Stack: Type: AWS::CloudFormation::Stack @@ -379,8 +377,8 @@ Outputs: ##### 5. EC2 テンプレートの準備 -1. `ec2.yaml` を開けて -2. テンプレートの**Parameters**セクションに `WebServerInstanceProfile` パラメータを作成します。 +1. `ec2.yaml` を開きます。 +2. テンプレートの **Parameters** セクションに `WebServerInstanceProfile` パラメータを作成します。 ```yaml WebServerInstanceProfile: @@ -388,9 +386,9 @@ WebServerInstanceProfile: Description: 'Instance profile resource ID' ``` -##### 6. WebServerInstanceProfileを **EC2Stack** スタックに追加 +##### 6. WebServerInstanceProfile を **EC2Stack** スタックに追加 -`webServerInstanceProfile` パラメータを `main.yaml` テンプレートの EC2 スタック[10] 行目に追加します。 +`webServerInstanceProfile` パラメータを `main.yaml` テンプレートの EC2 スタック [10] 行目に追加します。 ```yaml {hl_lines=[10]} EC2Stack: Type: AWS::CloudFormation::Stack @@ -404,7 +402,7 @@ EC2Stack: WebServerInstanceProfile: !GetAtt IamStack.Outputs.WebServerInstanceProfile ``` -##### 7. メインテンプレートの `WebsiteURL`を出力する +##### 7. メインテンプレートの `WebsiteURL` を出力する `WebsiteURL` を `main.yaml` テンプレートの `Outputs` セクションに追加します。 @@ -417,14 +415,14 @@ Outputs: ##### 8. EC2 スタックを S3 にアップロード 更新されたネストスタックをデプロイする前に、親テンプレート `main.yaml` が参照する S3 バケットのテンプレートを更新する必要があります。 -前のステップの [VPC スタックのアップロード](#3-upload-the-vpc-stack-to-s3) と同様に、`vpc.yaml`、`ec2.yaml`、 `iam.yaml` テンプレートを S3 バケットにをアップロードします。 +前のステップの [VPC スタックのアップロード](#3-upload-the-vpc-stack-to-s3) と同様に、`vpc.yaml`、`ec2.yaml`、 `iam.yaml` テンプレートを S3 バケットにアップロードします。 1. コンソールで S3 バケットに移動して選択します。 -2. **アップロード**ボタン-> **ファイルの追加**をクリックします。 -3. `vpc.yaml`、`iam.yaml`、`ec2.yaml` ファイルを見つけて選択します。 +2. **アップロード**ボタン -> **ファイルの追加**をクリックします。 +3. `vpc.yaml`、`iam.yaml`、`ec2.yaml` ファイルを選択します。 4. **アップロード**ボタンをクリックしてファイルをアップロードします。 -##### 9. EC2 ネストされたスタックをデプロイ +##### 9. ネストされた EC2 スタックをデプロイ 以前に作成したネストスタックを新しいテンプレートで更新します。 @@ -441,9 +439,9 @@ Outputs: ##### 1. アプリケーションが正常にデプロイされたことを確認 -プライベートモードで新しいブラウザウィンドウを開き、`WebsiteURL`を入力します。 +プライベートモードで新しいブラウザウィンドウを開き、`WebsiteURL` を入力します。 -`WebsiteURL`は、CloudFormation コンソールのメインスタックの**出力**タブから取得できます。 +`WebsiteURL` は、CloudFormation コンソールのメインスタックの**出力**タブから取得できます。 ![website-url-output.png](/static/intermediate/templates/nested-stacks/website-url-output.ja.png) @@ -455,13 +453,13 @@ Outputs: SessionManager 経由でインスタンスにログインできることを確認します。 -方法が不明な場合は、[Session Manager](/basics/operations/session-manager#challenge)ラボの指示に従ってください。 +方法が不明な場合は、[Session Manager](/basics/operations/session-manager#challenge) ラボの指示に従ってください。 ### クリーンアップ 作成したリソースをクリーンアップするには、次の手順に従います。 -1. **[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)** で、このラボで作成した**root** スタックを選択します。例えば、`cfn-workshop-nested-stack`を選択します。 +1. **[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation)** で、このラボで作成した **root** スタックを選択します。具体的には、`cfn-workshop-nested-stack` を選択します。 2. **root** スタックは、すべての **子** スタックの削除を自動的に処理します。 3. 右上の**削除**をクリックします。 4. ポップアップウィンドウで、**スタックの削除**をクリックします。 diff --git a/content/intermediate/templates/package-and-deploy/index.ja.md b/content/intermediate/templates/package-and-deploy/index.ja.md index 14b312df4..c930b2d23 100644 --- a/content/intermediate/templates/package-and-deploy/index.ja.md +++ b/content/intermediate/templates/package-and-deploy/index.ja.md @@ -6,12 +6,12 @@ weight: 600 ### 概要 このワークショップの [基本](/basics)で、CloudFormation コンソールを介して単一の YAML テンプレートをデプロイしました。 -本作業はmとても簡単な作業でしたが、CloudFormation テンプレートが他のファイルまたはアーティファクトを参照する場合もあります。 +基本編は、非常に簡単な作業でしたが、CloudFormation テンプレートが他のファイルまたはアーティファクトを参照する場合もあります。 -例えば、LambdaのソースコードやZIPファイル、またはネストされたCloudFormationテンプレートファイルは、「アーティファクト」です。 -[ネストされたスタックラボ](/intermediate/templates/nested-stacks) で学んだように、 メインの CloudFormation テンプレートをデプロイする前に、これらのファイルが S3 で利用可能になっている必要があります。 +例えば、Lambda のソースコードや ZIP ファイル、またはネストされた CloudFormation テンプレートファイルは、アーティファクトです。 +[ネストされたスタックのラボ](/intermediate/templates/nested-stacks)で学んだように、 メインの CloudFormation テンプレートをデプロイする前に、これらのファイルが S3 で利用可能になっている必要があります。 -より複雑なスタックのデプロイは多段階のプロセスですが、AWS CLI には他のファイルを参照する CloudFormation テンプレートをデプロイする方法が用意されています。 +より複雑なスタックのデプロイは多段階のプロセスが必要ですが、AWS CLI には、他のファイルを参照して CloudFormation テンプレートをデプロイする方法が用意されています。 このセクションでは、AWS CLI で CloudFormation テンプレートをパッケージ化、検証、デプロイするために使用する 3 つの主要なコマンドについて説明します。 @@ -20,10 +20,10 @@ weight: 600 ### 取り上げるトピック このラボを修了すると、次のことができるようになります。 -* テンプレートをいつパッケージ化する必要があるかを確認する -* `aws cloudformation package`コマンドを使ってテンプレートをパッケージ化する -* `aws cloudformation validate-template`コマンドを使用して CloudFormation テンプレートを検証する -* `aws cloudformation deploy`コマンドを使用してテンプレートをデプロイする +* テンプレートをパッケージ化する必要があるケースを確認 +* `aws cloudformation package` コマンドを使ってテンプレートをパッケージ化 +* `aws cloudformation validate-template` コマンドを使用して CloudFormation テンプレートを検証 +* `aws cloudformation deploy` コマンドを使用してテンプレートをデプロイ ### ラボを開始 @@ -31,9 +31,9 @@ weight: 600 プロジェクトの構成は以下のとおりです。 -* インフラストラクチャをスピンアップするための CloudFormation テンプレート。 -* 1 つの Lambda 関数。 -* 関数の依存関係をインストールするための要件ファイル。 +* インフラストラクチャをスピンアップするための CloudFormation テンプレート +* 1 つの Lambda 関数 +* 関数の依存関係をインストールするための要件ファイル :::code{language=shell showLineNumbers=false showCopyAction=false} cfn101-workshop/code/workspace/package-and-deploy @@ -46,9 +46,9 @@ cfn101-workshop/code/workspace/package-and-deploy #### CloudFormation テンプレート内のローカルファイルを参照 -従来は、すべての Lambda ソースを圧縮して S3 にアップロードし、次にテンプレートでこれらの S3 ロケーションを参照する必要がありました。これはかなり面倒です。 +従来は、すべての Lambda ソースを圧縮して S3 にアップロードし、次にテンプレートでS3 ロケーションを参照する必要がありました。この作業はかなり面倒です。 -ただし、[aws cloudformation package](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) を使えば、ローカルファイルを直接参照できます。これを利用する方が、従来の方法と比較し、便利です。 +ただし、[aws cloudformation package](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) を使えば、ローカルファイルを直接参照できます。直接参照の方が、S3を参照する従来の方法と比較し利用が簡単です。 `infrastructure.template` スニペットを見ると、`Code` プロパティのローカルディレクトリの [9] 行目への参照が分かります。 @@ -74,7 +74,7 @@ PythonFunction: ##### 1. S3 バケットの作成 -CloudformationテンプレートをデプロイするAWSリージョンを先に決めます。Lambda がパッケージ化されたアーティファクトにアクセスできるようにするには、S3 バケットが Lambda と同じリージョンにある必要があります。 +一番最初に、CloudFormation テンプレートをデプロイする AWS リージョンを決定します。Lambda がパッケージ化されたアーティファクトにアクセスできるようにするには、S3 バケットが Lambda と同じリージョンにある必要があります。 ::alert[`s3://` の後のバケット名は必ず一意の名前に置き換えてください!]{type="info"} @@ -85,9 +85,9 @@ aws s3 mb s3://example-bucket-name --region eu-west-1 ##### 2. インストール機能の依存関係 私たちの関数は外部ライブラリ [pytz](https://pypi.org/project/pytz/) に依存しているため、ローカルにインストールする必要があります。 -ディレクトリに [pip](https://pypi.org/project/pip/) が付いているので、関数コードと一緒にパッケージ化できます。 +関数のパッケージに含むために、[pip](https://pypi.org/project/pip/) でローカルフォルダーにインストールする必要があります。 -`code/workspace/package-and-deploy`ディレクトリ内から以下を実行します。 +`code/workspace/package-and-deploy` ディレクトリ内から以下を実行します。 :::code{language=shell showLineNumbers=false showCopyAction=true} pip install pytz --target lambda @@ -112,13 +112,13 @@ aws cloudformation package \ * `--template-file` - これは CloudFormation テンプレートが置かれているパス * `--s3-bucket` - アーティファクトがアップロードされる S3 バケットの名前 * `--s3-prefix` - プレフィックス名は S3 バケットのパス名 (フォルダ名) -* `—output-template-file` - コマンドが出力 AWS CloudFormation テンプレートを書き込むファイルのパス +* `—output-template-file` - 出力される AWS CloudFormation テンプレートの書き込み先ファイルパス ##### 4. パッケージファイルを確認する 新しく生成されたファイル `infrastructure-packaged.template` を見てみましょう。 -`Code` プロパティが [12-14]行目の`S3Bucket` と `S3Key` の 2 つの新しい属性で更新されていることが分かります。 +`Code` プロパティが [12-14] 行目の `S3Bucket` と `S3Key` の 2 つの新しい属性で更新されていることが分かります。 ```yaml {hl_lines=[12,13,14]} PythonFunction: @@ -179,17 +179,16 @@ d----- 10/29/2021 4:25 PM pytz-2021.3.dist-info CloudFormation テンプレートのデプロイは、テンプレートの構文エラーが原因で失敗することがあります。 -[`aws cloudformation validate-template`](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/validate-template.html) -CloudFormation テンプレートをチェックして、有効な JSON または YAML であることを確認します。これは開発時間を短縮するのに役立ちます。 +[`aws cloudformation validate-template`](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/validate-template.html) で CloudFormation テンプレートをチェックして、有効な JSON または YAML であることを確認します。これは開発時間を短縮するのに役立ちます。 -パッケージ化されたテンプレートを検証しましょう。`code/workspace/package-and-deploy`ディレクトリ内で以下を実行します。 +パッケージ化されたテンプレートを検証しましょう。`code/workspace/package-and-deploy` ディレクトリ内で以下を実行します。 :::code{language=shell showLineNumbers=false showCopyAction=true} aws cloudformation validate-template \ --template-body file://infrastructure-packaged.template ::: -成功すると、CloudFormationはパラメータ、テンプレートの説明、機能のリストを含むレスポンスを送信します。 +成功すると、CloudFormation はパラメータ、テンプレートの説明、機能のリストを含むレスポンスを送信します。 :::code{language=json showLineNumbers=false showCopyAction=true} { @@ -218,25 +217,25 @@ aws cloudformation deploy \ --capabilities CAPABILITY_IAM ::: -::alert[S3 のアーティファクトを参照するパッケージテンプレート `infrastructure-packaged.template` を使用したことに注意してください。ローカルパスを持つオリジナルのものではありません!]{type="info"} +::alert[S3 のアーティファクトを参照するパッケージテンプレート `infrastructure-packaged.template` を利用した点に注意してください。ローカルパスを持つオリジナルのものではありません!]{type="info"} -`—parameter-overrides` オプションを設定してテンプレート内のパラメータを指定することもできます。 -これは `'key=value'` のペアを含む文字列でも、[提供された json ファイル](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters.html#cli-usage-parameters-json) 経由の文字列でもかまいません。 +`--parameter-overrides` オプションを設定してテンプレート内のパラメータを指定することもできます。 +`'key=value'` のペアを含む文字列や、[提供された json ファイル](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-parameters.html#cli-usage-parameters-json) などを用いて指定します。 ##### Capabilities コンソールを使用する際に、このテンプレートをデプロイするとリソースが作成される可能性があることを認識する必要があります。 アカウントの権限に影響する可能性があり、意図せずに誤って権限を変更しないようにするためです。 -CLIを使用する際には、このスタックによってIAMの権限に影響するリソースが作成される可能性があることも確認する必要があります。 -そのためには、前の例で示したように、`—capabilities` フラグを使います。capabilitiesについては、 -[`aws cloudformation deploy` ドキュメント](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/index.html)をご参照ください。 +CLI を使用する際には、このスタックによって IAM の権限に影響するリソースが作成される可能性があることも確認する必要があります。 +そのためには、前の例で示したように、`--capabilities` フラグを使います。capabilities については、 +[`aws cloudformation deploy` のドキュメント](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/index.html)をご参照ください。 #### Lambda のテスト Lambda 関数をテストするには、[aws lambda invoke](https://docs.aws.amazon.com/cli/latest/reference/lambda/invoke.html) コマンドを使用します。 -Lambda 関数は、現在の UTC の日付と時刻を決定します。次に、UTC 時刻をペイロードオプションで指定されたタイムゾーンに変換します。 +Lambda 関数は、現在の UTC の日付と時刻を取得します。次に、UTC 時刻をペイロードオプションで指定されたタイムゾーンに変換します。 ターミナルから以下を実行します。 @@ -273,7 +272,7 @@ aws lambda invoke ` :::: ::::: -Lambda がトリガーされ、Lambdaからのレスポンスが `response.json` ファイルに保存されます。 +Lambda がトリガーされ、Lambda からのレスポンスが `response.json` ファイルに保存されます。 以下のコマンドを実行すると、ファイルの結果を確認できます。 @@ -297,6 +296,6 @@ more response.json おめでとうございます。コマンドラインを使用して CloudFormation テンプレートを正常にパッケージ化およびデプロイしました。 -* `package` コマンドは、ネストされたスタックなどの機能を使用するテンプレートや他のローカルアセットを参照するテンプレートのデプロイを簡略化します。 +* `package` コマンドは、ネストされたスタック等を使用するテンプレートや、ローカルアセットを参照するテンプレートのデプロイを簡略化します。 * `validate` コマンドは、エラーをより迅速に検出することでテンプレートの開発をスピードアップできます。 * `deploy` コマンドを使うと、CloudFormation テンプレートをデプロイすることができます。 diff --git a/content/intermediate/templates/policy-as-code-with-guard/index.ja.md b/content/intermediate/templates/policy-as-code-with-guard/index.ja.md index 460f3c308..339f0f061 100644 --- a/content/intermediate/templates/policy-as-code-with-guard/index.ja.md +++ b/content/intermediate/templates/policy-as-code-with-guard/index.ja.md @@ -6,41 +6,41 @@ weight: 700 ### 概要 -一般的な組織では、セキュリティチームが組織が必要とするセキュリティ、ガバナンス、およびポリシーコンプライアンスの要件を設定します。これには、Infrastructure as Code (IaC) 設定の要件も含まれます。例えば、セキュリティチームが [Amazon Simple Storage Service](https://aws.amazon.com/s3/) (Amazon S3) バケットをデフォルトでサーバー側の暗号化で設定し、バージョニングを有効にする必要があることを規定するポリシーを確立します。 +一般的な組織では、セキュリティチームが組織が必要とするセキュリティ、ガバナンス、およびポリシーコンプライアンスの要件を設定します。要件には、Infrastructure as Code (IaC) 設定の要件も含まれます。例えば、セキュリティチームが [Amazon Simple Storage Service](https://aws.amazon.com/jp/s3/) (Amazon S3) バケットをデフォルトでサーバー側の暗号化で設定し、バージョニングを有効にするというポリシーを規定します。 ベストプラクティスの一環として、policy-as-code プラクティスを採用して、ソフトウェア開発ライフサイクル(SDLC)のごく早い段階で、次のようなポリシー・コンプライアンスの問題をプログラムで検出します。 * 開発者のワークステーションで検出 * デリバリーパイプラインの継続的インテグレーション (CI) フェーズで検出 -policy-as-code を採用すると、SDLCプロセスの早い段階で発見したポリシー・コンプライアンスの問題に対処する機会が得られるため、**SDLCのフィードバック・ループをスピードアップ**できます。 +policy-as-code を採用すると、SDLC プロセスの早い段階で発見したポリシー・コンプライアンスの問題に対処する機会が得られるため、**SDLC のフィードバック・ループをスピードアップ**できます。 -Policy-as-Codeをプログラムで活用するには、まずポリシー要件を、Policy-as-Code ツールが理解できる言語で記述されたルールに変換する必要があります。このラボでは、[AWS CloudFormation Guard](https://github.com/aws-cloudformation/cloudformation-guard) (Guard) などのツールを使用して、作成したルールに対するポリシーコンプライアンスの検証方法を学びます。 +Policy-as-Codeをプログラムで活用するには、ポリシー要件を、Policy-as-Code ツールが理解できる言語で記述されたルールに変換する必要があります。このラボでは、[AWS CloudFormation Guard](https://github.com/aws-cloudformation/cloudformation-guard) (Guard) などのツールを使用して、作成したルールに対するポリシーコンプライアンスの検証方法を学びます。 ### 取り上げるトピック このラボを修了すると、次のことができるようになります。 -* Guardが使用するドメイン固有言語 (DSL) の基本を理解する -* 最初のガードルールを記述する -* デフォルトのターゲット選択方法としてフィルターを使用する -* ルール/ルール節をモジュール性と再利用性のために書き直す -* 初めてのガードルールテストを記述する -* ガードルールを書く際のプラクティスとしてテスト駆動開発 (TDD) を採用する -* 詳細と高度な使用例については、Guard のドキュメントを参照する +* Guard が使用するドメイン固有言語 (DSL) の基本を理解 +* 最初のガードルールを記述 +* デフォルトのターゲット選択方法としてフィルターを使用 +* ルール / ルール節をモジュール性と再利用性を考慮して記述 +* 初めてのガードルールテストを記述 +* ガードルールを書く際のプラクティスとしてテスト駆動開発 (TDD) を採用 +* 詳細と高度な使用例については、Guard のドキュメントを参照 ### ラボを開始 -#### Guardをインストール -使用しているオペレーティングシステムに応じて選択した方法を使用して、ワークステーションに [Guard](https://github.com/aws-cloudformation/cloudformation-guard#installation) をインストールします。マシンに [Rust と Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) がインストールされている場合 (または Rust と Cargo をインストールする場合)、以下の方法でガードを簡単にインストールすることができます。 +#### Guard をインストール +使用しているオペレーティングシステムに応じて、ワークステーションに [Guard](https://github.com/aws-cloudformation/cloudformation-guard#installation) をインストールします。マシンに [Rust と Cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html) がインストールされている場合 (または Rust と Cargo をインストールする場合)、以下の方法で Guard を簡単にインストールすることができます。 :::code{language=shell showLineNumbers=false showCopyAction=true} cargo install cfn-guard ::: -選択した方法でGuardをセットアップしたら、次のコマンドを正常に実行できることを確認します。 +Guard をセットアップしたら、次のコマンドを正常に実行できることを確認します。 :::code{language=shell showLineNumbers=false showCopyAction=true} cfn-guard help @@ -48,16 +48,16 @@ cfn-guard help #### 最初のガードルールを記述 -このセクションでは、サンプルの CloudFormation テンプレートが [Amazon S3 バケット](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html) と必要な次のプロパティを記述していることを検証するためのガードルール節の例を記述します。 +このセクションでは、サンプルの CloudFormation テンプレートが [Amazon S3 バケット](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html) と必要な次のプロパティを記述していることを検証するためのガードルール節の例を記述します。 -* AES256 アルゴリズムを例として使用し、[サーバー側の暗号化](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html) -* [バージョニング](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfiguration.html) 有効化 +* AES256 アルゴリズムを例として使用し、[サーバー側の暗号化](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html) +* [バージョニング](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfig.html) 有効化 さあ、始めましょう! 次に示す手順に従って進めます。 1. `code/workspace/policy-as-code-with-guard` ディレクトリに移動します。 2. お好みのテキストエディタで `example_bucket.yaml` CloudFormation テンプレートを開きます。 -3. テンプレートには `AWS::S3::Bucket` リソースタイプが記述されています。AES256 アルゴリズムを使用して [サーバー側の暗号化](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html)と[バージョニング](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfiguration.html)有効化設定を含む `Properties` セクションを追加してテンプレートを更新します。次に表示される内容をコピーし、`example_bucket.yaml`ファイルにペーストします。 +3. テンプレートには `AWS::S3::Bucket` リソースタイプが記述されています。AES256 アルゴリズムを使用して [サーバー側の暗号化](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-bucketencryption.html)と[バージョニング](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-versioningconfig.html)有効化設定を含む `Properties` セクションを追加してテンプレートを更新します。次に表示される内容をコピーし、`example_bucket.yaml` ファイルにペーストします。 ```yaml Properties: @@ -69,7 +69,7 @@ Properties: Status: Enabled ``` -4. ガードルール節の例を作成して、両方のプロパティが期待どおりに説明されていることを確認します。前述と同じディレクトリにある `example_bucket.guard` ファイルを開き、**type ブロック**を作成して、テンプレートに記述した `AWS::S3::Bucket` タイプのリソースの設定を検証します。次に表示されるコンテンツをコピーし、`example_bucket.guard` ファイルにペーストします。 +4. ガードルール節の例を作成して、両方のプロパティが期待どおりに記述されていることを確認します。前述と同じディレクトリにある `example_bucket.guard` ファイルを開き、**type ブロック**を作成して、テンプレートに記述した `AWS::S3::Bucket` タイプのリソースの設定を検証します。次に表示されるコンテンツをコピーし、`example_bucket.guard` ファイルにペーストします。 ```json AWS::S3::Bucket { @@ -84,14 +84,14 @@ AWS::S3::Bucket { } ``` -::alert[ガードルールを書くときは、リソースタイプを選択するデフォルトモードとして **filters** を使用します。新しい概念について少しずつ学んでいくので、このセクションでは引き続き type ブロック (特定の型をマッチさせる場合に使うフィルターのためのブロック) を使います。そしてフィルターについては次のセクションで学びます。]{type="info"} +::alert[ガードルールを書くときは、リソースタイプを選択するデフォルトモードとして **filters** を使用します。新しい概念について少しずつ学んでいくので、このセクションでは引き続き type ブロック (特定の型をマッチさせる場合に使うフィルターのためのブロック) を使います。フィルターについては次のセクションで学びます。]{type="info"} 5. 前述のルール節のサンプルセットを確認してください。次の点に注意してください。 * 外側のブロックには `AWS::S3::Bucket` タイプが含まれています。このブロック内のルール条項は、入力データとして提供しているテンプレートで宣言した `AWS::S3::Bucket` タイプのすべてのリソースに適用されます。 * ルール節は、ドット (`.`) 文字を使ってデータ階層を下ります (例えば、`VersioningConfiguration.Status` は `VersioningConfiguration` の下の `Status` プロパティを参照します)。 * ワイルドカード (`*`) 文字は、特定のレベルのすべての配列インデックスを辿るために使われます (例えば、`ServerSideEncryptionConfiguration[*]`)。 - * ルール節には、`<<` と `>>` ブロックで区切られたオプションのセクションが含まれており、[カスタムメッセージ](https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html#clauses-custom-messages) を指定できます。 - * 例で宣言されているルール節は検証に合格することが期待されます。Guardでは、[Conjunctive Normal Form](https://en.wikipedia.org/wiki/Conjunctive_normal_form) (CNF) を使用して、複数の論理的な `AND` 節を、`OR` 節を交えて記述します。前述の例では、ルール節は `AND` 節として解釈されます (つまり、サーバー側の暗号化 *と* バージョン管理を検証し、データがルールに照らして検証に合格するには、*両方* が満たされる必要があります。)。例えば、ClauseA *または* ClauseB が満たされているかを検証したいユースケースがある場合は、ClauseA の行に `OR` を追加してこの動作を記述します。次の例において、ルールを合格するためには、`ExampleClause1` と `ExampleClause2` の両方の要件が満たされている必要があります。`ExampleClauseA` か `ExampleClauseB` のどちらかが満たされなければなりません: + * ルール節には、`<<` と `>>` ブロックで区切られたオプションのセクションが含まれており、[カスタムメッセージ](https://docs.aws.amazon.com/ja_jp/cfn-guard/latest/ug/writing-rules.html#clauses-custom-messages) を指定できます。 + * 例で宣言されているルール節は検証に合格することが期待されます。Guardでは、[連言標準形](https://ja.wikipedia.org/wiki/%E9%80%A3%E8%A8%80%E6%A8%99%E6%BA%96%E5%BD%A2) (CNF) を使用し、複数の論理的な `AND` 節を、`OR` 節を交えて記述します。前述の例では、ルール節は `AND` 節として解釈されます (つまり、サーバー側の暗号化 *と* バージョン管理を検証し、データがルールに照らして検証に合格するには、*両方* が満たされる必要があります。)。例えば、ClauseA *または* ClauseB が満たされているかを検証したいユースケースがある場合は、ClauseA の行に `OR` を追加してこの動作を記述します。次の例において、ルールを合格するためには、`ExampleClause1` と `ExampleClause2` の両方の要件が満たされている必要があります。`ExampleClauseA` か `ExampleClauseB` のどちらかが満たされなければなりません: :::code{language=shell showLineNumbers=false showCopyAction=false} [...] @@ -102,7 +102,7 @@ ExampleClauseB [...] ::: -6. ルール節の例を詳しく見てきたので、次に示すように、`-d` (または `—data`) フラグでテンプレートを指定し、`-r` (または `—rules`) でルールを指定して、`validate` Guardサブコマンドを実行します。 +6. ルール節の例を詳しく見てきたので、次に示すように、`-d` (または `—data`) フラグでテンプレートを指定し、`-r` (または `—rules`) でルールを指定して、`validate` Guard サブコマンドを実行します。 :::code{language=shell showLineNumbers=false showCopyAction=true} cfn-guard validate -d example_bucket.yaml -r example_bucket.guard @@ -121,14 +121,14 @@ Rule [example_bucket.guard/default] is compliant for template [example_bucket.ya -- ::: -::alert[前述の `example_bucket.guard/default` 出力部分に示されている `default` サフィックスは、ルール節が `default` という名前のルールに属していることを示しています。このラボの後半で、特定の名前 (**名前付きルール**) でルールを作成し、そのようなルールをデフォルトルールの代わりに使用します。これにより、モジュール化された再利用可能なルールを作成できます。]{type="info"} +::alert[前述の `example_bucket.guard/default` 出力部分に示されている `default` サフィックスは、ルール節が `default` という名前のルールに属していることを示しています。このラボの後半で、特定の名前 (**名前付きルール**) でルールを作成し、デフォルトルールの代わりに使用します。この作業を実施することで、モジュール化された再利用可能なルールを作成できます。]{type="info"} おめでとうございます! 最初のガードルールを作成し、それを使用して S3 バケット設定例を記述したサンプルテンプレートを検証しました。 #### フィルタリング -前の例では、type ブロックを使用して、入力テンプレートに記述した特定のタイプのターゲットリソースを選択しました。このセクションでは、ルールに照らして検証したいターゲットを柔軟に選択できる **filters** について学びます。例えば、テンプレートに記述した全ての [AWS::IAM::Policy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html) と [AWS::IAM::ManagedPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html) リソースに `PolicyDocument` プロパティ (両方のリソースタイプに共通するプロパティ) を検証するには、まず、次のような両方のタイプのリソースをクエリするフィルタを作成します。 +前の例では、type ブロックを使用して、入力テンプレートに記述した特定のタイプのターゲットリソースを選択しました。このセクションでは、ルールに照らして検証したいターゲットを柔軟に選択できる **filters** について学びます。例えば、テンプレートに記述した全ての [AWS::IAM::Policy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-policy.html) と [AWS::IAM::ManagedPolicy](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-managedpolicy.html) リソースの `PolicyDocument` プロパティ (両方のリソースタイプに共通するプロパティ) を検証するには、次のような両方のタイプのリソースをクエリするフィルタを作成します。 :::code{language=json showLineNumbers=false showCopyAction=true} Resources.*[ @@ -160,7 +160,7 @@ cfn-guard validate -d example_bucket.yaml -r example_bucket.guard フィルターを使用しているルール節に対する検証が合格するはずです。 -::alert[Guard は*file*、*rule*、*block* レベルで変数スコープをサポートしています。特定のスコープ内の変数の具体的な配置によって、ガードルールを含むファイルでの変数の可視性が決まります。前に示した `my_buckets` 変数のスコープはファイルレベルのスコープなので、`example_bucket.guard` ルールファイルに記述したルール/ルール節から `my_buckets` が見えるはずです。詳細については、[AWS CloudFormation Guard ルールにおける変数の割り当てと参照](https://docs.aws.amazon.com/cfn-guard/latest/ug/variables.html) を参照してください。]{type="info"} +::alert[Guard は *file*、*rule*、*block* レベルで変数スコープをサポートしています。特定のスコープ内の変数の具体的な配置によって、ガードルールを含むファイルでの変数の可視性が決まります。前に示した `my_buckets` 変数のスコープはファイルレベルのスコープなので、`example_bucket.guard` ルールファイルに記述したルール / ルール節から `my_buckets` が見えるはずです。詳細については、[AWS CloudFormation Guard ルールにおける変数の割り当てと参照](https://docs.aws.amazon.com/ja_jp/cfn-guard/latest/ug/variables.html) をご参照ください。]{type="info"} おめでとうございます! テンプレート内の特定のタイプのリソースに一致するフィルターを作成し、ファイルレベルでスコープした変数も再利用しました。 @@ -169,7 +169,7 @@ cfn-guard validate -d example_bucket.yaml -r example_bucket.guard このセクションでは、ルール節を別々のルールに分解して、モジュール化して再利用できるようにします。**シンプルでモジュール化されたガードルールを作成すると、再利用の機会が得られるだけでなく、データを検証したときに失敗したルールを特定したり、必要に応じてルールをトラブルシューティングしたりするのが簡単になります。** -前に示したルール節の例を思い出してください。1 つの節では、バケットに設定したサーバー側の暗号化設定を検証し、もう 1 つの節ではバケットのバージョニングを有効にしたことを検証しました。このロジックを 2 つの [名前付きルール](https://docs.aws.amazon.com/cfn-guard/latest/ug/named-rule-block-composition.html) に書き換えてみましょう。これらは名前を割り当てたルールです。 +前に示したルール節の例を思い出してください。1 つの節では、バケットに設定したサーバー側の暗号化設定を検証し、もう 1 つの節ではバケットのバージョニング有効化設定を検証しました。このロジックを 2 つの [名前付きルール](https://docs.aws.amazon.com/ja_jp/cfn-guard/latest/ug/named-rule-block-composition.html) に書き換えてみましょう。これらは名前を割り当てたルールです。 `rule validate_bucket_sse_example` と `validate_bucket_versioning_example` の 2 つの名前付きルールを作成します。各ルール宣言ステートメントでは、入力データに選択ターゲット (この場合は `AWS::S3::Bucket` リソース) が存在する場合にのみ入力データに対して指定されたルールを実行することを目的として、`when` キーワードを使用します。 @@ -216,9 +216,9 @@ Rule [example_bucket.guard/validate_bucket_versioning_example] is compliant for -- ::: -::alert[入力データにターゲットの選択が含まれていない場合 (前の例で、テンプレートに Amazon S3 バケットを記述しなかった場合): 前述の (`when %my_buckets !empty`) のように `when` キーワードを使用する場合、ルールの評価はスキップされ、結果のGuard出力で`SKIP`とマークされます。もし、代わりに `when` キーワードと `%my_buckets !empty` の部分を省略すると、ルールは取得エラーにより失敗します。節、クエリ、演算子の詳細については、[AWS CloudFormation Guard ルールの作成](https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html)を参照してください。]{type="info"} +::alert[入力データにターゲットの選択が含まれていない場合 (前の例で、テンプレートに Amazon S3 バケットを記述しなかった場合): 前述の (`when %my_buckets !empty`) のように `when` キーワードを使用する場合、ルールの評価はスキップされ、結果の Guard 出力で `SKIP` とマークされます。もし、代わりに `when` キーワードと `%my_buckets !empty` の部分を省略すると、ルールは取得エラーにより失敗します。節、クエリ、演算子の詳細については、[AWS CloudFormation Guard ルールの作成](https://docs.aws.amazon.com/ja_jp/cfn-guard/latest/ug/writing-rules.html)をご参照ください。]{type="info"} -おめでとうございます! 最初のルール節を2つの別々の名前付きルールに分離したので、モジュール性と再利用性が優先されます。 また、必要に応じてコードを書いたり、使用したり、トラブルシューティングしたりするための小規模のコードの例も用意しました。 +おめでとうございます! 最初のルール節を 2 つの別々の名前付きルールに分離したので、モジュール性と再利用性が優先されます。 また、必要に応じてコードを書いたり、使用したり、トラブルシューティングしたりするための小規模のコードの例も用意しました。 #### ルールの相互関係 @@ -256,7 +256,7 @@ example_bucket.guard/correlation_example PASS #### 初めてのガードルールテストの記述 -Guardでは、ルールのテストを作成して、ルールが期待どおりに機能することを検証できます。この側面は、ワークフローで [テスト駆動開発](https://en.wikipedia.org/wiki/Test-driven_development) (TDD) のプラクティスを活用する機会も開きます。最初にルールのテストを作成することから始め、次にルールのテストを作成して実行します。 +Guard では、ルールのテストを作成して、ルールが期待どおりに機能することを検証できます。この側面は、ワークフローで [テスト駆動開発](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA) (TDD) のプラクティスを活用する機会も開きます。最初にルールのテストを作成することから始め、次にルールのテストを作成して実行します。 さあ、始めましょう! お好みのテキストエディタで `example_bucket_tests.yaml` ファイルを開き、以前に使用した名前付きルールのテストを含む次の内容を追加します。 @@ -287,10 +287,10 @@ Guardでは、ルールのテストを作成して、ルールが期待どおり ``` 先ほど示したテスト内容の例を見ると、テストには 2 つの `input` セクションがあり、この例では各テストケースに 1 つずつあることがわかります。 -* 最初のテストケースでは、`validate_bucket_sse_example` ルール検証のサーバー側の暗号化検証ロジックが、期待されるテスト入力が提供されたときに合格することをテストします。この例では、`bucketEncryption` の下の `SSEAlgorithm` プロパティに `AES256`を使用しています。 -* 2 つ目のテストケースでは、`VersioningConfiguration`の`Status` に、(`Enabled`ではなく) `Suspended`を提供すると、`validate_bucket_versioning_example` ルールの検証が失敗することが予想されます。 +* 最初のテストケースでは、`validate_bucket_sse_example` ルール検証のサーバー側の暗号化検証ロジックが、期待されるテスト入力が提供されたときに合格することをテストします。この例では、`bucketEncryption` の下の `SSEAlgorithm` プロパティに `AES256` を使用しています。 +* 2 つ目のテストケースでは、`VersioningConfiguration` の `Status` に、(`Enabled` ではなく) `Suspended` を提供すると、`validate_bucket_versioning_example` ルールの検証が失敗することが予想されます。 -テストを実行しましょう! `test` Guard サブコマンドを使用してテストファイルを指定し、その後に`-t` (または `—test-data`) を使用してテストファイルを指定し、`-r` (または `—rules-file`) を使用してテスト対象のルールを含むファイルを指定します。 +テストを実行しましょう! `test` Guard サブコマンドを使用してテストファイルを指定し、その後に `-t` (または `—test-data`) を使用してテストファイルを指定し、`-r` (または `—rules-file`) を使用してテスト対象のルールを含むファイルを指定します。 :::code{language=shell showLineNumbers=false showCopyAction=true} cfn-guard test -t example_bucket_tests.yaml -r example_bucket.guard @@ -317,26 +317,26 @@ Test Case #2 ### チャレンジ -この例では、[Amazon S3 バケット](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html) の下に [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html#aws-resource-s3-bucket-properties) をすべて配置するように設定します。`PublicAccessBlockConfiguration` を `true` (Boolean) に設定します。 +[Amazon S3 バケット](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html) の `PublicAccessBlockConfiguration` の全ての[プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties) を `true` (Boolean) に設定します。 タスクは以下のとおりです。 -1. `example_bucket_tests.yaml` ユニットテストファイルの内容に、`true` に設定されたすべての `publicAccessBlockConfiguration` プロパティを含むテスト入力データを提供するときに、これから作成する `validate_bucket_public_access_block_example` という新しいルールが合格することを検証するための新しい `input` セクションを追加します。 +1. `example_bucket_tests.yaml` ユニットテストファイルの内容に、`true` に設定されたすべての `publicAccessBlockConfiguration` プロパティを含むテスト入力データを提供するときに、これから作成する `validate_bucket_public_access_block_example` という新しいルールを検証するための新しい `input` セクションを追加します。 2. `example_bucket.guard` ファイルに `validate_bucket_public_access_block_example` ルールを実装します。ルールに記述する各節の後に、`PublicAccessBlockConfiguration` プロパティごとにカスタムメッセージを追加します。 -3. テストを実行するには、`test` サブコマンドでガードを実行します。ユニットテストの出力に Test Case #3 セクションがあり、新しいルールのユニットテストが成功したことを示す `validate_bucket_public_access_block_example: Expected = PASS, Evaluated = PASS` のような行があるはずです。 +3. テストを実行するには、`test` サブコマンドで Guard を実行します。ユニットテストの出力に Test Case #3 セクションがあり、新しいルールのユニットテストが成功したことを示す `validate_bucket_public_access_block_example: Expected = PASS, Evaluated = PASS` のような行があるはずです。 3. `example_bucket.yaml` テンプレートを更新し、関連する `PublicAccessBlockConfiguration` 設定を追加します。 -4. `validate` サブコマンドを使用してガードを実行し、`example_bucket.yaml` ファイルの内容を、`example_bucket.guard` ファイルに記述したルールと照らし合わせて検証します。結果の出力には、新しいルールに対する検証が成功したことを示す `example_bucket.guard/validate_bucket_public_access_block_example PASS` のような行が表示されるはずです。 +4. `validate` サブコマンドを使用して Guard を実行し、`example_bucket.yaml` ファイルの内容を、`example_bucket.guard` ファイルに記述したルールと照らし合わせて検証します。結果の出力には、新しいルールに対する検証が成功したことを示す `example_bucket.guard/validate_bucket_public_access_block_example PASS` のような文字列が表示されるはずです。 :::expand{header= "ヒントが必要ですか?"} -* `PublicAccessBlockConfiguration` プロパティドキュメント [ページ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html) に移動して、その下にあるプロパティの名前を調べます。 -* `versioningConfiguration.Status` 節についても、同じルール構造に従います。`PublicAccessBlockConfiguration` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html) のそれぞれについて記述するルール節については、文字列の代わりに ブール値 `true` を利用します。 +* `PublicAccessBlockConfiguration` プロパティドキュメント [ページ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html) に移動して、その下にあるプロパティの名前を調べます。 +* `versioningConfiguration.Status` 節についても、同じルール構造に従います。`PublicAccessBlockConfiguration` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html) のそれぞれについて記述するルール節については、文字列の代わりに ブール値 `true` を利用します。 ::: -::::expand{header= "解決策を見たいですか?"} +::::expand{header= "解決策を確認しますか?"} 注:次に示す内容は、`code/solutions/policy-as-code-with-guard` ディレクトリにある関連ファイルにもあります。 -* この内容を `example_bucket_tests.yaml` ユニットテストファイルに追加します。 +* 下記の内容を `example_bucket_tests.yaml` ユニットテストファイルに追加します。 ```yaml - input: @@ -355,7 +355,7 @@ Test Case #2 ``` -* この内容を `example_bucket.guard` ファイルに追加します。 +* 下記の内容を `example_bucket.guard` ファイルに追加します。 ```json rule validate_bucket_public_access_block_example when %my_buckets !empty { @@ -376,7 +376,7 @@ rule validate_bucket_public_access_block_example when %my_buckets !empty { ``` -* ユニットテストを実行し、合格することを確認します。 +* ユニットテストを実行し、検証に合格することを確認します。 :::code{language=shell showLineNumbers=false showCopyAction=true} cfn-guard test -t example_bucket_tests.yaml -r example_bucket.guard @@ -405,4 +405,4 @@ cfn-guard validate -d example_bucket.yaml -r example_bucket.guard --- ### まとめ -これで、ガードルールの作成とテストの基礎がわかりました! Guard の詳細については、[ドキュメント](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html) を参照してください。また、よくある質問や例を含むコンテンツ [Guard リポジトリ](https://github.com/aws-cloudformation/cloudformation-guard)もご参照ください。 +ガードルールの作成とテストの基礎を理解することができました! Guard の詳細については、[ドキュメント](https://docs.aws.amazon.com/ja_jp/cfn-guard/latest/ug/what-is-guard.html) をご参照ください。また、よくある質問や例を含むコンテンツ [Guard リポジトリ](https://github.com/aws-cloudformation/cloudformation-guard)もご参照ください。 diff --git a/content/intermediate/templates/resource-dependencies/index.ja.md b/content/intermediate/templates/resource-dependencies/index.ja.md index 4d5282104..a5bcdf7ef 100644 --- a/content/intermediate/templates/resource-dependencies/index.ja.md +++ b/content/intermediate/templates/resource-dependencies/index.ja.md @@ -5,18 +5,18 @@ weight: 200 ### 概要 -[AWS CloudFormation](https://aws.amazon.com/cloudformation/)を使用して、テンプレートに記述したリソースをプログラム的にプロビジョニングします。あるリソースが1つ以上のリソースに依存する場合があります。例えば、[Amazon Elastic Compute Cloud](https://aws.amazon.com/ec2/) (Amazon EC2)インスタンスは、Amazon EC2インスタンスに使用するセキュリティグループによって異なります。EC2がセキュリティグループを参照するように両方のリソースを記述します。これにより、CloudFormationスタックが最初にセキュリティグループが作成され、次に Amazon EC2 インスタンスが作成されます。 +[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/) を使用して、テンプレートに記述したリソースをプログラム的にプロビジョニングする際、あるリソースが 1 つ以上のリソースに依存する場合があります。例えば、[Amazon Elastic Compute Cloud](https://aws.amazon.com/jp/ec2/) (Amazon EC2) インスタンスは、Amazon EC2 インスタンスに使用するセキュリティグループに依存します。CloudFormation スタックにおいて、EC2 がセキュリティグループを参照するように記述することで、最初にセキュリティグループが作成され、次に Amazon EC2 インスタンスが作成されます。 -テンプレートで定義したリソース間に依存関係がない場合、CloudFormation はすべてのリソースの作成を並行して開始します。リソースの作成順序を定義したい、もしくは[必須](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html#gatewayattachment)である場合があります。このような場合、CloudFormationは一部のリソースを他のリソースよりも先に作成します。 +テンプレートで定義したリソース間に依存関係がない場合、CloudFormation はすべてのリソースの作成を並行して開始します。リソースの作成順序を定義、もしくは、[必須](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html#gatewayattachment)である場合、CloudFormation は、一部のリソースを他のリソースよりも先に作成します。 -このラボでは、`DependsOn` [属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)を使用してリソースの作成順序を明示的に定義する方法を学びます。また、`Ref`と`Fn::GetAtt` [組み込み関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)を使用して、依存関係が確立されている場合に、CloudFormationに作成順序を処理させる方法も学びます。 +このラボでは、`DependsOn` [属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)を使用して、リソースの作成順序を明示的に定義する方法を学びます。また、`Ref` と `Fn::GetAtt` [組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)を使用して、依存関係が確立されている場合に、CloudFormation に作成順序を処理させる方法も学びます。 ### 対象トピック このラボを修了すると、次のことができるようになります。 -* `dependsOn` [リソース属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)の使い方を理解して、リソースの作成順序を明示的に定義します。 -* `Ref`と`Fn::GetAtt` [組み込み関数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)を使用して、リソース間の依存関係を作成します。 +* `DependsOn` [リソース属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)の使い方を理解して、リソースの作成順序を明示的に定義 +* `Ref` と `Fn::GetAtt` [組み込み関数](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)を使用して、リソース間の依存関係を作成 ### ラボを開始 @@ -24,21 +24,21 @@ weight: 200 * `code/workspace/resource-dependencies` ディレクトリに移動します。 * `resource-dependencies-without-dependson.yaml` ファイルを開きます。 -* このラボの手順に従ってテンプレートの内容を更新します。 +* ラボの手順に従ってテンプレートの内容を更新します。 -ラボのこの部分では、次のことを行います。 +ラボ 1 では、次のことを学習します。 -* 依存関係が定義されていない場合に CloudFormation がリソースの作成順序をどのように処理するのかを学びます。 -* リソースの作成順序を明示的に定義する方法を学びます。 +* 依存関係が定義されていない場合に CloudFormation のリソース作成順序の処理 +* リソースの作成順序を明示的に定義する方法 -次に、リソース間に依存関係がない場合に、CloudFormationがリソースの作成順序をどのように処理するかを見てみましょう。 +リソース間に依存関係がない場合に、CloudFormation がリソースの作成順序をどのように処理するかを見てみましょう。 -次に示すテンプレートの抜粋にある 2 つのリソースに注目してください。1つは[Amazon Simple Storage Service](https://aws.amazon.com/s3/)(Amazon S3) [Buket](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html)、もう1つは[Amazon Simple Notification Service](https://aws.amazon.com/sns/)(Amazon SNS) [Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html)です。両方のリソースには、相互に依存関係が定義されていません。 +次に示すテンプレートの抜粋にある 2 つのリソースに注目してください。1 つは [Amazon Simple Storage Service](https://aws.amazon.com/jp/s3/) (Amazon S3) [Buket](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html)、もう1つは [Amazon Simple Notification Service](https://aws.amazon.com/jp/sns/) (Amazon SNS) [Topic](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html) です。両方のリソースには、相互に依存関係が定義されていません。 -::alert[次の例には、Amazon S3バケットのための `BucketName` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties)とAmazon SNSトピックのための `TopicName` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-properties)は含まれていません。どちらの場合も、CloudFormationは指定されたリソースに一意の名前を生成します。]{type="info"} +::alert[次の例には、Amazon S3バケットのための `BucketName` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties)とAmazon SNSトピックのための `TopicName` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-properties)は含まれていません。どちらの場合も、CloudFormation は指定されたリソースに一意の名前を生成します。]{type="info"} -`resource-dependencies-without-dependson.yaml` ファイルに、以下のコンテンツをコピーし、追加します。次に、スタックを作成し、スタックイベントを確認してリソースが作成される順序を確認します。 +`resource-dependencies-without-dependson.yaml` ファイルに、以下のコンテンツをコピーし追加します。次に、スタックを作成し、スタックイベントを確認してリソースが作成される順序を確認します。 ```yaml Resources: @@ -57,13 +57,13 @@ Resources: Value: Resource-dependencies-workshop ``` -AWS CloudFormationコンソールにて、`resource-dependencies-without-dependson.yaml` を使用し、[スタックを作成](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)します。 +AWS CloudFormation コンソールにて、`resource-dependencies-without-dependson.yaml` を使用し、[スタックを作成](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)します。 -1. [AWS CloudFormationコンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 +1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 2. **スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 -3. **テンプレート準備完了**オプションを選択します。**テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。`resource-dependencies-without-dependson.yaml` テンプレートをアップロードし、**次へ**を選択します。 -4. スタック名を入力します。例えば、`resource-dependencies-lab`と入力します。準備ができたら、**次へ**をクリックします。 +3. **テンプレート準備完了**オプションを選択します。**テンプレートの指定**セクションで、**テンプレートファイルのアップロード**を選択します。`resource-dependencies-without-dependson.yaml` テンプレートをアップロードし、**次へ**をクリックします。 +4. スタック名を入力します。例えば、`resource-dependencies-lab` と入力します。準備ができたら、**次へ**をクリックします。 5. **スタックオプションの設定**ページはデフォルト値のまま、ページの一番下までスクロールして**次へ**をクリックします。 6. **レビュー**ページを一番下までスクロールして**送信**をクリックします。 @@ -74,11 +74,11 @@ AWS CloudFormationコンソールにて、`resource-dependencies-without-depends スタックイベントを見ると、`SNSTopic` リソースと `S3Bucket` リソースの作成が同時に開始されたことがわかります。2つのリソース間には依存関係がないため、CloudFormation は両方のリソースの作成を並行して開始しました。 -ここで、最初に Amazon S3バケットを作成し、バケットが正常に作成されて初めてAmazon SNSトピックの作成を開始するシナリオの例を考えてみましょう。ここで、`DependsOn` 属性の使用が役立ちます。`DependsOn` を使用して `SNStopic` リソースの依存関係を明示的に定義し、`DependsOn` 属性の値としてAmazon S3バケットリソースの論理 ID (例では、`S3Bucket`) を指定します。) を使用します。その際、CloudFormationはS3バケットの作成が完了するのを待ってから、トピックの作成を開始します。見てみましょう! +ここで、最初に Amazon S3 バケットを作成し、バケットが正常に作成されて初めて Amazon SNS トピックの作成を開始するシナリオを考えてみましょう。シナリオを実現するために、`DependsOn` 属性の使用が役立ちます。`DependsOn` を使用して `SNStopic` リソースの依存関係を明示的に定義し、`DependsOn` 属性の値として Amazon S3 バケットリソースの論理 ID (例では、`S3Bucket` を指定) を使用します。`DependsOn` を利用すると、CloudFormation は S3 バケットの作成が完了するのを待ってから、トピックの作成を開始します。それでは、見てみましょう! * `code/workspace/resource-dependencies` ディレクトリにいることを確認します。 * `resource-dependencies-with-dependson.yaml` ファイルを開きます。 -* このラボの手順に従ってテンプレートの内容を更新します。 +* ラボの手順に従ってテンプレートの内容を更新します。 次に示すテンプレートをコピーして、`resource-dependencies-with-dependson.yaml` ファイルに貼り付けます。次のステップでは、スタックを作成してスタックイベントを確認します。 @@ -101,30 +101,30 @@ Resources: ``` -上記と同じ手順に従って、`resource-dependencies-with-dependson.yaml` テンプレートファイルを使用して新しいスタックを作成します。その際、別のスタック名 (例: `resource-dependencies-lab-dependson`)を指定し、スタックを作成します。 +上記と同じ手順に従って、`resource-dependencies-with-dependson.yaml` テンプレートファイルを使用して新しいスタックを作成します。その際、別のスタック名 (例: `resource-dependencies-lab-dependson`) を指定し、スタックを作成します。 -今回は、スタックイベントが違って見えるはずです。 +前回とは、スタックイベントが違って見えるはずです。 ![resource-dependencies-lab-dependson.png](/static/intermediate/templates/resource-dependencies/resource-dependencies-lab-dependson.ja.png) -次に、新しいスタックのスタックイベントを確認しましょう。テンプレートで説明されているAmazon SNSトピックに `DependsOn` 属性を追加し、その属性の値としてAmazon S3 バケットの論理IDを指定しました。その結果、CloudFormationは、最初に `S3Bucket` リソースを作成し、次に `SNSTopic` リソースを作成しました。スタックを削除する場合、最初に作成されたリソースが最後に削除されることに注意してください。 +次に、新しいスタックのスタックイベントを確認しましょう。テンプレートで説明されている Amazon SNS トピックに `DependsOn` 属性を追加し、その属性の値として Amazon S3 バケットの論理 ID を指定しました。その結果、CloudFormation は、最初に `S3Bucket` リソースを作成し、次に `SNSTopic` リソースを作成しました。スタックを削除する場合、最初に作成されたリソースが最後に削除されることに注目してください。 -::alert[`DependsOn` 属性には文字列または文字列のリストを指定できます。 詳細については、[DependsOn 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)を参照してください。]{type="info"} +::alert[`DependsOn` 属性には文字列または文字列のリストを指定できます。 詳細については、[DependsOn 属性](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)を参照してください。]{type="info"} おめでとうございます! これで、`DependsOn` 属性を使用してリソースの作成順序を明示的に定義する方法を学習しました。 #### ラボ 2 -このラボでは、別のリソースの戻り値を参照するリソースプロパティを記述するときに、CloudFormation がリソースの依存関係をどのように処理するかを学びます。リソースの戻り値は、ユースケースに応じて `Ref` や `Fn::GetAtt` などの組み込み関数を使用して参照します。例えば、Amazon SNS [Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-return-values)とAmazon S3 [Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-return-values)で使用可能な戻り値を確認できます。 +このラボでは、別のリソースの戻り値を参照するリソースプロパティを記述するときに、CloudFormation がリソースの依存関係をどのように処理するかを学びます。リソースの戻り値は、ユースケースに応じて `Ref` や `Fn::GetAtt` などの組み込み関数を使用して参照します。例えば、Amazon SNS [Topic](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-return-values) と Amazon S3 [Bucket](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-return-values) で使用可能な戻り値を確認できます。 スタックを作成して、実際のリソース作成順序を見てみましょう。 * `code/workspace/resource-dependencies` ディレクトリにいることを確認します。 * `resource-dependencies-with-intrinsic-functions.yaml` ファイルを開きます。 -* このラボの手順に従ってテンプレートの内容を更新します。 +* ラボの手順に従ってテンプレートの内容を更新します。 -`resource-dependencies-with-intrinsic-functions.yaml`ファイルの横に表示されているサンプルテンプレートをコピーして追加します。 +`resource-dependencies-with-intrinsic-functions.yaml` ファイルに、サンプルテンプレートをコピーして追加します。 ```yaml Parameters: @@ -166,21 +166,21 @@ Resources: ``` -テンプレートに貼り付けたテンプレートスニペットには、Amazon SNS [Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html)、Amazon SNS [Topic Subscription](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic-subscription.html)、Amazon EC2 [SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)、[SecurityGroup Ingress](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule-1.html)の4つのリソースがあります。次の点に注意してください。 +テンプレートに貼り付けたテンプレートスニペットには、Amazon SNS [Topic](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html)、Amazon SNS [Topic Subscription](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-sns-topic-subscription.html)、Amazon EC2 [SecurityGroup](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html)、[SecurityGroup Ingress](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-rule-1.html) の 4 つのリソースがあります。次の点にご注目ください。 -* Topicリソースの論理ID である`SNSTopic`は、`SNSTopicSubscription` リソースの `TopicArn` プロパティの `Ref` で参照されます。`TopicArn` プロパティには、サブスクライブするTopicの[Amazon Resource Name](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)(ARN)が必要です。`AWS::SNS::Topic` リソースタイプは、`Ref` 組み込み関数を使用するときにTopicのARNを返します。詳細については、Amazon SNS Topic [戻り値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-return-values)を参照してください。つまり、CloudFormationはSNSTopicSubscription の作成を開始する前に `SNSTopicSubscription` の作成が完了するのを待ちます。 -* セキュリティグループリソース `SecurityGroup` の論理 ID は、`SecurityGroupIngress` リソースの `Fn::GetAtt` で参照されます。ここでの目的は、`SecurityGroupIngress`リソースの `GroupId` プロパティに `SecurityGroup` リソースのIDを指定することです。`AWS::EC2::SecurityGroup` リソースタイプは、`Fn::GetAtt` 組み込み関数を使用して `GroupID` 属性を `Fn::GetAtt` に渡すと、セキュリティグループのIDを返します。代わりに `Ref` 関数はリソースIDを返すか、EC2-ClassicやデフォルトVPCの場合はリソース名を返します。詳細については、[EC2 セキュリティグループの戻り値](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#aws-properties-ec2-security-group-return-values)を参照してください。 -* `Security Group` リソースが `CREATE_COMPLETE` ステータスになると、`SecurityGroupIngress` の作成が開始されます。同様に、`SNSTopicSubscription` リソースの作成が開始されます。 -* `SNSTopic` と `SecurityGroup` リソースの間には依存関係がないことに注意してください。つまり、CloudFormationはこれら両方のリソースの作成を並行して開始します。 +* Topic リソースの論理 ID である `SNSTopic` は、`SNSTopicSubscription` リソースの `TopicArn` プロパティの `Ref` で参照されます。`TopicArn` プロパティには、サブスクライブする Topic の [Amazon Resource Name](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html) (ARN) が必要です。`AWS::SNS::Topic` リソースタイプは、`Ref` 組み込み関数を使用するときに Topic の ARN を返します。詳細については、Amazon SNS Topic [戻り値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topic.html#aws-resource-sns-topic-return-values)をご参照ください。つまり、CloudFormation は SNSTopic の作成を開始する前に `SNSTopicSubscription` の作成が完了するのを待ちます。 +* セキュリティグループリソース `SecurityGroup` の論理 ID は、`SecurityGroupIngress` リソースの `Fn::GetAtt` で参照されます。ここでの目的は、`SecurityGroupIngress` リソースの `GroupId` プロパティに `SecurityGroup` リソースの ID を指定することです。`AWS::EC2::SecurityGroup` リソースタイプは、`Fn::GetAtt` 組み込み関数を使用して `GroupID` 属性を `Fn::GetAtt` に渡すと、セキュリティグループの ID を返します。代わりに `Ref` 関数はリソース ID を返すか、EC2-Classic やデフォルト VPC の場合はリソース名を返します。詳細については、[EC2 セキュリティグループの戻り値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#aws-properties-ec2-security-group-return-values)をご参照ください。 +* `SecurityGroup` リソースが `CREATE_COMPLETE` ステータスになると、`SecurityGroupIngress` の作成が開始されます。同様に、`SNSTopicSubscription` リソースの作成が開始されます。 +* `SNSTopic` と `SecurityGroup` リソースの間には依存関係がないことにご注目ください。つまり、CloudFormation は両方のリソースの作成を並行して開始します。 -スタックを作成して、上記の動作を確認してみましょう。AWS CloudFormationコンソールにて、`resource-dependency-with-intrinsic-functions.yaml` を使用し、[スタックを作成](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)します。 +スタックを作成して、上記の動作を確認してみましょう。AWS CloudFormation コンソールにて、`resource-dependency-with-intrinsic-functions.yaml` を使用し、[スタックを作成](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)します。 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 -2. **スタックの作成**、**新しいリソースを使用 (標準)** を選択します。 -3. **テンプレート準備完了**オプションを選択します。**テンプレートを指定**セクションで、**テンプレートファイルのアップロード**を選択します。`resource-dependencies-with-intrinsic-functions.yaml`テンプレートをアップロードし、**次へ**をクリックします。 -4. スタック名を入力します。例えば、`resource-dependencies-lab-ref-getatt`と入力します。準備ができたら、**次へ**をクリックします。 -5. **パラメータ**セクションで、Amazon SNSトピックサブスクリプションのEメールアドレスを入力します。準備ができたら、**次へ**をクリックします。 +2. **スタックの作成**、**新しいリソースを使用 (標準)**を選択します。 +3. **テンプレート準備完了**オプションを選択します。**テンプレートを指定**セクションで、**テンプレートファイルのアップロード**を選択します。`resource-dependencies-with-intrinsic-functions.yaml` テンプレートをアップロードし、**次へ**をクリックします。 +4. スタック名を入力します。例えば、`resource-dependencies-lab-ref-getatt` と入力します。準備ができたら、**次へ**をクリックします。 +5. **パラメータ**セクションで、Amazon SNS トピックサブスクリプションのメールアドレスを入力します。準備ができたら、**次へ**をクリックします。 6. **スタックオプションの設定**ページはデフォルト値のまま、ページの一番下までスクロールして**次へ**をクリックします。 7. **レビュー**ページを一番下までスクロールして**送信**をクリックします。 @@ -189,34 +189,34 @@ Resources: ![resource-dependencies-lab-ref-getatt.png](/static/intermediate/templates/resource-dependencies/resource-dependencies-lab-ref-getatt.ja.png) -`resource-dependencies-lab-ref-getatt` スタックのスタックイベントを確認しましょう。`SNSTopic` リソースと `SecurityGroup` リソースの作成は、両方のリソースには相互に依存関係がないことから、並行して開始されたことに注意してください。また、`SecurityGroupIngress` リソースの作成は `SecurityGroup` リソースが `CREATE_COMPLETE` ステータスになった後にのみ開始され、`SNSTopicSubscription` の作成は、`SNSTopic` リソースが正常に作成された後に開始されたことに注意してください。 +`resource-dependencies-lab-ref-getatt` スタックのスタックイベントを確認しましょう。`SNSTopic` リソースと `SecurityGroup` リソースの作成は、両方のリソースには相互に依存関係がないことから、並行して開始されます。また、`SecurityGroupIngress` リソースの作成は `SecurityGroup` リソースが `CREATE_COMPLETE` ステータスになった後にのみ開始され、`SNSTopicSubscription` の作成は、`SNSTopic` リソースが正常に作成された後に開始されます。 -スタックを削除すると、CloudFormation は作成順序が逆になります。この場合、`SNSTopicSubscription` と `SecurityGroupIngress` リソースが最初に削除され、続いて`SecurityGroup` と `SNSTopic` が削除されます。 +スタックを削除すると、CloudFormation は作成順序が逆になります。この場合、`SNSTopicSubscription` と `SecurityGroupIngress` リソースが最初に削除され、続いて `SecurityGroup` と `SNSTopic` が削除されます。 -::alert[作成した Amazon SNS トピックへのサブスクリプションを確認するためのEメールが、指定したメールアドレスに送信されているはずです。作成したトピックについて受信したサブスクリプション確認メールに記載されているサブスクリプションリンクをたどって、トピックを購読することを選択します。そうしなければ、スタックを削除してもサブスクリプションは保留状態のままになり、削除することはできません。Amazon SNSは未確認のサブスクリプションを3日後に自動削除します。詳細については、[Amazon SNS サブスクリプションおよびトピックを削除する](https://docs.aws.amazon.com/sns/latest/dg/sns-delete-subscription-topic.html)を参照してください。]{type="info"} +::alert[作成した Amazon SNS トピックへのサブスクリプションを確認するための E メールが、指定したメールアドレスに送信されているはずです。作成したトピックについて受信したサブスクリプション確認メールに記載されているサブスクリプションリンクをたどって、トピックを購読します。購読しなかった場合、スタックを削除してもサブスクリプションは保留状態のままになり、削除することはできません。Amazon SNS は未確認のサブスクリプションを 3 日後に自動削除します。詳細については、[Amazon SNS サブスクリプションおよびトピックを削除する](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-delete-subscription-topic.html)をご参照ください。]{type="info"} -おめでとうございます!これで、`Ref` または `Fn::GetAtt` を使用してリソースの依存関係を定義するときに、CloudFormationがリソースの作成順序をどのように処理するかについて学習しました。 +おめでとうございます!これで、`Ref` または `Fn::GetAtt` を使用してリソースの依存関係を定義するときに、CloudFormation がリソースの作成順序をどのように処理するかについて学習しました。 ### チャレンジ -ラボのこのセクションでは、Amazon EC2 [インスタンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#aws-properties-ec2-instance-properties)、[セキュリティグループ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#aws-properties-ec2-security-group-properties)、および、Amazon S3 [バケット](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties)を記述した既存のサンプルテンプレートを更新する作業を行います。Amazon EC2 インスタンスリソースの `SecurityGroups` プロパティでセキュリティグループの論理 ID を参照する必要があります。また、Amazon EC2インスタンスリソースが正常に作成された後にのみ、CloudFormation が Amazon S3 バケットリソースの作成を開始するようにします。上記の要件例に従ってテンプレートを正しく設計すれば、スタックイベントが次のようになることを確認できるはずです。 +このセクションでは、Amazon EC2 [インスタンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#aws-properties-ec2-instance-properties)、[セキュリティグループ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#aws-properties-ec2-security-group-properties)、Amazon S3 [バケット](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html#aws-properties-s3-bucket-properties)を記述した既存のサンプルテンプレートを更新する作業を行います。Amazon EC2 インスタンスリソースの `SecurityGroups` プロパティでセキュリティグループの論理 ID を参照する必要があります。また、Amazon EC2 インスタンスリソースが正常に作成された後にのみ、CloudFormation が Amazon S3 バケットリソースの作成を開始するようにします。上記の要件例に従ってテンプレートを正しく設計すれば、スタックイベントが次のようになることを確認できるはずです。 * CloudFormation はセキュリティグループリソースの作成を開始します。 -* セキュリティグループが `CREATE_COMPLETE` としてマークされると、Amazon EC2インスタンスリソースの作成が開始されます。 -* Amazon EC2インスタンスが正常に作成されると、CloudFormation は Amazon S3 バケットの作成を開始します。 +* セキュリティグループが `CREATE_COMPLETE` としてマークされると、Amazon EC2 インスタンスリソースの作成が開始されます。 +* Amazon EC2 インスタンスが正常に作成されると、CloudFormation は Amazon S3 バケットの作成を開始します。 -はじめに、`code/workspace/resource-dependencies` ディレクトリにある `resource-dependencies-challenge.yaml` テンプレートを、お好みのコードエディターで開きます。上記の要件例に従い、必要に応じてリソースの依存関係を確立します。準備ができたら、`resource-dependencies-challenge` という名前の新しいスタックを作成し、スタックイベントが上記のシリーズと一致することを確認します。 +はじめに、`code/workspace/resource-dependencies` ディレクトリにある `resource-dependencies-challenge.yaml` テンプレートを、お好みのコードエディターで開きます。上記の要件例に従い、必要に応じてリソースの依存関係を確立します。準備ができたら、`resource-dependencies-challenge` という名前の新しいスタックを作成し、スタックイベントが、学んできた一連の流れと一致することを確認します。 :::expand{header="ヒントが必要ですか?"} -* Amazon EC2 インスタンスの `SecurityGroups` [プロパティ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#aws-properties-ec2-security-group-properties)で、セキュリティグループを[参照](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)する方法を教えてください。 -* セキュリティグループを参照するときは、`SecurityGroups` プロパティの値の `Type` が _List of String_ であることにも注意してください。この値をYAML形式でどのように表現しますか? -* リソースの作成は別のリソースに従うべきだと[指定](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)するにはどうすればよいでしょうか。 +* Amazon EC2 インスタンスの `SecurityGroups` [プロパティ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#aws-properties-ec2-security-group-properties)で、セキュリティグループを[参照](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)する方法を確認してください。 +* セキュリティグループを参照するときは、`SecurityGroups` プロパティの値の `Type` が _List of String_ であることにも注意してください。この値を YAML 形式でどのように表現しますか? +* リソースの作成は別のリソースに従うべきだと[指定](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)するにはどうすればよいでしょうか。 ::: -:::expand{header="解決策を見たいですか?"} -* `Ref` 組み込み関数を使用して、セキュリティグループの論理 ID を `SecurityGroups` EC2インスタンスリソースプロパティのリスト項目として参照します。その後、CloudFormationは最初にセキュリティグループが作成されるのを待ってから、Amazon EC2インスタンスの作成を開始する必要があります。 -* Amazon EC2インスタンスリソース定義を次に示すように変更します。 +:::expand{header="解決策を確認しますか?"} +* `Ref` 組み込み関数を使用して、セキュリティグループの論理 ID を `SecurityGroups` EC2 インスタンスリソースプロパティのリスト項目として参照します。その後、CloudFormation は最初にセキュリティグループが作成されるのを待ってから、Amazon EC2 インスタンスの作成を開始する必要があります。 +* Amazon EC2 インスタンスリソース定義を次に示すように変更します。 ```yaml Ec2Instance: @@ -231,8 +231,8 @@ Ec2Instance: Value: Resource-dependencies-workshop ``` -* Amazon EC2インスタンスとAmazon S3バケットリソースの間には依存関係がないため、Amazon S3バケットリソースの `DependsOn` 属性を使用し、Amazon EC2インスタンスの論理 ID を`DependsOn` 属性の値として指定します。 -* 次に示すように、Amazon S3バケットリソースの `DependsOn` 属性を追加します。 +* Amazon EC2 インスタンスとAmazon S3 バケットリソースの間には依存関係がないため、Amazon S3 バケットリソースの `DependsOn` 属性を使用し、Amazon EC2 インスタンスの論理 ID を `DependsOn` 属性の値として指定します。 +* 次に示すように、Amazon S3 バケットリソースの `DependsOn` 属性を追加します。 ```yaml S3Bucket: @@ -254,9 +254,9 @@ S3Bucket: 以下の手順に従って、このラボで作成した[スタックを削除](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)します。 1. [AWS CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)に移動します。 -2. CloudFormationコンソールのスタックページで、`resource-dependencies-lab` スタックを選択します。 +2. CloudFormation コンソールのスタックページで、`resource-dependencies-lab` スタックを選択します。 3. スタックの詳細ペインで、**削除**を選択した後、**スタックの削除**を押して確定します。 -4. 上記の手順を繰り返して、作成した他のスタック `resource-dependencies-lab-dependson`、`resource-dependencies-lab-ref-getatt`、`resource-dependencies-challenge`を削除します。 +4. 上記の手順を繰り返して、作成した他のスタック `resource-dependencies-lab-dependson`、`resource-dependencies-lab-ref-getatt`、`resource-dependencies-challenge` を削除します。 --- ### まとめ