

# ドリフト検出を使用してスタックとリソースへのアンマネージド型設定変更を検出する
<a name="using-cfn-stack-drift"></a>

CloudFormation を通じてリソースを管理している場合でも、ユーザーは CloudFormation の外部でそれらのリソースを変更できます。ユーザーは、リソースを作成した基盤となるサービスを使用してリソースを直接編集できます。例えば、Amazon EC2 コンソールを使用して、CloudFormation スタックの一部として作成されたサーバーインスタンスを更新できます。一部の変更は偶発的になされますが、時間的制約のある操作上のイベントに対応するために意図的になされる場合もあります。しかし、CloudFormation の外部で行われた変更はスタックの更新または削除オペレーションを複雑にする可能性があります。ドリフト検出を使用して、CloudFormation 管理外で構成変更がされたスタックリソースを識別できます。その後、スタックリソースがスタックテンプレート内の定義と再度同期するように是正措置を行うことができます。たとえば、ドリフトされたリソースがテンプレート定義と一致するように直接更新します。ドリフトを解決することにより、構成の一貫性と正常なスタックオペレーションを確実にします。

**Topics**
+ [ドリフトとは](#what-is-drift)
+ [ドリフト検出ステータスコード](#drift-status-codes)
+ [ドリフトを検出する際の考慮事項](#drift-considerations)
+ [CloudFormation スタック全体のドリフトを検出する](detect-drift-stack.md)
+ [個々のスタックリソースのドリフトを検出](detect-drift-resource.md)
+ [インポートオペレーションでドリフトを解決する](resource-import-resolve-drift.md)

## ドリフトとは
<a name="what-is-drift"></a>

ドリフトの検出により、スタックの実際の構成が、意図した構成と異なっていたり、*ドリフト*していないか確認できます。CloudFormation を使用して、スタック全体、またはスタック内の個々のリソースのドリフトを検出します。リソースの実際のプロパティ値が予期されるプロパティ値と異なる場合、そのリソースはドリフトしたと見なされます。これには、プロパティまたはリソースが削除されたかどうかも含まれます。スタックの 1 つ以上のリソースがドリフトした場合、スタックはドリフトしたと見なされます。

リソースがドリフトしたかどうかを判断するために、CloudFormation はスタックテンプレートとテンプレートパラメータとして指定された値で定義されているように、期待されるリソースプロパティ値を決定します。CloudFormation は、それらの期待値を現在スタックに存在しているリソースプロパティの実際の値と比較します。1 つ以上のリソースのプロパティが削除された場合、またはリソースの値が変更された場合、リソースはドリフトしたと見なされます。

CloudFormation は、ドリフトしたスタック内の各リソースに関する詳細情報を生成します。

CloudFormation は、これらのドリフト検出をサポートしている AWS リソースのドリフトを検出します。ドリフト検出をサポートしないリソースには、ドリフトステータス NOT\_CHECKED が割り当てられます。ドリフト検出をサポートする AWS リソースのリストについては、「[リソースタイプのサポート](resource-import-supported-resources.md)」を参照してください。

さらに、CloudFormation は、*プロビジョニング可能な*プライベートリソースタイプ、つまりプロビジョニングタイプが `FULLY_MUTABLE` または `IMMUTABLE` のいずれかであるドリフト検出をサポートします。プライベートリソースタイプのリソースでドリフト検出を実行するには、アカウントに登録されたリソースタイプのデフォルトバージョンがプロビジョニング可能である必要があります。リソースのプロビジョニングタイプの詳細については、「*AWS CloudFormation API リファレンス*」の [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html) アクションおよび「*AWS CLI コマンドリファレンス*」の [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html) コマンドの `ProvisioningType` パラメータをご覧ください。プライベートリソースの詳細については、「[CloudFormation レジストリによる拡張機能の管理](registry.md)」をご参照ください。

次のステータスでスタックのドリフト検出を実行できます。`CREATE_COMPLETE`、`UPDATE_COMPLETE`、`UPDATE_ROLLBACK_COMPLETE`、および `UPDATE_ROLLBACK_FAILED`。

スタックのドリフトを検出すると、CloudFormation はそのスタックに属するネストされたスタックのドリフトを検出しません。詳細については、「[ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する](using-cfn-nested-stacks.md)」を参照してください。代わりに、ネストしたスタックに対して直接ドリフト検出オペレーションを開始できます。

**注記**  
CloudFormation は、スタックテンプレートを通じて、またはテンプレートパラメータを指定することによって、明示的に設定されたプロパティについてのみドリフトを判断します。これには、リソースプロパティのデフォルト値は含まれません。ドリフトを決定する目的で CloudFormation にリソースプロパティを追跡させるには、デフォルト値に設定している場合でも、プロパティ値を明示的に設定します。CloudFormation はスタックレベルのタグのドリフトも検出します。

## ドリフト検出ステータスコード
<a name="drift-status-codes"></a>

このセクションの表では、ドリフト検出で使用されるさまざまなステータスタイプについて説明しています。
+ [**Drift detection operation status (ドリフト検出オペレーションステータス)**] は、ドリフト動作の現在の状態を示します。
+ **ドリフトステータス** 

  スタックセットの場合、スタックセットに属するスタックインスタンスのドリフトステータスに基づいて、スタックセット全体のドリフトステータスについて説明します。

  スタックインスタンスの場合、関連付けられたスタックのドリフトステータスに基づいて、スタックインスタンスのドリフトステータスについて説明します。

  スタックの場合、これは、そのリソースのドリフトステータスに基づいて、スタック全体のドリフトステータスを表します。
+ [**リソースのドリフトステータス**] は、個々のリソースのドリフトステータスを表します。

次の表は、CloudFormation がスタックドリフト検出オペレーションに割り当てるステータスコードの一覧です。


| ドリフト検知オペレーションステータス | 説明 | 
| --- | --- | 
| `DETECTION_COMPLETE` | スタックドリフト検出オペレーションは、ドリフト検出をサポートするスタック内のすべてのリソースに対して正常に完了しました。 | 
| `DETECTION_FAILED` | スタックドリフト検出オペレーションは、スタック内の少なくとも 1 つのリソースに対して失敗しました。CloudFormation がドリフト検出を正常に完了したリソースで、結果が利用可能になります。 | 
| `DETECTION_IN_PROGRESS` | スタックドリフト検出オペレーションは現在進行中です。 | 

次の表は、CloudFormation がスタックに割り当てるドリフトステータスコードの一覧です。


| ドリフトステータス | 説明 | 
| --- | --- | 
| `DRIFTED` | スタックの場合: スタックは、意図したテンプレート構成とは異なるか、*ドリフト*しています。スタックの 1 つ以上のリソースがドリフトした場合、スタックはドリフトしたと見なされます。<br />スタックインスタンスの場合: スタックインスタンスに関連付けられたスタックがドリフトした場合、スタックインスタンスはドリフトしたと見なされます。<br />スタックセットの場合: 1 つ以上のスタックインスタンスがドリフトした場合、スタックセットはドリフトしたと見なされます。 | 
| `NOT_CHECKED` | CloudFormation では、スタック、スタックセット、またはスタックインスタンスが、予想されるテンプレート構成と異なるかどうかをチェックしません。 | 
| `IN_SYNC` | サポートされている各リソースの現在の構成は、意図したテンプレート構成と一致します。ドリフト検出をサポートするリソースを持たないスタック、スタックセット、またはスタックインスタンスも IN\_SYNC ステータスになります。 | 

次の表は、CloudFormation がスタックリソースに割り当てるドリフトステータスコードの一覧です。


| リソースのドリフトステータス | 説明 | 
| --- | --- | 
| `DELETED` | リソースが削除されたため、リソースは意図したテンプレート構成と異なります。 | 
| `MODIFIED` | リソースは意図したテンプレート構成とは異なります。 | 
| `NOT_CHECKED` | CloudFormation は、リソースが意図したテンプレート構成と異なるかどうかを確認していません。 | 
| `IN_SYNC` | リソースの現在の構成は、意図したテンプレート構成と一致します。 | 

次の表は、CloudFormation が意図したテンプレート構成とは異なるリソースプロパティに割り当てる差分タイプのステータスコードを示しています。


| 差分タイプのプロパティ | 説明 | 
| --- | --- | 
| `ADD` | 配列またはリストのデータ型であるリソースプロパティに値が追加されました。 | 
| `REMOVE` | プロパティは現在のリソース構成から削除されました。 | 
| `NOT_EQUAL` | 現在のプロパティ値は、スタックテンプレートで定義されている予測値とは異なります。 | 

## ドリフトを検出する際の考慮事項
<a name="drift-considerations"></a>

スタックでドリフト検出を正常に実行するには、ユーザーは次のアクセス許可を持っている必要があります。
+ スタックに含まれるドリフト検出をサポートする各リソースに対する読み取り権限です。たとえば、スタックに `AWS::EC2::Instance` リソースが含まれている場合、スタックでドリフト検出を実行するには `ec2:DescribeInstances` アクセス許可が必要です。
+ `cloudformation:DetectStackDrift`
+ `cloudformation:DetectStackResourceDrift`
+ `cloudformation:BatchDescribeTypeConfigurations`

CloudFormation でアクセス許可を設定する方法の詳細については、「[AWS Identity and Access Management で CloudFormation アクセスを制御する](control-access-with-iam.md)」をご参照ください。

特定のエッジケースでは、CloudFormation が正確なドリフト結果を返すことができない場合があります。ドリフト検出結果を正しく解釈するために、これらのエッジケースに注意する必要があります。
+ 場合によっては、プロパティ配列に含まれるオブジェクトが、実際にはリソースを担当する基盤となるサービスからプロパティに提供されたデフォルト値であった場合に、ドリフトとして報告されます。
+ 一部のリソースは、関連するリソースとアタッチメントの関係を持ちます。そのため、リソースは、同一のまたは別のテンプレートで定義された別のリソースのプロパティ値を実際にアタッチまたは削除できます。たとえば、`AWS::EC2::SecurityGroupIngress` および `AWS::EC2::SecurityGroupEgress` リソースを使用して、`AWS::EC2::SecurityGroup` リソースから値をアタッチしたり削除したりできます。このような場合、CloudFormation はドリフト比較を実行する前にアタッチメントのスタックテンプレートを分析します。ただし、CloudFormation はスタック間ではこの分析を実行できないため、接続されているリソースが異なるスタックに存在する場合、正確なドリフト結果を返さない可能性があります。

  ドリフト検出をサポートし、他のリソースからの添付ファイルを許可または要求するリソースには、次のものがあります。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)
+ CloudFormation は、リソースの `KMSKeyId` プロパティに対してドリフト検出を実行しません。AWS KMS キーは複数のエイリアスによって参照される可能性があるため、CloudFormation はこのプロパティに対して常に正確なドリフト結果を保証することはできません。
+ スタックテンプレートで指定できる特定のリソースプロパティがあります。その性質上、CloudFormation は結果として得られるスタックリソースのプロパティと比較できません。したがって、これらのプロパティをドリフト検出結果に含めることはできません。このようなプロパティは、大きく 2 つのカテゴリに分けられます。
  + CloudFormation がスタックテンプレートの初期リソースプロパティ値にマッピングできないプロパティ値です。

    例えば、CloudFormation は Lambda 関数のソースコードを [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) リソースの [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-code.html) プロパティタイプにマッピングできません。そのため CloudFormation はそれをドリフト検出結果に含めることができません。
  + リソースを担当するサービスが返さないプロパティ値です。

    設計上、リソースが属するサービスでは返されることがない特定のプロパティ値があります。これらには、パスワードやその他の機密データなどの、公開されない機密情報が含まれる傾向があります。例えば、IAM サービスは [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) プロパティタイプの `Password` プロパティの値を返すことはないため、CloudFormation はそれをドリフト検出結果に含めることができません。
  + 配列内のオブジェクトは実際にはサービスの既定値である場合があり、手動で追加されたドリフトではありません。
+ 誤検知が発生した場合は、[CloudFormation コンソール] のフィードバックリンクを使用してご意見をご送信いただくか、[AWS re:Post](https://repost.aws/) からご連絡ください。
+ プロパティによっては、等しいが同一ではない入力値を持つことがあります。誤検出を防ぐには、想定した設定が実際の設定と一致していることを確認する必要があります。
  + たとえば、リソースプロパティの予想される設定は 1,024 MB で、同じリソースプロパティの実際の設定は 1 GB になる可能性があります。1,024 MB と 1 GB は同等ですが同一ではありません。

    このリソースプロパティでドリフト検出を実行すると、ドリフトの結果が通知されます。

    この誤検出を回避するには、リソースプロパティの想定される設定を 1,024 MB に変更してから、ドリフト検出を実行します。