

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

------