[AWS]CloudFormation ユーザーガイドの読み方

# CloudFormation ユーザーガイドの読み方

## 概要

### 書いている人

AWSを勉強中の人です。

- 18/12/10
    - もうちょっと読みやすくしたいので、時間ができたら手を付けるかもしれません。

### 内容

大雑把にどこに何が書かれているかを、自分が把握するために書いています。
内容の正しさについては保証しないため、公式ドキュメントの参考程度にしてください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html

## CloudFormation 用語

こちらの内容は公式用語集からのコピペです。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/glos-chap.html

### 全般の用語

|Subject|Description|
|:---|:---|
|AWS CloudFormation|関連する AWS リソース を 1 つの単位として一緒に作成および削除する、書き込みまたは変更のテンプレートのサービス。
|スタック| 単一のユニットとして作成および削除する AWS リソース のコレクション。

### テンプレート

|Subject|Description|
|:---|:---|
|テンプレート形式バージョン|AWS CloudFormation テンプレートデザインのバージョン。これにより利用可能な機能が決まります。テンプレートから AWSTemplateFormatVersion セクションを省略すると、AWS CloudFormation は最新の形式バージョンを使用します。
|テンプレートの検証| AWS CloudFormation テンプレートで JSON コードの使用を確認するプロセス。cfn-validate-template コマンドを使用して、任意の AWS CloudFormation テンプレートを検証できます。
|プロパティのルール|プロパティ、マッピング、出力値を宣言する、JSON に適合したマークアップ標準です。

### テンプレートの要素

|Subject|Description|
|:---|:---|
| 説明プロパティ | テンプレートエレメントを文書化するために役立つパラメータ、リソース、リソースプロパティ、マッピング、および出力に追加されるプロパティ。
|擬似パラメータ|事前に定義されており、宣言しなくても AWS CloudFormation テンプレートで利用できる設定。これには、AWS:StackName などがあります。擬似パラメータは、通常のパラメータを使用できる場所であればどこででも使用可能です。
| マッピング | テンプレートに条件パラメータ値を追加する方法。テンプレートの任意指定の [Mappings] セクションでマッピングを指定し、FN::FindInMap 関数を使用して適切な値を取得します。
| リソースプロパティ | スタック に AWS リソース を入れるときに必要になる値。各リソースには、プロパティが関連付けられていることがあります。たとえば、AWS::EC2::Instance リソースには UserData プロパティがあります。AWS CloudFormation テンプレートでは、リソースにプロパティがない場合であっても、リソースでプロパティセクションの宣言が必要です。
| 論理名| リソース、マッピングを、パラメータ、または出力を識別する AWS CloudFormation テンプレート内の大文字小文字の区別がある一意の文字列。テンプレートでは、各パラメータ、リソース、プロパティ、マッピング、および出力が一意の論理名で宣言されている必要があります。Ref 関数を使用してこれらの項目の参照解除を行うときには、論理名を使用します。
|物理名|スタック 作成時に AWS CloudFormation が各 リソース に割り当てたユニークなラベルです。一部の AWS CloudFormation コマンドは、--physical-name パラメータを使用して物理名を値として受け取ります。


### テンプレートの機能

|Subject|Description|
|:---|:---|
| 組み込み関数 | ランタイムまで使用できないプロパティに値を割り当てる AWS CloudFormation テンプレートでの特別な操作。これらの関数は、Fn::Attribute という形式に従います (Fn::GetAtt など)。組み込み関数の引数には、他の組み込み関数のパラメータ、擬似パラメータ、または出力を指定できます。
|NoEcho|テンプレートパラメータの名前と値がデフォルトでレポートされることを防ぐための、AWS CloudFormation パラメータのプロパティです。NoEcho プロパティを宣言すると、レポート内のパラメータ値はcfn-describe-stacks コマンドによってアスタリスクにマスクされる結果となります。
|ロールバック|AWS CloudFormation スタック などのオブジェクトを作成できなかった場合に、以前の状態に戻すこと。失敗に終わった処理に関連付けられている リソース はすべて、ロールバック時に削除されます。AWS CloudFormation では、コマンドラインで --disable-rollback オプションを使用することによってこの処理をオーバーライドできます。



