

# Amazon ECS 向けの Fargate タスクエフェメラルストレージ
<a name="fargate-task-storage"></a>

AWS Fargate の Linux コンテナでホストされている各 Amazon ECS タスクはプロビジョニング時にバインドマウントのために次のエフェメラルストレージを受け取ります。これらをマウントし、タスク定義内で `volumes`、`mountPoints` および `volumesFrom` パラメータを使用しているコンテナ間で共有することが可能です。この設定は AWS Fargate の Windows コンテナではサポートされません。

## Fargate Linux コンテナプラットフォームのバージョン
<a name="fargate-task-storage-linux-pv"></a>

### バージョン 1.4.0 以降
<a name="fargate-task-storage-pv14"></a>

プラットフォームバージョン `1.4.0` 以降を使用している Fargate でホストされている Amazon ECS タスクは、デフォルトで、最低 20 GiB のエフェメラルストレージを受け取ります。エフェメラルストレージの総量は、最大 200 GiB まで増やすことができます。これを行うには、タスク定義内で `ephemeralStorage` パラメータを設定します。

プル、圧縮、および非圧縮されたコンテナイメージは、エフェメラルストレージに格納されます。タスクを使用するエフェメラルストレージの総量を判断するには、タスクが割り当てられているエフェメラルストレージの総量から、コンテナイメージが使用するストレージの容量を差し引く必要があります。

2020 年 5 月 28 日以降に開始されたプラットフォームバージョン `1.4.0` 以降を使用するタスクでは、エフェメラルストレージが AES-256 暗号化アルゴリズムにより暗号化されます。このアルゴリズムは AWS が所有する暗号化キーを使用するか、独自のカスタマーマネージドキーを作成できます。詳細については、「[Customer managed keys for AWS Fargate ephemeral storage](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-storage-encryption.html)」を参照してください。

2022 年 11 月 18 日以降に開始されたプラットフォームバージョン `1.4.0` 以降を使用するタスクでは、エフェメラルストレージの使用量がタスクメタデータエンドポイントを通じて報告されます。タスク内のアプリケーションは、タスクメタデータエンドポイントのバージョン 4 に対してクエリを実行して、エフェメラルストレージの予約サイズと使用量を取得できます。

 さらに、Container Insights をオンにすると、エフェメラルストレージの予約サイズと使用量が Amazon CloudWatch Container Insights に送信されます。

**注記**  
Fargate はディスク上のスペースを予約します。スペースは Fargate によってのみ使用されます。これには課金されることはありません。これらのメトリクスには表示されません。ただし、この追加ストレージは、`df` などの他のツールでも確認できます。

### バージョン 1.3.0 以前
<a name="fargate-task-storage-pv13"></a>

プラットフォームバージョン `1.3.0` 以前を使用する Fargate タスクでの Amazon ECS の場合、各タスクは次のエフェメラルストレージを受け取ります。
+ 10 GB の Docker Layer ストレージ
**注記**  
この量には、圧縮および非圧縮のコンテナイメージのアーティファクトの両方が含まれます。
+ ボリュームマウント用の追加 4 GB。これらをマウントし、タスク定義内で `volumes`、`mountPoints` および `volumesFrom` パラメータを使用しているコンテナ間で共有することが可能です。

## Fargate Windows コンテナプラットフォームのバージョン
<a name="fargate-task-storage-windows-pv"></a>

### バージョン 1.0.0 以降
<a name="fargate-task-storage-pvws1"></a>

プラットフォームバージョン `1.0.0` 以降を使用している Fargate でホストされている Amazon ECS タスクは、デフォルトで、最低 20 GiB のエフェメラルストレージを受け取ります。エフェメラルストレージの総量は、最大 200 GiB まで増やすことができます。これを行うには、タスク定義内で `ephemeralStorage` パラメータを設定します。

プル、圧縮、および非圧縮されたコンテナイメージは、エフェメラルストレージに格納されます。タスクが使用するエフェメラルストレージの総量を判断するには、タスクに割り当てられたエフェメラルストレージの総量から、コンテナイメージが使用するストレージの容量を差し引く必要があります。

