すべてのプロダクト
Search
ドキュメントセンター

Resource Orchestration Service:スタックポリシー

最終更新日:Jan 16, 2025

スタックポリシーを使用すると、スタックの更新中にスタックリソースが誤って更新または削除されるのを防ぐことができます。このトピックでは、スタックポリシーを定義、構成、および更新する方法について説明します。

背景情報

スタックポリシーは、指定されたリソースに対して実行できる更新アクションを定義する JSON または YAML ファイルです。スタック更新権限を持つユーザーは、スタックの作成後にスタック内のすべてのリソースを更新できます。特定のリソースでは、更新中に中断が必要になる場合があります。スタックポリシーが構成されると、Resource Orchestration Service (ROS) はスタック内のすべてのリソースを保護します。特定のリソースの更新を許可するには、スタックポリシーでリソースに対して /* 許可 */ ステートメントを指定します。

説明
  • 各スタックに対して定義できるスタックポリシーは 1 つだけです。1 つのスタックポリシーで複数のリソースを保護できます。

  • スタックの更新中、ROS は他の更新されたリソースに依存するリソースを自動的に更新します。たとえば、ROS は更新されたリソースを参照するリソースを自動的に更新します。ただし、スタックポリシーに関連付けられている自動的に更新されるリソースを更新する権限が必要です。

スタックポリシーは、スタックの更新中にのみ有効になります。RAM ポリシーとは異なり、スタックポリシーはアクセス制御をサポートしていません。スタックポリシーは、特定のスタックリソースへの意図しない更新を防ぐフェイルセーフメカニズムとしてのみ機能します。

スタックポリシーの定義

スタックの作成時にスタックポリシーを構成しない場合、スタック内のすべてのリソースを更新できます。スタック内のリソースの更新を防ぐには、スタックポリシーを定義し、スタックのポリシーを構成します。スタックを作成するときは、スタックポリシーの内容を入力するか、スタックポリシーを含むテキストファイルを指定して、スタックポリシーを構成できます。スタックポリシーを構成するときに更新を明示的に許可しない場合、更新は拒否されます。

スタックポリシーは、次の要素で構成されます。/* 効果 *//* アクション *//* プリンシパル *//* リソース */、および /* 条件 */

Statement:
  - Effect: Deny_or_Allow # 拒否または許可
    Action: update_actions # 更新アクション
    Principal: '*'
    Resource: LogicalResourceId/resource_logical_ID # リソース論理 ID
    Condition:
      StringEquals_or_StringLike:
        ResourceType:
          - resource_type
          - ...
            

