

# Armazenamento efêmero de tarefas do Fargate para o Amazon ECS
<a name="fargate-task-storage"></a>

Quando provisionada, cada tarefa do Amazon ECS hospedada em contêineres Linux no AWS Fargate recebe o armazenamento temporário a seguir, para montagens bind. Isso pode ser montado e compartilhado entre os contêineres usando os parâmetros `volumes`, `mountPoints` e `volumesFrom` na definição da tarefa. Não há suporte para isso nos contêineres do Windows no AWS Fargate.

## Versões da plataforma de contêiner Linux do Fargate
<a name="fargate-task-storage-linux-pv"></a>

### Versão 1.4.0 ou posterior
<a name="fargate-task-storage-pv14"></a>

Por padrão, as tarefas do Amazon ECS hospedadas no Fargate usando a versão `1.4.0` ou posterior da plataforma recebem, no mínimo, 20 GiB de armazenamento temporário. A quantidade total de armazenamento temporário pode ser aumentada, até um máximo de 200 GiB. Para fazer isso, especifique o parâmetro `ephemeralStorage` na definição de tarefa.

A imagem de contêiner extraída, compactada e descompactada da tarefa é armazenada no armazenamento temporário. Para determinar a quantidade total de armazenamento temporário que sua tarefa precisa usar, subtraia a quantidade de armazenamento usada pela imagem do contêiner da quantidade total de armazenamento temporário em que a tarefa está alocada..

Para tarefas que usam a versão `1.4.0` ou posterior da plataforma iniciadas em 28 de maio de 2020 ou depois, o armazenamento temporário é criptografado com um algoritmo de criptografia AES-256. Esse algoritmo usa uma chave de criptografia pertencente à AWS ou você pode criar sua própria chave gerenciada pelo cliente. Para obter mais informações, consulte [Customer managed keys for AWS Fargate ephemeral storage](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-storage-encryption.html).

Para tarefas que usam uma versão `1.4.0` ou posterior da plataforma, lançadas a partir de 18 de novembro de 2022, o uso de armazenamento temporário é informado por meio do endpoint de metadados da tarefa. As aplicações nas suas tarefas podem consultar a versão 4 do endpoint de metadados da tarefa para obter o tamanho reservado de armazenamento temporário e a quantidade usada. 

 Além disso, o tamanho reservado do armazenamento temporário e a quantidade usada serão enviados ao Amazon CloudWatch Container Insights se você ativar o Container Insights.

**nota**  
O Fargate reserva espaço no disco. Esse espaço é usado apenas pelo Fargate. Você não é cobrado por isso. Ele não é mostrado nessas métricas. Porém, você pode ver esse armazenamento adicional em outras ferramentas, como o `df`.

### Versão 1.3.0 ou anterior
<a name="fargate-task-storage-pv13"></a>

Para as tarefas do Amazon ECS no Fargate que usam a versão `1.3.0` ou anterior da plataforma, cada tarefa recebe o armazenamento temporário a seguir.
+ 10 GB de armazenamento de camadas do Docker
**nota**  
Essa quantidade inclui artefatos de imagem de contêiner compactados e não compactados.
+ Mais 4 GB para montagens de volume. Isso pode ser montado e compartilhado entre os contêineres usando os parâmetros `volumes`, `mountPoints` e `volumesFrom` na definição da tarefa.

## Versões da plataforma de contêiner Windows do Fargate
<a name="fargate-task-storage-windows-pv"></a>

### Versão 1.0.0 ou posterior
<a name="fargate-task-storage-pvws1"></a>

Por padrão, as tarefas do Amazon ECS hospedadas no Fargate usando a versão `1.0.0` ou posterior da plataforma recebem, no mínimo, 20 GiB de armazenamento temporário. A quantidade total de armazenamento temporário pode ser aumentada, até um máximo de 200 GiB. Para fazer isso, especifique o parâmetro `ephemeralStorage` na definição de tarefa.

A imagem de contêiner extraída, compactada e descompactada da tarefa é armazenada no armazenamento temporário. Para determinar a quantidade total de armazenamento temporário que sua tarefa precisa usar, subtraia a quantidade de armazenamento usada pela imagem do contêiner da quantidade total de armazenamento temporário em que a tarefa está alocada..

Para obter mais informações, consulte [Uso de montagens vinculadas com o Amazon ECS](bind-mounts.md).

# Chaves gerenciadas pelo cliente para o armazenamento efêmero do AWS Fargate para o Amazon ECS
<a name="fargate-storage-encryption"></a>

O AWS Fargate é compatível com chaves gerenciadas pelo cliente para criptografar dados para tarefas do Amazon ECS mantidas em armazenamento efêmero para ajudar clientes que estão sujeitos a regulamentações a seguir suas políticas internas de segurança. Os clientes ainda obtêm o benefício da tecnologia sem servidor do Fargate, ao mesmo tempo em que oferecem maior visibilidade da criptografia de armazenamento autogerenciada aos auditores de conformidade. Embora o Fargate tenha, por padrão, criptografia de armazenamento efêmero gerenciada pelo Fargate, os clientes também podem usar suas próprias chaves autogerenciadas ao criptografar dados confidenciais, como informações financeiras ou médicas.