## 本編


### AWS CloudFormation とは

サービスの概要と特徴

- インフラストラクチャ管理を簡略化
- すばやく複製
- 制御や変更の追跡

AWS CloudFormation の概念

- テンプレート = AWS リソースを作成する際の設計図として使用します。たとえば、テンプレートには、インスタンスタイプ、AMI ID、ブロックデバイスマッピング、Amazon EC2 キーペアの名前など、Amazon EC2 インスタンスの情報を記述できます。
- スタック = 関連リソースはスタックと呼ばれる単一のユニットとして管理します。スタックを作成、更新、削除することで、リソースのコレクションを作成、更新、削除します。
- 変更セット = 実行中のリソースに変更を加える必要がある場合は、スタックを更新します。リソースに変更を加える前に、変更案の概要である変更セットを生成できます。変更セットで、変更が実行中のリソース、特に重要なリソースに与える可能性のある影響を、実装前に確認できます。

 AWS CloudFormation の仕組み

- 変更セットを使用したスタックの更新

### セットアップ

サインアップと料金

- CloudFormation は無料サービスです。ただし、スタックに追加する AWS リソースには現在の料金が課金されます。

(省略)アクセスの制御
(省略)API 呼び出しのログ作成

CloudFormation の制限

- テンプレートとスタックを作成する場合に知っておくべき、リソースの量などに関する制限

(省略)CloudFormation エンドポイント
(省略)CloudFormation および VPC エンドポイント


### ご利用開始にあたって


ご利用開始にあたって

- 適切なテンプレートを使用すると、アプリケーションに必要なすべての AWS リソースを迅速にデプロイすることができます。
- 既に用意されているサンプルテンプレートを使用します。

テンプレートの基礎についての学習

- Resources: Hello Bucket
- リソースのプロパティとリソースの同時使用
- 入力パラメーターを使用したユーザー入力の取得
- Mappings を使用した条件値の指定
- 構築された値および出力値


テンプレートの基礎についての学習

- リソースおよびプロパティの宣言
- Ref 関数を使用して他のリソースを参照する方法と、Fn::GetAtt 関数を使用してリソース属性を参照する方法
- パラメーターを使用してスタックの作成時にユーザーが値を指定できるようにする方法と、制約を使用してパラメーター入力を検証する方法
- マッピングを使用して条件値を判定する方法
- Fn::Join 関数を使用して、パラメーター、リソース属性、およびその他の文字列に基づいて値を生成する方法
- 出力値を使用してスタックのリソースに関する情報をキャプチャする方法

発展：すべてのリソースで使用できるオプション属性

- DependsOn 属性: あるリソースに続けて別のリソースを作成する必要があることを指定できます。
- DeletionPolicy 属性: リソースの削除を AWS CloudFormation でどのように処理するかを指定できます。
- Metadata 属性: リソースを含む構造化データを指定できます。
- AWS::CloudFormation::Stack: テンプレート内で別のスタックをリソースとしてネストできます。

ウォークスルー: スタックの更新

スタックの更新

- CloudFormation では、既存のスタックのリソースのプロパティを更新できます。
- テンプレート内の AWS リソースは、その多くが更新に対応しているため、継続的に機能を拡充していくことが可能です。
- 実行中のソフトウェアのバージョン管理と同様に、AWS インフラストラクチャの構成にもバージョン管理システムを使用できることを説明します。

チュートリアル

- 初期スタックの作成
- アプリケーションの更新
- インスタンスタイプのアップデート
- Amazon EC2 インスタンス上の AMI の更新
- インスタンスへのキーペアの追加
- スタックのリソースの変更


### 継続的デリバリー

継続的デリバリーとは

- コードの変更が毎回自動的に構築、テストされ、本稼働環境へのリリースのために準備されるリリースのプラクティスです。
- AWS CloudFormation および AWS CodePipeline では、継続的な配信を使用して、AWS CloudFormation テンプレートへの変更を自動的に構築してテストしてから、本稼働スタックに昇格させることができます。
- AWS CodePipeline には AWS CloudFormation との統合が組み込まれているため、パイプライン内で、スタックの作成、更新、削除など AWS CloudFormation 固有のアクションを指定できます。