次のセクションでは、ポリシーの要素について説明します。

  • /* 効果 */

    リソースに対するアクションを拒否するか許可するかを指定します。有効な値:/* 拒否 */ および /* 許可 */。サンプルコード:

    Effect: Deny # 拒否
    説明

    スタックポリシーに許可ステートメントと拒否ステートメントの両方が含まれている場合、/* 拒否 */ ステートメントは /* 許可 */ ステートメントよりも優先されます。リソースを更新から保護する場合は、/* 拒否 */ ステートメントを使用します。

  • /* アクション */

    拒否または許可される更新アクション。有効な値:

    • /* 更新:変更 */

      リソースへの変更が適用されているときに、リソースが中断されないか、特定の中断が発生する更新アクション。

    • /* 更新:削除 */

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

    • /* 更新:* */

      すべての更新アクション。ワイルドカード文字 (*) は、すべての更新アクションを指定します。

    説明

    /* 更新:置換 */ は、リソースが置換される更新アクションを指定します。 更新:置換アクションは予約機能であり、サポートされていません。

    次のサンプルコードでは、更新:削除および更新:変更アクションが指定されています。

    Action:
      - Update:Modify # 変更
      - Update:Delete # 削除

    特定の更新アクションを除くすべての更新アクションを許可する場合は、/* NotAction */ を使用します。たとえば、/* NotAction *//* 更新:削除 */ に設定して、更新:削除アクションを除くすべての更新アクションを許可できます。

    Statement:
      - Effect: Allow
        NotAction: Update:Delete # 削除
        Principal: '*'
        Resource: '*'
  • /* プリンシパル */

    ポリシーが適用されるプリンシパル。値をワイルドカード文字 (*) に設定します。ワイルドカード文字 (*) は、ポリシーがすべてのプリンシパルに適用されることを示します。

  • /* リソース */

    ポリシーが適用されるリソースの論理 ID。リソースタイプを指定する場合は、/* 条件 */ 要素を使用します。

    リソースを指定する場合は、リソースの論理 ID を使用します。サンプルコード:

    Resource: - LogicalResourceId/myECS

    論理 ID には、ワイルドカード文字 (*) を含めることができます。たとえば、同じプレフィックスを持つすべての論理 ID を照合する場合は、プレフィックスの後にワイルドカード文字 (*) を指定します。

    Resource: - LogicalResourceId/Prefix*

    /* Not */ プレフィックスを Resource 要素に追加できます。たとえば、特定のリソースを除くすべてのリソースの更新を許可する場合は、/* NotResource */ 要素を使用して、リソースが更新されないように保護します。

    Statement:
      - Effect: Allow
        Action: Update:*
        Principal: '*'
        NotResource: LogicalResourceId/WebServers

    スタックポリシーを構成するときに特定のリソースの更新を明示的に許可しない場合、そのリソースの更新は拒否されます。/* WebServers */ リソースを除くすべてのリソースの更新を許可する場合、/* WebServers */ リソースの更新は拒否されます。

  • /* 条件 */

    ポリシーが適用されるリソースタイプ。リソースの論理 ID を指定する場合は、/* リソース */ 要素を使用します。

    たとえば、ALIYUN::ECS::Instance および ALIYUN::RDS::DBInstance リソースタイプを使用して、すべての Elastic Compute Service (ECS) および ApsaraDB RDS インスタンスを指定できます。

    Statement:
      - Effect: Deny
        Principal: '*'
        Action: Update:*
        Resource: '*'
        Condition:
          StringEquals:
            ResourceType:
              - ALIYUN::ECS::Instance
              - ALIYUN::RDS::DBInstance
      - Effect: Allow
        Principal: '*'
        Action: Update:*
        Resource: '*'

    上記のサンプルコードでは、/* 許可 */ ステートメントはすべてのリソースの更新を許可します。/* 拒否 */ ステートメントは、ECS および ApsaraDB RDS インスタンスの更新を拒否します。/* 拒否 */ ステートメントは /* 許可 */ ステートメントよりも優先されます。

    リソースタイプには、ワイルドカード文字 (*) を含めることができます。たとえば、ワイルドカード文字 (*) を使用して、ECS インスタンス、セキュリティグループ、サブネットなど、すべての ECS リソースの更新を拒否できます。

    Condition:
      StringLike:
        ResourceType:
          - ALIYUN::ECS::*
    説明

    ワイルドカード文字 (*) を使用する場合は、StringLike 条件を指定する必要があります。

スタックポリシーの構成

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

  • ROS コンソールを使用して、スタックの作成時にスタックポリシーを構成する

    1. ROS コンソール にログオンします。

    2. 左側のナビゲーションペインで、[スタック] をクリックします。

    3. 上部のナビゲーションバーで、リージョンドロップダウンリストからスタックを作成するリージョンを選択します。この例では、中国 (杭州) が選択されています。

    4. [スタック] ページで、[スタックの作成] をクリックし、ドロップダウンリストから [ROS を使用する] を選択します。

    5. [スタックの作成] ウィザードの [テンプレートの選択] ステップで、ビジネス要件に基づいてテンプレートを指定し、[次へ] をクリックします。

    6. [スタックの作成] ウィザードの [パラメータの構成] ステップで、画面の指示に従って [スタック名] パラメータと [テンプレートパラメータの構成] セクションのパラメータを構成します。

    7. [スタック設定の構成] セクションで、[スタックポリシー] パラメータを [スタックポリシーの入力] に設定します。

    8. 次のいずれかの方法を使用してスタックポリシーを構成し、[次へ] をクリックします。

      • 入力スタックポリシー: スタックポリシーを入力します。

      • [ファイルのアップロード]: スタックポリシーを含む JSON または YAML ファイルをアップロードします。

    9. [コンプライアンス事前チェック] ステップで、コンプライアンス事前チェックを完了し、[次へ] をクリックします。

      説明

      特定のリソースのみがコンプライアンス事前チェック機能をサポートしています。詳細については、「Compliance precheck」をご参照ください。

      1. [ルールの評価] セクションで、コンプライアンスルールを追加します。

        ROS テンプレート内のクラウド リソースに基づいて、コンプライアンスルールを追加できます。

      2. [評価] をクリックします。

        無効なリソースを修復するために提供される提案に基づいて、テンプレートの内容を変更できます。これにより、リソースのコンプライアンスが確保されます。

    10. 画面の指示に従って、スタックの作成を完了します。

  • Alibaba Cloud CLIを使用してスタックポリシーを作成時に構成する

    スタックポリシーを構成するには、次のいずれかの方法を使用できます。

    • CreateStackオペレーションを呼び出します。

      aliyun ros CreateStack コマンドと --StackPolicyBody オプションを使用して、更新を許可するスタックポリシーを構成するか、aliyun ros CreateStack コマンドと --StackPolicyURL オプションを使用して、スタックポリシーを含むファイルを指定します。

    • CreateChangeSetオペレーションを呼び出します。

      aliyun ros CreateChangeSet コマンドと --StackPolicyBody オプションを使用して、更新を許可するスタックポリシーを構成するか、aliyun ros CreateChangeSet コマンドと --StackPolicyURL オプションを使用して、スタックポリシーを含むファイルを指定します。

  • Alibaba Cloud CLI を使用して、既存のスタックのスタックポリシーを設定します(Alibaba Cloud CLI のみサポートされています)。

    aliyun ros SetStackPolicy コマンドと --StackPolicyBody オプションを使用して、更新を許可するスタックポリシーを設定するか、aliyun ros SetStackPolicy コマンドと --StackPolicyURL オプションを使用して、スタックポリシーを含むファイルを指定します。

    説明

    既存のスタックのスタックポリシーを設定するには、SetStackPolicy オペレーションを呼び出す権限が必要です。

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

