我在运行 AWS Glue 爬网程序或 AWS Glue ETL 任务时遇到 400 错误。
简短描述
使用 AWS Glue 时,当您尝试访问 Amazon Simple Service Solution (Amazon S3) 存储桶等 AWS 资源时,可能会收到此错误:
"The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access."(加密文字指的是不存在的客户主密钥、不在此区域的客户主密钥或不允许您访问的客户主密钥。)
当您使用 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:Decrypt 和 kms:Encrypt,看看是否观察到任何故障。或者,您可以使用 kms.amazonaws.com 作为事件源来查看所有事件日志。
跨账户示例
如果 AWS Glue 角色和 AWS KMS 密钥位于不同的账户中,请使用客户托管密钥,而不是 AWS 托管式密钥。只有当主体来自同一个账户时,才能使用 AWS KMS 密钥。您无法修改 AWS 托管式密钥的密钥策略。当您访问第二个账户中的 AWS KMS 密钥时,请确保源和目标都有权限。
假设您想要允许账户 Y 中的 AWS Identity and Access Management (IAM) 用户 X 访问账户 Z 中的 AWS KMS 密钥。在这种情况下,IAM policy 必须包含所需的 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 中的密钥策略