AWS Glue で AWS KMS 暗号文のアクセスが拒否された 400 エラーを解決する方法を教えてください。

所要時間2分
0

AWS Glue クローラーまたは AWS Glue ETL ジョブを実行すると、400 エラーが発生します。

簡単な説明

AWS Glue を使用している場合、Amazon Simple Service Solution (Amazon S3) バケットなどの AWS リソースにアクセスしようとすると、次のエラーが表示されることがあります。

「暗号文は、存在しない、このリージョンに存在しない、またはアクセスが許可されていないカスタマーマスターキーを指します」

このエラーは、AWS Glue ジョブまたはクローラーを使用して AWS Key Management Service (AWS KMS) キーで暗号化された AWS のサービスにアクセスしたときに表示されます。このエラーは、次のいずれかの理由で発生する可能性が最も高くなります。

  • 暗号化されたキーにアクセスしようとしているプリンシパルには、必要な AWS KMS アクセス許可がない
  • AWS KMS キーが存在しないか、特定の AWS リージョンに存在しない

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

AWS Glue ロールポリシーに必要なアクセス許可があるかどうかを確認する

まず、使用している AWS Glue ロールポリシーに、リソースの AWS KMS キーにアクセスするために必要なアクセス許可があることを確認します。

例えば、AWSGlue-MyGlueCustomRole という名前の AWS Glue ロールがあるとします。このロールは、AWS KMS キー arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 で暗号化された S3 バケットにアクセスしています。AWS Glue ロールポリシーには、他のアクセス許可に加えて次のコンテキストが必要です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07"
        }
    ]
}

AWS KMS キーポリシーで AWS Glue ロールが許可されているかどうかを確認する

AWS KMS キーポリシーでは、許可されたエンティティの一部として AWS Glue ロールを許可する必要があります。

前の例を使用すると、AWS KMS キー arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 ポリシーには次のアクセス許可がアタッチされている必要があります。

{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::XXXXXXXX9645:role/AWSGlue-MyGlueCustomRole "
        ]
    },
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ],
    "Resource": "*"
}

AWS KMS キーが AWS Glue ジョブと同じリージョンに存在することを確認する

AWS KMS キーがどのリージョンに存在するかを確認するには、次の手順に従います。

1.    AWS KMS コンソールを開きます。

2.    エラーが発生しているリージョンを選択します。

3.    ナビゲーションペインで、AWS マネージドキーまたはカスタマーマネージドキーのいずれかを選択します。次に、使用している AWS KMS キーを検索します。AWS CLI を使用して AWS KMS キーを検索することもできます。以下のコマンドは、キーがリージョンに存在しない場合、NotFoundException エラーを返します。

aws kms describe-key --key-id <Key-ID> --region <region-name>

: この例の <Key-ID><region-name> は、必ず使用しているキー ID とリージョン名に置き換えてください。

4.    AWS CloudTrail API 呼び出しの kms:Decryptkms:Encrypt を確認して、障害が発生していないかどうかを確認します。または、kms.amazonaws.com をイベントソースとして使用すると、すべてのイベントログを表示できます。

クロスアカウントの例

AWS Glue ロールと AWS KMS キーが異なるアカウントにある場合は、AWS マネージドキーではなく、カスタマーマネージドキーを使用してください。AWS KMS キーは、プリンシパルが同じアカウントからのものである場合にのみ使用できます。AWS マネージドキーのキーポリシーを変更することはできません。2 番目のアカウントで AWS KMS キーにアクセスするときは、送信元と送信先の両方にアクセス許可があることを確認してください。

アカウント Y の AWS Identity and Access Management (IAM) ユーザー X に、アカウント Z の AWS KMS キーを許可したいとします。この場合、IAM ポリシーに必要な AWS KMS アクションが必要です。AWS KMS キーポリシーからも同じアクションを許可する必要があります。詳細については、「他のアカウントのユーザーに AWS KMS キーの使用を許可する」を参照してください。

クロスアカウントから AWS KMS キーにアクセスするときに発生する最も一般的な問題を次に示します。

エラーメッセージの原因がサービスコントロールポリシー (SCP) の場合は、アカウントに適用されているすべての SCP を確認してください。これにより、kms:Decrypt アクションを制限している SCP を特定できます。影響している SCP を更新して、アクションを再試行してください。詳細については、「ルート、OU、またはアカウントにアタッチされたポリシーの一覧表示」と「SCP の更新」を参照してください。このエラーの例を以下ご覧ください。

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 with an explicit deny in a service control policy"

IAM エンティティにアクセス許可の境界がアタッチされている場合、エンティティが持つ最大のアクセス許可はその境界によって設定されます。IAM プリンシパルのアクセス許可の境界を確認して、必要な AWS KMS 復号化アクションが許可されていることを確認します。次に、操作を再試行します。このエラーの例を以下ご覧ください。

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 because no permissions boundary allows the kms:Decrypt action"

VPC エンドポイントを使用して AWS KMS に接続する場合は、適用されている VPC エンドポイントポリシーを確認してください。ポリシーで kms:Decrypt アクションが許可されていることを確認してください。このエラーの例を以下ご覧ください。

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 because no VPC endpoint policy allows the kms:Decrypt action"

関連情報

AWS Glue での暗号化の設定

AWS KMS でのキーポリシー

AWS公式
AWS公式更新しました 1年前