スタック内の保護されたリソースを更新する場合、既存のスタックポリシーをオーバーライドし、リソースの更新を許可する一時ポリシーを作成できます。一時スタックポリシーは、スタックポリシーを永続的にオーバーライドしません。

保護されたリソースを更新するには、SetStackPolicy オペレーションを呼び出す権限が必要です。 ROS で権限を設定する方法の詳細については、「RAM を使用してリソースへのアクセスを制御する」をご参照ください。

  • ROS コンソールを使用して保護されたリソースを更新する

    1. ROS コンソール にログインします。

    2. 左側のナビゲーションペインで、[スタック] をクリックします。

    3. 上部のナビゲーションバーで、リージョン ドロップダウンリストから目的のスタックのリージョンを選択します。この例では、中国 (杭州) が選択されています。

    4. [スタック] ページで、スタックを見つけ、[アクション] 列の [更新] をクリックします。

    5. [スタック設定の構成] セクションで、画面の指示に従って [スタックポリシーの入力] を選択します。

    6. 一時スタックポリシーを設定します。

      設定する一時スタックポリシーは、この更新に対してのみ有効です。一時ポリシーでは、更新する保護されたリソースに対して Allow ステートメントを指定する必要があります。たとえば、すべての保護されたリソースを更新する場合、リソースへのすべての更新を許可する一時ポリシーを指定する必要があります。

      Statement:
        - Effect: Allow
          Action: Update:*
          Principal: '*'
          Resource: '*'
          // 一時ポリシーでは、更新する保護されたリソースに対して Allow ステートメントを指定する必要があります。
      
    7. 画面の指示に従って、スタックの更新を完了します。

  • Alibaba Cloud CLI を使用して保護されたリソースを更新する

    保護されたリソースを更新するには、次のいずれかの方法を使用できます。

    • UpdateStack オペレーションを呼び出します。

      aliyun ros UpdateStack コマンドと --StackPolicyDuringUpdateBody オプションを使用して、更新を許可する一時スタックポリシーを設定するか、aliyun ros UpdateStack コマンドと --StackPolicyDuringUpdateURL オプションを使用して、一時スタックポリシーを含むファイルを指定します。

    • CreateChangeSet オペレーションを呼び出します。

      aliyun ros CreateChangeSet コマンドと --StackPolicyDuringUpdateBody オプションを使用して、更新を許可する一時スタックポリシーを設定するか、aliyun ros CreateChangeSet コマンドと --StackPolicyDuringUpdateURL オプションを使用して、一時スタックポリシーを含むファイルを指定します。

    説明

    ROS は、この更新中にのみ一時ポリシーを適用します。一時スタックポリシーは、スタックポリシーを永続的にオーバーライドしません。

スタックポリシーの更新