Você pode importar suas próprias chaves para o AWS KMS ou criar as chaves no AWS KMS. Essas chaves autogerenciadas são armazenadas no AWS KMS e realizam as ações padrão do ciclo de vida do AWS KMS, como alternar, desativar e excluir. Você pode auditar o acesso e o uso das chaves nos logs do CloudTrail.

Por padrão, a chave KMS é compatível com 50.000 concessões por chave. O Fargate usa uma única concessão do AWS KMS por tarefa de chave gerenciada pelo cliente, sendo compatível com até 50.000 tarefas simultâneas para uma chave. Se quiser aumentar esse número, você pode solicitar um aumento de limite, que é aprovado caso a caso.

O Fargate não cobra nenhum adicional pelo uso de chaves gerenciadas pelo cliente. Você só paga o preço padrão pelo uso das chaves do AWS KMS para solicitações de armazenamento e de API.

**Topics**
+ [Criar uma chave de criptografia para o armazenamento efêmero do Fargate para o Amazon ECS](fargate-create-storage-key.md)
+ [Gerenciar chaves AWS KMS para o armazenamento efêmero do Fargate para o Amazon ECS](fargate-managing-kms-key.md)

# Criar uma chave de criptografia para o armazenamento efêmero do Fargate para o Amazon ECS
<a name="fargate-create-storage-key"></a>

Crie uma chave gerenciada do cliente para criptografar dados armazenados no armazenamento temporário do Fargate.

**nota**  
A criptografia de armazenamento efêmero do Fargate com chaves gerenciadas pelo cliente não está disponível para clusters de tarefas do Windows.  
A criptografia do armazenamento efêmero do Fargate com chaves gerenciadas pelo cliente não está disponível nas `platformVersions` anteriores à versão `1.4.0`.  
O Fargate reserva espaço em um armazenamento efêmero que só é usado pelo Fargate, e você não é cobrado por esse espaço. A alocação pode ser diferente nas tarefas de chave não gerenciadas pelo cliente, mas o espaço total permanece o mesmo. Você pode ver essa mudança em ferramentas como `df`.  
Chaves de várias regiões não são compatíveis com armazenamento efêmero do Fargate.  
Aliases de chaves do KMS não são compatíveis com armazenamento efêmero do Fargate.

Para criar um a chave gerenciada pelo cliente (CMK) para criptografar armazenamento efêmero para o Fargate no AWS KMS, siga estas etapas.

1. Navegue até [https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms).

1. Siga as instruções de [Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) no [AWS Key Management Service Developer Guide](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html).

1. Ao criar sua chave AWS KMS, certifique-se de fornecer as permissões operacionais relevantes do AWS KMS ao serviço Fargate nas políticas de chave. As operações de API a seguir devem ser permitidas na política para usar a chave gerenciada pelo cliente com os recursos de cluster do Amazon ECS.
   + `kms:GenerateDataKeyWithoutPlainText`: chame `GenerateDataKeyWithoutPlainText` para gerar uma chave de dados criptografada a partir da chave AWS KMS fornecida.
   + `kms:CreateGrant`: adiciona uma concessão a uma chave gerenciada pelo cliente. Concede controle de acesso a uma chave AWS KMS especificada, o que permite acesso às operações de concessão que o Fargate do Amazon ECS requer. Para obter mais informações sobre [Utilizar concessões](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html), consulte o [Guia do desenvolvedor do AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html). Isso permite que o Fargate do Amazon ECS faça o seguinte:
     + Chame `Decrypt` para que o AWS KMS obtenha a chave de criptografia para descriptografar os dados do armazenamento efêmero.
     + Configure uma entidade principal aposentada para permitir que o serviço para `RetireGrant`.
   + `kms:DescribeKey`: fornece os detalhes da chave gerenciada pelo cliente para permitir que o Amazon ECS valide a chave se ela for simétrica e estiver habilitada.

   O exemplo a seguir mostra uma política de chave AWS KMS que você aplicaria à chave de destino para criptografia. Para usar as instruções do exemplo de política, substitua os *espaços reservados para entrada do usuário* por suas próprias informações. Como sempre, configure apenas as permissões necessárias, mas você precisará fornecer o AWS KMS com permissões para pelo menos um usuário a fim de evitar erros.

   ```
   {
         "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": "*"
       }
   ```

   As tarefas do Fargate usam as chaves de contexto de criptografia `aws:ecs:clusterAccount` e `aws:ecs:clusterName` para operações criptográficas com a chave. Os clientes devem adicionar essas permissões para restringir o acesso a uma conta e/ou cluster específicos. Use o nome do cluster e não o ARN ao especificar o cluster.

   Para obter mais informações, consulte [Contexto de criptografia](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) no [Guia do desenvolvedor AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html).

   Ao criar ou atualizar um cluster, você tem a opção usar a chave de condição `fargateEphemeralStorageKmsKeyId`. Essa chave de condição permite que os clientes tenham um controle mais granular das políticas do IAM. As atualizações da configuração `fargateEphemeralStorageKmsKeyId` só se aplicam a novas implantações do serviço.

   O exemplo a seguir mostra como deixar que os clientes só concedam permissões a um conjunto específico de chaves AWS KMS aprovadas.