ウォークスルー: テストおよび本稼働スタック用のパイプラインを構築する

- チュートリアルの概要
    - スタックにある WordPress サンプルサイト用のパイプラインを構築します。


AWS CloudFormation 設定プロパティのリファレンス

- AWS CodePipeline パイプラインを構築する際、AWS CloudFormation をプロバイダーとする Deploy アクションをパイプラインに追加します。
- その後、パイプラインが起動する AWS CloudFormation アクションと、そのアクションの設定を指定する必要があります。

AWS CloudFormation アーティファクト

- CodePipeline では、パイプラインを実行しながらアーティファクトのタスクを実行します。
- CloudFormation では、スタックテンプレートファイル、テンプレート設定ファイル、または両方をアーティファクトに含めることができます。
- CodePipeline はこれらのアーティファクトを使用して、AWS CloudFormation スタックや変更セットで作業を行います。

AWS CodePipeline パイプラインでのパラメーターオーバーライド関数の使用

- AWS CodePipeline のステージで、AWS CloudFormation アクションにパラメーターオーバーライドを指定できます。
- AWS CloudFormation では、動的な値 (パイプラインが実行されるまで不明な値) を指定できる関数を提供しています。

### スタックの操作

スタックの操作

- スタックを作成、更新、削除することで、リソースのコレクションを作成、更新、削除できます。
- CloudFormation は、すべてのスタックリソースが適切に作成または削除されたことを確認します。
- CloudFormation はスタックリソースを単一ユニットとして扱うため、スタックを作成または削除するにはすべてのリソースが正常に作成または削除される必要があります。

(省略)AWS CloudFormation コンソールの使用
(省略)AWS コマンドラインインターフェイスの使用

AWS CloudFormation スタックの更新

- AWS CloudFormation では、スタックの更新に 2 つの方式を使用できます。直接更新または変更セットの作成と実行です
- スタックを直接更新する場合は、変更を送信すると AWS CloudFormation によって即時にデプロイされます。
- 変更セットを使用すると、AWS CloudFormation によってスタックに加えられる変更を事前に確認し、変更を適用するかどうかを判断できます。意図しない変更が加えられないことを確認したり、複数のオプションを検討する場合は、変更セットを使用します。

(省略)スタックの出力値のエクスポート
(省略)エクスポートされた出力値をインポートするスタックのリスト

ネストされたスタックの操作

- ネストされたスタックは、他のスタックの一部として作成されたスタックです。
- 共通するコンポーネントを他と分類し、専用テンプレートを作成できます。

AWS CloudFormation での Microsoft Windows スタックの操作

- Amazon EC2 Windows Amazon マシンイメージ (AMI) に基づいて Microsoft Windows スタックを作成できます。
- これにより、リモートデスクトップを使用して、スタックにアクセスしたり、スタックを更新および設定したりすることが可能になります。


### テンプレートの使用

テンプレートの使用

- 設定するには、JSON または YAML 形式のテキストファイルである AWS CloudFormation テンプレートを理解する必要があります。
- テンプレートは、AWS CloudFormation スタックでプロビジョニングするリソースについて記述します。
- デザイナー またはテキストエディタを使用して、テンプレートを作成し保存できます。
- 構造についておよびテンプレートの構文については、「テンプレートの分析」を参照してください。
- テンプレートで使用できるリソース、タイプ名、組み込み関数、擬似パラメーターの対応状況については、「テンプレートリファレンス」を参照してください。

(省略)AWS CloudFormation テンプレート形式
(省略)テンプレートの分析
(省略)AWS CloudFormation デザイナー とは
(省略)チュートリアル
(省略)テンプレートスニペット
(省略)カスタムリソース
(省略)AWS CloudFormation テンプレートでの正規表現の使用

CloudFormer を使用したテンプレートの作成

- CloudFormer は、アカウントに既に存在する AWS リソースから AWS CloudFormation テンプレートを作成するテンプレート作成用のベータツールです。
- アカウントで実行中のサポートされている AWS リソースを選択すると、CloudFormer は Amazon S3 バケットにテンプレートを作成します。

### AWS CloudFormation StackSets の操作

StackSets の概念

