メニュー
AWS CloudFormation
ユーザーガイド (API Version 2010-05-15)

スタックのリソースが更新されないようにする

スタックを作成するとき、すべてのリソースですべての更新アクションが許可されます。デフォルトでは、スタック更新アクセス権限を持つユーザーであれば誰でもスタック内のすべてのリソースを更新できます。更新処理中、リソースの中断や完全な置き換えが必要になった場合は、新しい物理 ID やまったく新しいストレージが使用される結果になります。スタックポリシーを使用して、スタックの更新中にスタックのリソースが意図せずに更新または削除されるのを防止できます。スタックポリシーは、指定したリソースに対して実行できる更新アクションを定義する JSON ドキュメントです。

スタックポリシーを設定すると、デフォルトでスタック内のすべてのリソースが保護されます。特定のリソースでの更新を許可するには、スタックポリシーでこれらのリソースに対して Allow ステートメントを明示的に指定します。1 つのスタックに定義できるスタックポリシーは 1 つのみですが、1 つのポリシー内で複数のリソースを保護することができます。スタックポリシーは、スタックを更新しようとするすべての AWS CloudFormation ユーザーに適用されます。異なるスタックポリシーを異なるユーザーに関連付けることはできません。

スタックポリシーは、スタックの更新時のみ適用されます。AWS Identity and Access Management (IAM) ポリシーのようなアクセスコントロールは提供しません。特定のスタックリソースを誤って更新しないように、スタックポリシーはフェイルセーフメカニズムとしてのみ使用してください。AWS リソースまたはアクションへのアクセスを制御するには、IAM を使用します。

スタックポリシーの例

次のスタックポリシーの例は、ProductionDatabase リソースの更新が禁止されます。