詳細については、「[Amazon ECS でのバインドマウントの使用](bind-mounts.md)」を参照してください。

# Amazon ECS 向け AWS Fargate エフェメラルストレージ用のカスタマーマネージドキー
<a name="fargate-storage-encryption"></a>

AWS Fargate は、エフェメラルストレージに保存されている Amazon ECS タスクのデータを暗号化するカスタマーマネージドキーをサポートし、規制の影響を受けるお客様が内部セキュリティポリシーを満たすことができるよう支援しています。お客様は、Fargate のサーバーレスのメリットを引き続き享受しながら、コンプライアンス監査者に対してセルフマネージドストレージ暗号化の強化された可視性を提供できます。Fargate は、デフォルトで Fargate 管理のエフェメラルストレージ暗号化を備えていますが、お客様は財務情報や健康関連情報などの機密データを暗号化する際に、独自のセルフマネージドキーを使用することもできます。

AWS KMS に独自のキーをインポートするか、AWS KMS でキーを作成できます。これらのセルフマネージドキーは AWS KMS に保存され、ローテーション、無効化、削除などの標準的な AWS KMS のライフサイクルアクションを実行します。CloudTrail ログで、キーのアクセスと使用状況を監査できます。

デフォルトでは、KMS キーはキーごとに 50,000 の許可をサポートします。Fargate は、各カスタマーマネージドキーのタスクに 1 つの AWS KMS 許可を使用するため、1 つのキーに対して最大 50,000 の同時タスクをサポートします。この数を増やしたい場合は、ケースバイケースで承認される制限の引き上げをリクエストすることができます。

Fargate では、カスタマーマネージドキーの使用に追加の料金は発生しません。ストレージと API リクエストに AWS KMS キーを使用するための標準料金のみが請求されます。

**Topics**
+ [Amazon ECS 向け Fargate エフェメラルストレージの暗号化キーを作成する](fargate-create-storage-key.md)
+ [Amazon ECS 向け Fargate エフェメラルストレージの AWS KMS キーを管理する](fargate-managing-kms-key.md)

# Amazon ECS 向け Fargate エフェメラルストレージの暗号化キーを作成する
<a name="fargate-create-storage-key"></a>

Fargate エフェメラルストレージに保存されているデータを暗号化するためのカスタマーマネージドキーを作成します。

**注記**  
カスタマーマネージドキーによる Fargate エフェメラルストレージの暗号化は、Windows タスククラスターでは利用できません。  
カスタマーマネージドキーによる Fargate エフェメラルストレージの暗号化は、`1.4.0` より前のバージョンの `platformVersions` では利用できません。  
Fargate は、Fargate のみが使用するエフェメラルストレージのスペースを予約します。そのスペースに対して料金は発生しません。割り当ては、カスタマー管理以外のキータスクとは異なる場合がありますが、スペースの合計は変わりません。この変更については、`df` などのツールで確認できます。  
マルチリージョンキーは、Fargate エフェメラルストレージではサポートされていません。  
KMS キーエイリアスは、Fargate エフェメラルストレージではサポートされていません。

AWS KMS で Fargate のエフェメラルストレージを暗号化するカスタマーマネージドキー (CMK) を作成するには、次のステップに従ってください。

1. [https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms) に移動します。

