You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda无法读取加密S3存储桶文件,如何通过KMS别名条件限制访问?

问题原因与解决方案

问题根因

你遇到的Access Denied报错确实和kms:RequestAlias条件的配置有关,核心原因是这个条件键的生效逻辑和预期不符:
kms:RequestAlias仅在调用KMS API时请求参数直接指定密钥别名的场景下才会校验匹配,而S3访问加密对象时,后台调用KMS接口传递的是密钥的ARN/ID,不会传递别名,因此这个条件永远无法匹配,直接拒绝访问。

解决方案

把条件中的kms:RequestAlias替换为kms:ResourceAlias即可,这个条件键会校验你访问的KMS密钥本身绑定的所有别名是否符合匹配规则,不管调用KMS时用的是ARN、ID还是别名,只要密钥本身有符合规则的别名就能通过校验,完全匹配限制访问别名含mytoken密钥的需求。

修改后的策略示例如下:

data "aws_iam_policy_document" "lambda_s3_policy_doc" {
  statement {
    sid = ""
    effect = "Allow"
    resources = [
      "arn:aws:s3:::mybucket*",
      "arn:aws:s3:::mybucket*/*"
    ]
    actions = [
      "s3:AbortMultipartUpload",
      "s3:CreateBucket",
      "s3:DeleteObject",
      "s3:GetBucketLocation",
      "s3:GetObject",
      "s3:ListBucket",
      "s3:ListBucketMultipartUploads",
      "s3:ListMultipartUploadParts",
      "s3:PutObject"
    ]
  }


  statement {
    effect = "Allow"
    actions = [
      "kms:Decrypt",
      "kms:DescribeKey",
      "kms:Encrypt",
      "kms:GenerateDataKey"
    ]
    resources = ["*"]

    condition {
      test     = "StringLike"
      variable = "kms:ResourceAlias"
      values   = [
        "alias/*mytoken*"
      ]
    }
  }
}

补充注意事项

  • 单个KMS密钥可以绑定多个别名,只要其中一个别名包含mytoken就会匹配该条件
  • 如果安全等级要求更高,也可以直接将所有符合别名规则的KMS密钥ARN填写到resources字段中,替代条件匹配,权限控制粒度更精确
  • 请确认你S3桶使用的加密密钥确实已经绑定了包含mytoken的别名,否则仍然会触发访问拒绝

内容的提问来源于stack exchange,提问作者Hemanth S R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:54:01