Copy
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }, { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/ProductionDatabase" } ] }

スタックポリシーを設定すると、デフォルトですべてのリソースが保護されます。すべてのリソースの更新を許可するには、すべてのリソースですべてのアクションを許可する Allow ステートメントを追加します。Allow ステートメントではすべてのリソースが指定されますが、ProductionDatabase 論理 ID を持つリソースに関しては明示的な Deny ステートメントが優先されます。この Deny ステートメントにより、置き換えや削除など、すべての更新アクションが ProductionDatabase リソースで禁止されます。

Principal 要素が必要ですが、ワイルドカード (*) のみサポートされています。つまり、ステートメントはすべてのプリンシパルに適用されます。

注記

スタックの更新時に、更新された他のリソースに依存するリソースは AWS CloudFormation により自動的に更新されます。たとえば、AWS CloudFormation が更新されたリソースを参照するリソースを更新するとします。AWS CloudFormation は自動更新されたリソースに物理的な変更 (リソースの ID など) は一切加えませんが、リソースにスタックポリシーが関連付けられている場合は、リソースを更新するためのアクセス権限が必要です。

スタックポリシーの定義

スタックを作成するとき、スタックポリシーは設定されないため、すべてのリソースですべての更新アクションが許可されます。スタックリソースを更新アクションから保護するには、スタックポリシーを定義し、そのポリシーをスタックに設定します。スタックポリシーは、AWS CloudFormation ユーザーが実行可能な AWS CloudFormation スタック更新アクションとアクションが適用されるリソースを定義する JSON ドキュメントです。スタックポリシーを含むテキストファイルを指定するか、入力することにより、スタックの作成時にスタックポリシーを設定します。スタックにスタックポリシーを設定した場合、明示的に許可されていないすべての更新がデフォルトで拒否されます。

スタックポリシーは、EffectActionPrincipalResourceCondition の 5 つの要素によって定義します。スタックポリシーの構文を次の擬似コードに示します。

Copy
{ "Statement" : [ { "Effect" : "Deny_or_Allow", "Action" : "update_actions", "Principal" : "*", "Resource" : "LogicalResourceId/resource_logical_ID", "Condition" : { "StringEquals_or_StringLike" : { "ResourceType" : [resource_type, ...] } } }   ] }
Effect

指定されたリソースでの指定されたアクションを拒否するかまたは許可するかを決定します。Deny または Allow のみ指定できます (

Copy
"Effect" : "Deny"

など)。

重要

スタックポリシーに重複ステートメントが含まれる場合 (リソースでの更新を許可するステートメントと拒否するステートメントの両方)、常に Deny ステートメントが Allow ステートメントより優先されます。リソースが必ず保護されるようにするには、そのリソースに対して Deny ステートメントを使用します。

アクション

拒否または許可する更新アクションを指定します。

Update:Modify

変更の適用中にリソースで中断が発生しない更新アクションまたはなんらかの中断が発生する更新アクションを指定します。すべてのリソースで物理 ID が保持されます。

Update:Replace

リソースが再作成される更新アクションを指定します。AWS CloudFormation は、指定された更新が適用された新しいリソースを作成した後、古いリソースを削除します。リソースが再作成されるため、新しいリソースの物理 ID が変更される場合があります。

Update:Delete

リソースが削除される更新アクションを指定します。スタックテンプレートから完全にリソースを削除する更新の場合は、このアクションを使用する必要があります。

更新:*

すべての更新アクションを指定します。アスタリスクは、すべての更新アクションを表すワイルドカードです。

次の例では、replace アクションと delete アクションのみを指定しています。

Copy
"Action" : ["Update:Replace", "Update:Delete"]

1 つのアクションを除くすべての更新アクションを許可するには、NotAction を使用します。たとえば、Update:Delete を除くすべての更新アクションを許可するには、次の例に示すように NotAction を使用します。

Copy
{ "Statement" : [ { "Effect" : "Allow", "NotAction" : "Update:Delete", "Principal": "*", "Resource" : "*" } ] }

スタックの更新の詳細については、「AWS CloudFormation スタックの更新」を参照してください。

Principal

Principal 要素は、ポリシーを適用するエンティティを指定します。この要素は必須ですが、ワイルドカード (*) のみサポートされています。つまり、ポリシーはすべてのプリンシパルに適用されます。

リソース

ポリシーを適用するリソースの論理 ID を指定します。リソースのタイプを指定するには、Condition 要素を使用します。

1 つのリソースを指定するには、論理 ID を使用します。以下に例を示します。

Copy
"Resource" : ["LogicalResourceId/myEC2instance"]

論理 ID には、ワイルドカードを使用できます。たとえば、すべての関連リソースに共通の論理 ID プレフィックスを使用している場合、ワイルドカードを使用してすべてのリソースを指定できます。

Copy
"Resource" : ["LogicalResourceId/CriticalResource*"]

これらのリソースに対して Not 要素を使用することもできます。たとえば、1 つを除くすべてのリソースに対する更新を許可するには、NotResource 要素を使用してそのリソースを保護します。

Copy
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }

スタックポリシーを設定した場合、明示的に許可されていないすべての更新が拒否されます。ProductionDatabase リソース以外のリソースに対する更新をすべて許可することで、ProductionDatabase リソースに対する更新を拒否します。

条件

ポリシーを適用するリソースタイプを指定します。論理 ID を指定するには、Resource 要素を使用します。

次の例に示すように、EC2 インスタンスや RDS DB インスタンスのようなリソースタイプを指定できます。

Copy
{ "Statement" : [ { "Effect" : "Deny", "Principal" : "*", "Action" : "Update:*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::EC2::Instance", "AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Principal" : "*", "Action" : "Update:*", "Resource" : "*" } ] }

Allow ステートメントはすべてのリソースに更新アクセス権限を付与し、Deny ステートメントは EC2 および RDS DB インスタンスに対する更新を拒否します。Deny ステートメントは、すべてのアクションを常にオーバーライドします。