1. 手順については、「[AWS Key Management Service デベロッパーガイド](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)」の「[Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。

1. AWS KMS キーを作成するときは、キーポリシーで Fargate サービスに関連する AWS KMS オペレーションのアクセス許可を必ず付与してください。Amazon ECS クラスターリソースでカスタマー管理キーを使用するには、ポリシーで次の API オペレーションを許可する必要があります。
   + `kms:GenerateDataKeyWithoutPlainText` ‐ `GenerateDataKeyWithoutPlainText` を呼び出し、提供された AWS KMS キーから暗号化されたデータキーを生成します。
   + `kms:CreateGrant` - カスタマーマネージドキーに許可を追加します。指定された AWS KMS キーへのアクセス制御を付与します。これは、Amazon ECS Fargate が必要なグラントオペレーションへのアクセスを許可するものです。詳細については、「[AWS Key Management Service デベロッパーガイド](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)」の「[AWS KMS でのグラント](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)」を参照してください。これにより、Amazon ECS Fargate で以下を行うことができます。
     + `Decrypt` から AWS KMS を呼び出し、エフェメラルストレージのデータを復号するための暗号化キーを取得します。
     + `RetireGrant` にサービスが許可するための、廃止するプリンシパルを設定します。
   + `kms:DescribeKey` — カスタマーマネージドキーの詳細を提供し、キーが対称、かつ有効である場合に、Amazon ECS がキーを検証できるようにします。

   次の例は、暗号化するターゲットキーに適用する AWS KMS キーポリシーを示しています。ポリシーステートメントの例を使用する際は、*ユーザー入力用プレースホルダー*を独自の情報に置き換えます。通常どおり、必要なアクセス許可のみを設定しますが、エラーを回避するために、少なくとも 1 人のユーザーにアクセス許可付きの AWS KMS を提供する必要があります。

   ```
   {
         "Sid": "Allow generate data key access for Fargate tasks.",
         "Effect": "Allow",
         "Principal": { "Service":"fargate.amazonaws.com" },
         "Action": [
           "kms:GenerateDataKeyWithoutPlaintext"
         ],
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:aws:ecs:clusterAccount": [
               "customerAccountId"
             ],
             "kms:EncryptionContext:aws:ecs:clusterName": [
                "clusterName"
             ]   
           }
         },
         "Resource": "*"
       },
       {
         "Sid": "Allow grant creation permission for Fargate tasks.",
         "Effect": "Allow",
         "Principal": { "Service":"fargate.amazonaws.com" },
         "Action": [
           "kms:CreateGrant"
         ],
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:aws:ecs:clusterAccount": [
               "customerAccountId"
             ],
             "kms:EncryptionContext:aws:ecs:clusterName": [
                "clusterName"
             ]   
           },
          "ForAllValues:StringEquals": {
             "kms:GrantOperations": [
                "Decrypt"
             ]
          }
         },
         "Resource": "*"
       },
       {
         "Sid": "Allow describe key permission for cluster operator - CreateCluster and UpdateCluster.",
         "Effect": "Allow",
         "Principal": { "AWS":"arn:aws:iam::customerAccountId:role/customer-chosen-role" },
         "Action": [
           "kms:DescribeKey"
         ],
         "Resource": "*"
       }
   ```

   Fargate タスクでは、キーを使用する暗号化オペレーションに `aws:ecs:clusterAccount` および `aws:ecs:clusterName` 暗号化コンテキストキーを使用します。特定のアカウントやクラスターへのアクセスを制限するには、これらのアクセス許可を追加する必要があります。クラスターを指定するときは、ARN ではなくクラスター名を使用してください。

   詳しくは、[AWS KMS デベロッパーガイド](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)の [Encryption context](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) を参照してください。

   クラスターを作成または更新する場合、条件キー `fargateEphemeralStorageKmsKeyId` を使用するオプションを利用できます。この条件キーにより、お客様は IAM ポリシーをよりきめ細かく制御できます。`fargateEphemeralStorageKmsKeyId` 設定の更新は、新しいサービスのデプロイでのみ有効になります。

   以下は、お客様が特定の承認された AWS KMS キーのセットにのみアクセス許可を付与できるようにする例です。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "ecs:CreateCluster",
           "ecs:UpdateCluster"
         ],
         "Resource": "*",
         "Condition": {
           "StringEquals": {
             "ecs:fargate-ephemeral-storage-kms-key": "arn:aws:kms:us-west-2:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
           }
         }
       }
     ]
   }
   ```

------

   次に、クラスターに既に関連付けられている AWS KMS キーの削除を拒否する例を示します。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Deny",
       "Action": [
           "ecs:CreateCluster",
           "ecs:UpdateCluster"
       ],
       "Resource": "*",
       "Condition": {
         "Null": {
           "ecs:fargate-ephemeral-storage-kms-key": "true"
         }
       }
     }
   }
   ```

