【问题标题】:Granting read access to lambda service principal doesn't work as expected授予对 lambda 服务主体的读取访问权限未按预期工作
【发布时间】:2020-09-25 05:25:05
【问题描述】:

这可能是一个普遍的 AWS 问题,但在我看来,CDK 允许您使用它的方式仍然有意想不到的结果,我不确定为什么。

在下面的代码中,我应该向 lambda 服务主体授予读取权限。 但这不起作用,并且 lambdas 无法从此存储桶中读取。 我能让他们工作的唯一方法是更新他们的 lambda 策略,允许他们通过 arn 访问存储桶。

为什么这不起作用?并且由于它是允许的(该策略已设置为存储桶) 这是什么意思?

谢谢!

bucket = S3.Bucket(
    scope=self,
    id='MyBucket',
    versioned=True,
    block_public_access=S3.BlockPublicAccess.BLOCK_ALL,
    encryption=BucketEncryption.KMS_MANAGED,
    removal_policy=core.RemovalPolicy.DESTROY,
    lifecycle_rules=[bucket_lifecycle_rules],
)

lambda_service_principal = iam.ServicePrincipal('lambda.amazonaws.com')
bucket.grant_read(lambda_service_principal)

【问题讨论】:

  • 访问存储桶的不是 Lambda“服务”。访问存储桶的是 Lambda 函数使用的 IAM 角色。这就是为什么您需要使用授予 IAM 角色访问权限的存储桶策略,或者(更好地)向 IAM 角色添加访问存储桶的权限。
  • @JohnRotenstein 谢谢!如果你想。要写它作为答案,我会标记它。

标签: aws-cdk


【解决方案1】:

访问存储桶的不是 Lambda“服务”。访问存储桶的是 Lambda 函数使用的 IAM 角色。这就是为什么您需要使用授予 IAM 角色访问权限的存储桶策略,或者(更好地)向 IAM 角色添加访问存储桶的权限。

创建 Lambda 容器后,Lambda 将“代入”与函数关联的 IAM 角色。然后通过 EC2 实例元数据服务提供这些凭证,就像可以将角色分配给 Amazon EC2 实例一样。

Lambda 函数将使用这些凭证来访问服务,因此请求将来自“来自 IAM 角色”而不是来自 Lambda 服务。

【讨论】:

  • 感谢您的详细回答。将权限添加到 lambda 的 IAM 角色而不是 S3 资源策略的原因是什么?
  • 通常情况下,Amazon S3 存储桶策略用于“所有人”,例如公开存储桶。或者,它可用于授予对来自不同 AWS 账户的身份的访问权限。 IAM 角色用于授予对使用该角色的应用程序的访问权限,在本例中为 AWS Lambda 函数。如果权限将授予用户或应用程序,则将这些权限直接应用于 IAM 用户或 IAM 角色时会更清楚,而不是向各种存储桶策略添加权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
  • 2016-07-10
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
相关资源
最近更新 更多