リソースタイプでワイルドカードを使用できます。たとえば、次の例に示すように、ワイルドカードを使用して、すべての Amazon EC2 リソース (インスタンス、セキュリティグループ、サブネットなど) に対する更新アクセス許可を拒否できます。

Copy
"Condition" : { "StringLike" : { "ResourceType" : ["AWS::EC2::*"] } }

ワイルドカードを使用する場合は、StringLike 条件を使用する必要があります。

スタックポリシーの設定

スタックを作成する際にスタックのポリシーを適用するには、コンソールまたは AWS CLI を使用します。AWS CLI を使用して、既存のスタックにスタックポリシーを適用することもできます。スタックのポリシーを適用すると、スタックからそれを削除することはできません。ただし、AWS CLI を使用して変更することはできます。

スタックポリシーは、スタックを更新しようとするすべての AWS CloudFormation ユーザーに適用されます。異なるスタックポリシーを異なるユーザーに関連付けることはできません。

ポリシーの記述方法については、「スタックポリシーの定義」を参照してください。

スタックの作成時にスタックポリシーを設定するには (コンソール)

  1. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きます。

  2. [CloudFormation Stacks] ページで、[Create Stack] を選択します。

  3. [Create Stack] ウィザードの [Options] ページで、[Advanced] セクションを展開します。

  4. Browse を選択し、スタックポリシーを含むファイルを選択するか、Stack policy テキストボックスにポリシーを入力します。

スタックの作成時にスタックポリシーを設定するには (CLI)

  • aws cloudformation create-stack コマンドを使用する際、--stack-policy-body オプションを使用して変更されたポリシーを入力するか、--stack-policy-url オプションを使用してポリシーを含むファイルを指定します。

既存のスタックでスタックポリシーを設定するには (CLI のみ)

  • aws cloudformation set-stack-policy コマンドを使用する際、--stack-policy-body オプションを使用して変更されたポリシーを入力するか、--stack-policy-url オプションを使用してポリシーを含むファイルを指定します。

    注記

    既存のスタックにポリシーを追加するには、AWS CloudFormation SetStackPolicy アクションに対するアクセス権限が必要です。

保護されたリソースの更新

保護されたリソースを更新するには、スタックポリシーをオーバーライドする一時ポリシーを作成し、それらのリソースでの更新を許可します。スタックを更新するときにオーバーライドポリシーを指定します。オーバーライドポリシーによって、スタックポリシーが永続的に変更されるわけではありません。

保護されたリソースを更新するには、AWS CloudFormation の SetStackPolicy アクションに対するアクセス権限が必要です。AWS CloudFormation のアクセス権限の設定については、「AWS Identity and Access Management によるアクセスの制御」を参照してください。

注記

スタックの更新時に、更新された他のリソースに依存するリソースは AWS CloudFormation により自動的に更新されます。たとえば、AWS CloudFormation が更新されたリソースを参照するリソースを更新するとします。AWS CloudFormation は自動更新されたリソースに物理的な変更 (リソースの ID など) は一切加えませんが、リソースにスタックポリシーが関連付けられている場合は、リソースを更新するためのアクセス権限が必要です。