スタックポリシーを使用して新しいリソースを保護する場合、または既存のリソースの保護を停止する場合は、スタックポリシーを更新できます。たとえば、保護するデータベースをスタックに追加する場合は、データベースの Deny ステートメントをスタックポリシーに追加します。スタックポリシーを更新するには、SetStackPolicy オペレーションを呼び出す権限が必要です。

  • ROSコンソールを使用してスタックポリシーを更新する

    1. ROSコンソール にログインします。

    2. 左側のナビゲーションペインで、[スタック] をクリックします。

    3. 上部のナビゲーションバーで、リージョン ドロップダウンリストから目的のスタックのリージョンを選択します。この例では、中国 (杭州) が選択されています。

    4. [スタック] ページで、目的のスタックを見つけ、[スタック名] 列のスタック ID をクリックします。

    5. [スタック情報] タブの [スタックポリシー] セクションで、[編集] をクリックします。

    6. [リソーススタックポリシーの変更] ダイアログボックスで、新しいスタックポリシーの内容を入力します。

    7. [OK] をクリックします。

  • Alibaba Cloud CLI を使用してスタックポリシーを更新する

    aliyun ros SetStackPolicy コマンドと --StackPolicyBody オプションを使用して、更新を許可するスタックポリシーを設定するか、aliyun ros SetStackPolicy コマンドと --StackPolicyURL オプションを使用して、スタックポリシーを含むファイルを指定します。

    次のポリシーは、すべてのリソースに対するすべての更新を許可します。

    Statement:
      - Effect: Allow
        Action: Update:*
        Principal: '*'
        Resource: '*'
  • スタックを更新するときに Alibaba Cloud CLI を使用してスタックポリシーを更新する

    aliyun ros UpdateStack コマンドと --StackPolicyBody オプションを使用して、更新を許可するスタックポリシーを設定するか、aliyun ros UpdateStack コマンドと --StackPolicyURL オプションを使用して、スタックポリシーを含むファイルを指定します。

    aliyun ros CreateChangeSet コマンドと --StackPolicyBody オプションを使用して、更新を許可するスタックポリシーを設定するか、aliyun ros CreateChangeSet コマンドと --StackPolicyURL オプションを使用して、スタックポリシーを含むファイルを指定します。

サンプルスタックポリシー

次のサンプルスタックポリシーは、すべてまたは特定のスタックリソースの更新を防止する方法と、特定の種類の更新アクションを防止する方法を示しています。

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

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

    Statement:
      - Effect: Deny
        Action: Update:*
        Principal: '*'
        Resource: '*'
  • 単一のリソース (WebServers) の更新を防止する

    • 例 1:Deny ステートメントを使用して、WebServers リソースの更新を防止します。

      Statement:
        - Effect: Allow
          Action: Update:*
          Principal: '*'
          Resource: '*'
        - Effect: Deny
          Action: Update:*
          Principal: '*'
          Resource: LogicalResourceId/WebServers

      次のセクションでは、ポリシーの要素について説明します。

      • Allow: すべてのリソースの更新を許可します。

      • Deny: 論理 ID が WebServers であるリソースの更新を拒否します。

      • Principal: ポリシーが適用されるプリンシパル。ワイルドカード文字 (*) のみがサポートされています。ワイルドカード文字 (*) は、ポリシーがすべてのプリンシパルに適用されることを示します。

    • 例 2:Allow ステートメントを使用して、WebServers リソースを除くすべてのリソースの更新を許可します。

      Statement:
        - Effect: Allow
          Action: Update:*
          Principal: '*'
          NotResource: LogicalResourceId/WebServers
      説明
      • スタックポリシーを構成するときに、特定のリソースの更新を明示的に許可しない場合、そのリソースの更新は拒否されます。

      • デフォルトの拒否ポリシーを実装すると、リスクが発生する可能性があります。ポリシーに別の Allow ステートメント(ワイルドカード文字 (*) を含む Allow ステートメントなど)が存在する場合、特定のリソースの更新権限が意図せずに付与される可能性があります。明示的な Deny ステートメントは、すべての Allow ステートメントよりも優先されます。Deny ステートメントを使用して、リソースが確実に保護されるようにすることができます。

  • リソースタイプのすべてのインスタンスの更新を防止する

    次のポリシーは、ApsaraDB RDS インスタンスに対するすべての更新アクションを拒否します。Allow ステートメントを使用して、ALIYUN::RDS::DBInstance タイプのリソースを除くすべてのスタックリソースに対するすべての更新アクションを許可できます。Allow ステートメントは、Deny ステートメントが Allow ステートメントよりも優先されるため、ApsaraDB RDS インスタンスには適用されません。

    Statement:
      - Effect: Deny
        Action: Update:*
        Principal: '*'
        Resource: '*'
        Condition:
          StringEquals:
            ResourceType:
              - ALIYUN::RDS::DBInstance
      - Effect: Allow
        Action: Update:*
        Principal: '*'
        Resource: '*'
  • ネストされたスタックの更新を防止する

    次のポリシーは、ROS ネストされたスタックに対するすべての更新アクションを拒否します。Allow ステートメントを使用して、ALIYUN::ROS::Stack タイプのリソースを除くすべてのスタックリソースに対するすべての更新アクションを許可できます。Allow ステートメントは、Deny ステートメントが Allow ステートメントよりも優先されるため、ROS スタックリソースには適用されません。

    Statement:
      - Effect: Deny
        Action: Update:*
        Principal: '*'
        Resource: '*'
        Condition:
          StringEquals:
            ResourceType:
              - ALIYUN::ROS::Stack
      - Effect: Allow
        Action: Update:*
        Principal: '*'
        Resource: '*'