如何使用CDK Python通过Lambda访问跨区域s3存储桶

问题描述

我在区域A中创建了lambda,在区域B中创建了S3存储桶,尝试从lambda boto-3客户端访问存储桶,但遇到错误(访问被拒绝)。请在python CDK中为此提出一些解决方案。我是否需要为此制定任何特定的政策。

解决方法

如果存储桶的区域名称与lambda不在同一区域,则必须显式传递存储桶的区域名称(因为AWS具有S3的特定于区域的端点,在使用s3 api时需要明确查询)。

将您的boto3 S3客户端初始化为:

import boto3

client = boto3.client('s3',region_name='region_name where bucket is')

有关boto3客户端的完整参考,请参见以下内容: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/core/session.html#boto3.session.Session.client

---------编辑------------ 您还需要将以下策略附加到lambda的角色上(或与之串联):

{
  "Version": "2012-10-17","Statement": [
    {
      "Sid": "ExampleStmt","Action": [
        "s3:GetObject"
      ],"Effect": "Allow","Resource": [
        "arn:aws:s3:::YOUR-BUCKET-NAME/*"
      ]
    }
  ]
}

如果您还需要列出和删除对象,则需要具有以下策略,并将其附加到lambda角色(或内联):

{
  "Version": "2012-10-17","Statement": [
    {
      "Sid": "ExampleStmt1","Action": [
        "s3:GetObject","s3:DeleteObject"
      ],"Resource": [
        "arn:aws:s3:::YOUR-BUCKET-NAME/*"
      ]
    },{
      "Sid": "ExampleStmt2","Action": [
        "s3:ListBucket"
      ],"Resource": [
        "arn:aws:s3:::YOUR-BUCKET-NAME"
      ]
    }
  ]
}
,

您的lambda函数需要读取S3的权限

启用该功能的最简单方法是添加AWS托管策略:

arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

到您的lambda execution role

不需要指定区域,因为S3存储桶具有全局范围。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...