保護されたリソースを更新するには (コンソール)

  1. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きます。

  2. 更新するスタックを選択し、[Actions]、[Update Stack] の順に選択します。

  3. スタックテンプレートを変更した場合は、更新されたテンプレートの場所を指定します。変更していない場合は、[Use current template] を使用します。

    • ローカルコンピューターに保存されているテンプレートの場合は、[Upload a template to Amazon S3] を選択します。[Choose File] を選択してファイルの場所に移動して選択し、[Next] を選択します。

    • Amazon S3 バケットに保存されているテンプレートの場合は、[Specify an Amazon S3 URL] を選択します。テンプレートの URL を入力するか貼り付けて、[Next] を選択します。

      バージョニングが有効なバケットにテンプレートがある場合、https://s3.amazonaws.com/templates/myTemplate.template?versionId=123ab1cdeKdOW5IH4GAcYbEngcpTJTDW のようにテンプレートの特定バージョンを指定することもできます。詳細については、Amazon Simple Storage Service コンソールユーザーガイドの「バージョニングが有効なバケット内のオブジェクトを管理する」を参照してください。

  4. テンプレートにパラメーターが含まれている場合、[Specify Parameters] ページで、パラメーター値を入力または変更し、[Next] を選択します。

    AWS CloudFormation により、スタックで現在設定されている値が各パラメーターに入力されます。ただし、NoEcho 属性を使用して宣言されたパラメーターを除います。[Use existing value] を選択することで、それらのパラメーターに現在の値を使用できます。

  5. [Options] ページで、オーバーライドする側のスタックポリシーを含むファイルを選択するか、ポリシーを入力し、[Next] を選択します。オーバーライドポリシーでは、更新する保護されたリソースを対象として Allow ステートメントを指定する必要があります。

    たとえば、すべての保護されたリソースを更新するには、すべての更新を許可する一時オーバーライドポリシーを指定します。

    Copy
    { "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }   ] }

    注記

    AWS CloudFormation は、この更新時のみオーバーライドポリシーを適用します。オーバーライドポリシーによって、スタックポリシーが永続的に変更されるわけではありません。スタックのポリシーを変更するには、「スタックポリシーの変更 」を参照してください。

  6. 送信したスタック情報と変更を確認します。

    [Review] セクションで、パラメーター値やテンプレートの URL が適切かなど、正しい情報を送信したことを確認します。テンプレートに IAM リソースが含まれる場合は、[I acknowledge that this template may create IAM resources] を選択して、テンプレート内の IAM リソースを使用することを指定します。テンプレート内の IAM リソースの使用の詳細については、AWS Identity and Access Management によるアクセスの制御を参照してください。

    [Preview your changes] セクションで、必要な変更がすべて AWS CloudFormation により加えられることを確認します。たとえば、追加、削除、または変更しようとしているリソースが AWS CloudFormation によって追加、削除、変更されることを確認します。AWS CloudFormation は、スタックの変更セットを作成することによりこのプレビューを生成します。詳細については、「[ERROR]: xref (using-cfn-updating-stacks-changesets.title) does not have an endterm or text for the link (target element: title). See protect-stack-resources to view the link "" found under "スタックのリソースが更新されないようにする" id="protect-stack-resources" in file 'stack-policy-resources.xml'.」を参照してください。

  7. [Update] を選択します。

    スタックは UPDATE_IN_PROGRESS 状態になります。更新が完了すると、状態は UPDATE_COMPLETE に設定されます。

    スタックの更新が失敗した場合、変更は自動的にロールバックされ、状態は UPDATE_ROLLBACK_COMPLETE に設定されます。

保護されたリソースを更新するには (CLI)

  • aws cloudformation update-stack コマンドを使用する際、--stack-policy-during-update-body オプションを使用して変更されたポリシーを入力するか、--stack-policy-during-update-url オプションを使用してポリシーを含むファイルを指定します。

    注記

    AWS CloudFormation は、この更新時のみオーバーライドポリシーを適用します。オーバーライドポリシーによって、スタックポリシーが永続的に変更されるわけではありません。スタックのポリシーを変更するには、「スタックポリシーの変更 」を参照してください。

スタックポリシーの変更

追加のリソースを保護するか、リソースから保護を削除するには、スタックポリシーを変更します。たとえば、保護するデータベースをスタックに追加するときは、そのデータベースの Deny ステートメントをスタックポリシーに追加します。ポリシーを変更するには、SetStackPolicy アクションを使用するアクセス権限が必要です。

スタックポリシーを変更するには、AWS CLI を使用します。

スタックポリシーを変更するには (CLI)

  • aws cloudformation set-stack-policy コマンドを使用する際、--stack-policy-body オプションを使用して変更されたポリシーを入力するか、--stack-policy-url オプションを使用してポリシーを含むファイルを指定します。

スタックポリシーは削除できません。すべてのリソースからすべて保護を削除するには、すべてのリソースに対するすべてのアクションを明示的に許可するようにポリシーを変更します。次のポリシーは、すべてのリソースですべての更新を許可します。

Copy
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }   ] }