------

   お客様は、AWS CLI、`describe-tasks`、`describe-cluster` または `describe-services` コマンドを使用して、管理されていないタスクまたはサービスタスクが、キーを使用して暗号化されているかどうかを確認できます。

   詳細については、「[AWS KMS デベロッパーガイド](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)」の「[Condition keys for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html)」を参照してください。

------
#### [ AWS マネジメントコンソール ]

1. コンソール ([https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)) を開きます。

1. 左側のナビゲーションで **[クラスター]**を選択し、右上で **[クラスターの作成]** を選択するか、既存のクラスターを選択します。既存のクラスターの場合は、右上の **[クラスターの更新]** を選択します。

1. ワークフローの **[暗号化] **セクションでは、**[マネージド型ストレージ]** と **[Fargate エフェメラルストレージ]** で AWS KMS キーを選択することもできます。ここで **[AWS KMS キーの作成]** を選択することもできます。

1. 新しいクラスターの作成が完了したら **[作成]** を選択し、既存のクラスターを更新する場合は **[更新]** を選択します。

------
#### [ AWS CLI ]

以下は、クラスターを作成し、AWS CLI を使用して Fargate エフェメラルストレージを設定する例です (*赤色*の値は独自の値に置き換えてください)。

```
aws ecs create-cluster --cluster clusterName \
--configuration '{"managedStorageConfiguration":{"fargateEphemeralStorageKmsKeyId":"arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"}}'
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:us-west-2:012345678901:cluster/clusterName",
        "clusterName": "clusterName",
        "configuration": {
            "managedStorageConfiguration": {
                "fargateEphemeralStorageKmsKeyId": "arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            }
        },
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [],
        "capacityProviders": [],
        "defaultCapacityProviderStrategy": []
    },
    "clusterCount": 5
}
```

------
#### [ CloudFormation ]

以下は、クラスターを作成し、CloudFormation を使用して Fargate エフェメラルストレージを設定するテンプレートの例です (*赤色*の値は独自の値に置き換えてください)。

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyCluster: 
    Type: AWS::ECS::Cluster
    Properties: 
      ClusterName: "clusterName" 
      Configuration:
        ManagedStorageConfiguration:
          FargateEphemeralStorageKmsKeyId: "arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