------
#### [ 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"
           }
         }
       }
     ]
   }
   ```

------

   O próximo exemplo mostra como negar tentativas de remover chaves AWS KMS que já estão associadas a um cluster.

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

****  

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

------

   Os clientes podem ver se as tarefas não gerenciadas ou as tarefas de serviço estão criptografadas com a chave usando os comandos AWS CLI, `describe-tasks`, `describe-cluster` ou `describe-services`.

   Para obter mais informações, consulte [Condition keys for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html) in the [AWS KMS Developer Guide](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html).

------
#### [ Console de gerenciamento da AWS ]

1. Abra o console em [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2).

1. Escolha **Clusters** no painel de navegação esquerdo, depois selecione **Criar cluster** no canto superior direito ou escolha um cluster existente. Para um cluster existente, escolha **Atualizar cluster** no canto superior direito.

1. Na seção **Criptografia** do fluxo de trabalho, você terá a opção de selecionar sua chave AWS KMS em **Armazenamento gerenciado** e **Armazenamento efêmero do Fargate**. Você também pode optar por **criar uma chave AWS KMS** aqui.

1. Escolha **Criar** quando terminar de criar o novo cluster ou **Atualizar**, se estiver atualizando um cluster existente.

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

O exemplo a seguir mostra como criar um cluster e configurar o armazenamento efêmero do Fargate usando a AWS CLI (substitua os valores em *vermelho* pelos seus):

```
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 ]

O exemplo a seguir mostra como criar um cluster e configurar o armazenamento efêmero do Fargate usando a CloudFormation o (substitua os valores em *vermelho* pelos):

```
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"
```

------

# Gerenciar chaves AWS KMS para o armazenamento efêmero do Fargate para o Amazon ECS
<a name="fargate-managing-kms-key"></a>

Depois de criar ou importar sua chave AWS KMS para criptografar o armazenamento efêmero do Fargate, você o gerencia como faria com qualquer outra chave AWS KMS.

**Alternância automática de chaves AWS KMS**  
Você pode ativar a troca automática das chaves ou fazer isso manualmente. A troca automática da chave faz isso para você uma vez por ano, gerando novo material criptográfico para a chave. O AWS KMS também salva todas as versões anteriores do material criptográfico, para que você possa descriptografar dados que usaram as versões anteriores da chave. O AWS KMS não excluirá nenhum material que tenha sido trocado até você excluir a chave.

A troca automática é opcional e pode ser habilitada ou desabilitada a qualquer momento.

**Desativando ou revogando chaves AWS KMS**  
Desabilitar uma chave gerenciada pelo cliente no AWS KMS não terá nenhum impacto na execução das tarefas e elas continuarão funcionando durante todo o ciclo de vida. Uma tarefa que usar a chave desabilitada ou revogada falhará porque não poderá acessar a chave. Você deve definir um alarme do CloudWatch ou similar para garantir que uma chave desabilitada nunca seja necessária para descriptografar dados já criptografados.

**Excluir chaves AWS KMS**  
Excluir chaves deve ser sempre o último recurso e só deve ser usado se você tiver certeza de que a chave excluída nunca mais será necessária. Novas tarefas que tentarem usar a chave excluída falharão porque não conseguirão acessá-la. O AWS KMS recomenda desabilitar a chave em vez de excluí-la. Se você achar necessário excluir uma chave, sugerimos desativá-la primeiro e definir um alarme do CloudWatch para ter certeza de que ela não é necessária. Se resolver excluir uma chave, o AWS KMS dá a você pelo menos sete dias para mudar de ideia.

**Auditar acesso a chaves AWS KMS**  
Você pode usar os logs do CloudTrail para auditar o acesso à sua chave AWS KMS. Você pode verificar as operações `CreateGrant`, `GenerateDataKeyWithoutPlaintext` e `Decrypt` do AWS KMS. Essas operações também mostram a `aws:ecs:clusterAccount` e o `aws:ecs:clusterName` como parte do `EncryptionContext` registrado em log do CloudTrail.

O exemplo a seguir mostra eventos do CloudTrail para `GenerateDataKeyWithoutPlaintext`, `GenerateDataKeyWithoutPlaintext (DryRun)`, `CreateGrant`, `CreateGrant (DryRun)` e `RetireGrant` (substitua os valores *em vermelho* pelos seus).

------
#### [ 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"
}
```

------