スタックポリシーのその他の例

次のポリシー例では、すべてのスタックリソースの更新を禁止する方法、特定のリソースの更新を禁止する方法、特定のタイプの更新を禁止する方法を示します。

すべてのスタックリソースの更新を禁止する

すべてのスタックリソースの更新を禁止するため、次のポリシーでは、すべてのリソースのすべての更新アクションに対して Deny ステートメントを指定しています。

Copy
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*" }   ] }

1 つのリソースの更新を禁止する

次のポリシーでは、MyDatabase という論理 ID を持つデータベースについて、すべての更新アクションを拒否します。また、Allow ステートメントにより、他のすべてのスタックリソースにおいてすべての更新アクションを許可します。Deny ステートメントは常に許可アクションをオーバーライドするため、Allow ステートメントは MyDatabase リソースには適用されません。

Copy
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "LogicalResourceId/MyDatabase" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

デフォルト拒否を使用することで、前の例と同じ結果が得られます。スタックポリシーを設定した場合、明示的に許可されていないすべての更新が AWS CloudFormation により拒否されます。次のポリシーでは、デフォルトで拒否されている ProductionDatabase リソースを除くすべてのリソースの更新が許可されます。

Copy
{ "Statement" : [ { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "NotResource" : "LogicalResourceId/ProductionDatabase" } ] }

重要

デフォルト拒否の使用にはリスクがあります。ポリシーの他の場所で Allow ステートメントを使用している場合 (ワイルドカードを使用する Allow ステートメントなど)、知らないうちに意図しないリソースに更新アクセス権限を付与する可能性があります。ただし、明示的な拒否はすべての許可アクションをオーバーライドするため、Deny ステートメントを使用することでリソースが保護されることを保証できます。

特定のリソースタイプについてすべてのインスタンスの更新を禁止する

次のポリシーは、RDS DB インスタンスリソースタイプについて、すべての更新アクションを拒否します。また、Allow ステートメントにより、他のすべてのスタックリソースにおいてすべての更新アクションを許可します。Deny ステートメントは常に許可アクションをオーバーライドするため、Allow ステートメントは RDS DB インスタンスリソースには適用されません。

Copy
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::RDS::DBInstance"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

特定のインスタンスについて置き換え更新を禁止する

次のポリシーは、MyInstance という論理 ID を持つインスタンスの置き換えが発生する更新を拒否します。また、Allow ステートメントにより、他のすべてのスタックリソースにおいてすべての更新アクションを許可します。Deny ステートメントは常に許可アクションをオーバーライドするため、Allow ステートメントは MyInstance リソースには適用されません。

Copy
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:Replace", "Principal": "*", "Resource" : "LogicalResourceId/MyInstance" }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }

ネストされたスタックの更新を禁止する

次のポリシーは、AWS CloudFormation スタックリソースタイプ (ネストされたスタック) におけるすべての更新アクションを拒否します。また、Allow ステートメントにより、他のすべてのスタックリソースにおいてすべての更新アクションを許可します。Deny ステートメントは常に許可アクションをオーバーライドするため、Allow ステートメントは AWS CloudFormation スタックリソースには適用されません。

Copy
{ "Statement" : [ { "Effect" : "Deny", "Action" : "Update:*", "Principal": "*", "Resource" : "*", "Condition" : { "StringEquals" : { "ResourceType" : ["AWS::CloudFormation::Stack"] } } }, { "Effect" : "Allow", "Action" : "Update:*", "Principal": "*", "Resource" : "*" } ] }