```

------

# Amazon ECS 向け Fargate エフェメラルストレージの AWS KMS キーを管理する
<a name="fargate-managing-kms-key"></a>

Fargate エフェメラルストレージを暗号化するための AWS KMS キーを作成またはインポートしたら、他の AWS KMS キーと同じ方法で管理します。

**AWS KMS キーの自動ローテーション**  
キーの自動ローテーションを有効にするか、手動でローテーションすることができます。キーの自動ローテーションは、キーの新しい暗号化マテリアルを生成することによって、キーを毎年ローテーションします。AWS KMS は、暗号化マテリアルの以前のバージョンもすべて保存するため、以前のキーバージョンを使用したデータを復号化することができます。ローテーションされたマテリアルは、キーを削除するまで AWS KMS によって削除されることはありません。

キーの自動ローテーションはオプションであり、いつでも有効または無効にできます。

**AWS KMS キーの無効化または取り消し**  
AWS KMS でカスタマーマネージドキーを無効にした場合でも、タスクの実行に影響はなく、ライフサイクルを通じて引き続き機能します。無効化または取り消しされたキーが新しいタスクで使用されている場合は、キーにアクセスできないためタスクは失敗します。CloudWatch アラームなどを設定し、既に暗号化されたデータを復号するために無効化されたキーが再び必要になることがないことを確認する必要があります。

**AWS KMS キーの削除**  
キーの削除は最終的な手段であり、削除されたキーが再び必要になることがないと確信している場合にのみ実行する必要があります。削除されたキーを使用しようとする新しいタスクは、そのキーにアクセスできないため失敗します。AWS KMS では、キーを削除するのではなく、キーを無効にすることをお勧めしています。キーを削除する必要があると思われる場合は、最初にキーを無効にした後、CloudWatch アラームを設定して、不要であることを確認することをお勧めします。キーを削除する場合、AWS KMS では少なくとも 7 日間の猶予期間が付与されているため、その期間に削除を撤回することも可能です。

**AWS KMS キーアクセスの監査**  
CloudTrail ログを使用して、AWS KMS キーへのアクセスを監査できます。AWS KMS オペレーション `CreateGrant`、`GenerateDataKeyWithoutPlaintext`、および `Decrypt` を確認できます。これらのオペレーションでは、`EncryptionContext` がログインした CloudTrail の一部として `aws:ecs:clusterAccount` および `aws:ecs:clusterName` も表示されます。

以下は、`GenerateDataKeyWithoutPlaintext`、`GenerateDataKeyWithoutPlaintext (DryRun)`、`CreateGrant`、`CreateGrant (DryRun)`、`RetireGrant` の CloudTrail イベントの例です (*赤色*の値は独自の値に置き換えてください)。

------
#### [ GenerateDataKeyWithoutPlaintext ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "ec2-frontend-api.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:13Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKeyWithoutPlaintext",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "ec2-frontend-api.amazonaws.com",
    "userAgent": "ec2-frontend-api.amazonaws.com",
    "requestParameters": {
        "numberOfBytes": 64,
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "encryptionContext": {
            "aws:ecs:clusterAccount": "account-id",
            "aws:ebs:id": "vol-xxxxxxx",
            "aws:ecs:clusterName": "cluster-name"
        }
    },
    "responseElements": null,
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": true,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ GenerateDataKeyWithoutPlaintext (DryRun) ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "fargate.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:11Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKeyWithoutPlaintext",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "fargate.amazonaws.com",
    "userAgent": "fargate.amazonaws.com",
    "errorCode": "DryRunOperationException",
    "errorMessage": "The request would have succeeded, but the DryRun option is set.",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "dryRun": true,
        "numberOfBytes": 64,
        "encryptionContext": {
            "aws:ecs:clusterAccount": "account-id",
            "aws:ecs:clusterName": "cluster-name"
        }
    },
    "responseElements": null,
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": true,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ CreateGrant ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "ec2-frontend-api.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:13Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "ec2-frontend-api.amazonaws.com",
    "userAgent": "ec2-frontend-api.amazonaws.com",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "granteePrincipal": "fargate.us-west-2.amazonaws.com",
        "operations": [
            "Decrypt"
        ],
        "constraints": {
            "encryptionContextSubset": {
                "aws:ecs:clusterAccount": "account-id",
                "aws:ebs:id": "vol-xxxx",
                "aws:ecs:clusterName": "cluster-name"
            }
        },
        "retiringPrincipal": "ec2.us-west-2.amazonaws.com"
    },
    "responseElements": {
        "grantId": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": false,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ CreateGrant (DryRun) ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "fargate.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:11Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "fargate.amazonaws.com",
    "userAgent": "fargate.amazonaws.com",
    "errorCode": "DryRunOperationException",
    "errorMessage": "The request would have succeeded, but the DryRun option is set.",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "granteePrincipal": "fargate.us-west-2.amazonaws.com",
        "dryRun": true,
        "operations": [
            "Decrypt"
        ],
        "constraints": {
            "encryptionContextSubset": {
                "aws:ecs:clusterAccount": "account-id",
                "aws:ecs:clusterName": "cluster-name"
            }
        }
    },
    "responseElements": null,
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": false,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ RetireGrant ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-04-20T18:37:38Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "RetireGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": null,
    "responseElements": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    },
    "additionalEventData": {
        "grantId": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": false,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------