Savings Plans 返品操作を拒否するサービスコントロールポリシー(SCP)を試してみた

2024.03.22

いわさです。

昨日のアップデートで、Savings Plans が一定条件を満たす場合は返品出来るようになりました。

チバユキさんのブログで「Savings Plan の返品に関するクォータ」について言及されています。
年間 10 回までということで、この返品を自由に操作されてしまうと都合が悪いケースもあるかもしれないなと思いました。

そこで本日は AWS Organizations のサービスコントロールポリシー(SCP)を使って、対象組織内での Savings Plans 返品を制限出来るか確認してみました。

まず購入と返品出来るか確認

まず、私もまだ Savings Plans の返品を試していなかったので制限する前に返品出来ることを確認してみます。
インベントリを見てみると次のように Savings Plan を購入済みです。

詳細画面から「Return Savings Plan」を選択します。

ステータスがすぐに「Returned」になりました。
チバユキさんのブログだと 15 分ほどかかったということでしたが、数秒ですぐにステータスが変わりました。
私は No Upfront (前払いなし) で購入したので、そのためかもしれません。

SCP を設定する

上記アカウントに Savings Plan の返品を出来ないように SCP を設定してみたいと思います。

以下のドキュメントでは返品操作を行うために必要な権限について言及されています。
これを見る限りでは SCP で「savingsplans:returnSavingsPlan」を拒否してやるだけで良さそうです。

Only root users or IAM users with the savingsplans:returnSavingsPlan permission can return a Compute Savings Plan or EC2 Instance Savings Plan in their account.

まず、先程返品操作を行ったので、該当アカウントのバージニア北部リージョンの CloudTrail を確認しておきます。
「ReturnSavingsPlan」イベントが発生していますね。

次のようなイベント内容でした。

{
    "eventVersion": "1.09",
    "userIdentity": {

:

    },
    "eventTime": "2024-03-21T21:22:53Z",
    "eventSource": "savingsplans.amazonaws.com",
    "eventName": "ReturnSavingsPlan",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "203.0.113.1",
    "userAgent": "aws-internal/3 cfg/retry-mode/legacy",
    "requestParameters": {
        "savingsPlanId": "921530af-fc50-4257-8a0c-ec6c26041ac2"
    },
    "responseElements": {
        "savingsPlanId": "921530af-fc50-4257-8a0c-ec6c26041ac2"
    },
    "requestID": "7035242c-486f-49b5-899e-1f1a006bb830",
    "eventID": "97ecbf36-86e3-4c03-b11a-3698e1416a77",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}

では SCP のポリシーを作成して該当アカウントにアタッチします。
SCP の詳細については以下もご参照ください。

ここでは単純に次のようなポリシーを作成しました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "savingsplans:ReturnSavingsPlan"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

本日時点では上記を設定する際に、ポリシーエディターで「Invalid Action」が表示されたり、ReturnSavingsPlan が選択肢になかったりしますが無視して作成します。

作成したポリシーを OU あるいはアカウントにアタッチします。

SP 返品拒否 SCP をアタッチ後の返品挙動を見てみよう

さて、期待どおり返品操作を拒否することが出来るのでしょうか。見てみましょう。
次のように新しい Savings Plan を購入済みです。

返品操作を行ってみましょう。
「Return Savings Plan」ボタンは押せますね。押します。

表示された確認ダイアログ上でも「Confirm return」ボタンが押せますね。押します。

先ほどと異なり、Confirm が完了しないですね。
ボタンのグルグルがずっとグルグルしてます。しばらく待ったのですがずっとこの状態でした。

インベントリを確認してみると、対象 Savings Plan は返品されておらずアクティブなステータスのままです。

CloudTrail イベントも確認してみましょう。

{
    "eventVersion": "1.09",
    "userIdentity": {

:

    },
    "eventTime": "2024-03-21T21:32:53Z",
    "eventSource": "savingsplans.amazonaws.com",
    "eventName": "ReturnSavingsPlan",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "203.0.113.1",
    "userAgent": "aws-internal/3 cfg/retry-mode/legacy",
    "errorCode": "AccessDenied",
    "requestParameters": {
        "savingsPlanId": "e50b461b-d261-4a4a-8b5b-7971e656e31d"
    },
    "responseElements": {
        "Message": "User: arn:aws:sts::123456789012:assumed-role/OrganizationAccountAccessRole/hogeadmin is not authorized to perform: savingsplans:ReturnSavingsPlan on resource: arn:aws:savingsplans:us-east-1:123456789012:/ReturnSavingsPlan with an explicit deny"
    },
    "requestID": "ba2e0471-1aa1-4501-8dbb-79d88fd0fe5b",
    "eventID": "d4dba545-0e74-4018-965b-0ebac1288a6c",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management"
}

あっ、拒否されてますね!
AccessDeniedが発生しています。うまくいってますね。

さいごに

本日は Savings Plans 返品操作を拒否するサービスコントロールポリシー(SCP)を試してみました。

SCP で拒否出来ましたね。
キャンセル操作時に拒否されたとメッセージ表示してくれるとありがたいですが、そのうちアップデートされそうな気もしています。
返品操作が終らないなという方は今回のように CloudTrail のイベントも確認してみてください。拒否されてるのかもしれませんよ。