- StackSets を使用する場合は、スタックセット、スタックインスタンス、スタックを使用します。
- スタックセットでは、1 つの AWS CloudFormation テンプレートを使用して、複数のリージョンの AWS アカウントにスタックを作成できます。
- 各スタックに含まれるリソースはすべて、スタックセットの AWS CloudFormation テンプレートで定義されます。
- スタックセットを作成する際、使用するテンプレートに加え、そのテンプレートで必要なパラメータや機能を指定します。
- スタックインスタンスは、リージョン内のターゲットアカウントのスタックへの参照です。

(省略)前提条件: スタックセットオペレーションのアクセス権限の付与
(省略)AWS CloudFormation StackSets の使用開始
(省略)AWS CloudFormation StackSets のターゲットアカウントを設定する
(省略)ベストプラクティス
(省略)StackSets の制約事項
(省略)AWS CloudFormation StackSets サンプルテンプレート
(省略)AWS CloudFormation StackSets のトラブルシューティング

### テンプレートリファレンス

AWS リソースプロパティタイプのリファレンス

- AWS CloudFormation でサポートされているすべての AWS リソースについてのリファレンス情報が含まれています

リソースプロパティタイプのリファレンス

- AWS CloudFormation でサポートされているリソースのリソース固有のプロパティについて詳しく説明します。

AWS CloudFormation リソース仕様

- AWS CloudFormation がサポートするリソースとプロパティを定義する JSON 形式のテキストファイルです。
- 統合開発環境 (IDE) で AWS CloudFormation テンプレートの自動入力および検証機能を構築できます。
- リソースの可用性はリージョンによって異なります。特定のリージョン内でのリソースの可用性を確認するには、そのリージョンのリソース仕様を参照してください。

リソース属性リファレンス

- 追加の動作や関係を制御するためにリソースに追加できる属性について詳しく説明します。

(省略)組み込み関数リファレンス
(省略)擬似パラメーター参照

CloudFormation ヘルパースクリプトリファレンス

- スタックの一部として作成する Amazon EC2 インスタンスでソフトウェアをインストールしたりサービスを開始したりするために使用できる、次の Python ヘルパースクリプトが用意されています。

### サンプルテンプレート

さまざまな用途のテンプレートの作成方法を示します。
サンプルテンプレートはどれも直接起動して AWS CloudFormation スタックを作成できます。

### トラブルシューティング

CloudFormation に関する一般的な質問については、「AWS CloudFormation のよくある質問」を参照してください。
https://aws.amazon.com/jp/cloudformation/faqs/

トラブルシューティングガイド

- AWS CloudFormation の問題をトラブルシューティングするための一般的な方法について説明します。
- スタックのステータスを表示
- 失敗イベントを探して、そのイベントのステータスの理由を確認します。
- スタックイベントの表示の詳細については、「スタックのデータとリソースの表示」を参照してください。
- EC2 の問題については、cloud-init および cfn のログを参照してください。
- これらのログは、/var/log/ ディレクトリの Amazon EC2 インスタンスに発行されます。
- ログには、AWS CloudFormation がインスタンスをセットアップする際のプロセスとコマンドの出力がキャプチャされます。
- AWS CloudFormation テンプレートの設定により、ログを Amazon CloudWatch に発行させることも可能です。この場合、ログは AWS マネジメントコンソール に表示されるので、Amazon EC2 インスタンスに接続する必要がありません。
    - https://aws.amazon.com/jp/blogs/devops/view-cloudformation-logs-in-the-console/

エラーのトラブルシューティング


- スタックの削除の失敗
- 依存関係のエラー
- リストを渡す際のパラメーター解析エラー
- IAM アクセス権限の不足
- 値が無効またはリソースのプロパティがサポートされていない
- 制限の超過
- ネストされたスタックは UPDATE_COMPLETE_CLEANUP_IN_PROGRESS、UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS または UPDATE_ROLLBACK_IN_PROGRESS 状態にあります。
- 実行する更新がない
- スタックの作成、更新、または削除オペレーションの際、リソースが安定しない
- セキュリティグループが VPC 内に存在しない
- 更新のロールバックの失敗
- 待機条件が Amazon EC2 インスタンスから所定の数のシグナルを受け取らなかった