我的VPC中有一个Lambda函数,我想访问S3存储桶。
我认为我已经正确设置了S3 VPC端点,
因为我在同一子网(Lambda函数子网)中创建了一个EC2实例,
使用相同的安全组
并运行Lambda函数代码的副本
它可以正确显示S3文件内容。
但是当我在Lambda中运行代码时,它失败了。
所以,我想知道"在EC2"中运行的区别是什么?和"在Lambda"?
中运行为什么我在Lambda中运行它时失败了?
这是我的Lambda函数代码:
import boto3
s3 = boto3.client('s3', region_name='ap-northeast-1')
def lambda_handler(event, context):
bucket = '*xxxxxx*'
key = 's3-upload.json'
try:
response = s3.get_object(Bucket=bucket, Key=key)
print('--------------------------------------')
print(response)
print('--------------------------------------')
body = response['Body'].read()
print(body)
print('--------------------------------------')
print("CONTENT TYPE: " + response['ContentType'])
except Exception as e:
print('Error getting object.')
print(e)
raise e
答案 0 :(得分:2)
如果您想允许AWS Lambda访问Amazon S3,请使用以下方法之一:
答案 1 :(得分:0)
即使他们在同一个VPC中,EC2和Lambda仍然是AWS内的不同环境。能够在一个而不是另一个中运行您的代码意味着您的代码很好并且有效,因此它可能是AWS的配置问题。
您是否检查过lambda正在使用的服务/执行角色?
您需要确保其使用的IAM角色允许正确的S3访问级别。
有关lambda执行角色的文档可能会提供一个有用的起点:https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role
像这样的IAM策略会为您使用对所有S3存储桶使用只读访问权限执行任何角色,而恰好是AWS托管策略之一。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": "*"
}
]
}
答案 2 :(得分:0)
谢谢大家!我找到了原因。
我的Lambda有两个子网,private_sn_1和private_sn_2,
private_sn_1已正确设置vpc端点路由表
但private_sn_2设置了错误的路由表,
我的ec2在private_sn_1中创建,因此它可以访问vpc端点。
正常情况下,Lambda将在private_sn_1或private_sn_2中随机运行,
但在我的情况下,它总是在private_sn_2中运行(我不知道为什么),
所以当我修复private_sn_2路由表时,
一切都是对的。答案 3 :(得分:0)
除了上述所有内容外,VPC端点策略也可能是禁止的,并且不允许流量往返S3。确保使用“完全访问”策略允许通过端点的流量。
编辑:这是文档的相关内容:
您的政策必须包含Principal元素。对于网关端点 仅,您不能将委托人限制为特定的IAM角色或用户。 指定“ *”以授予对所有IAM角色和用户的访问权限。另外, 如果您以以下格式指定主体,则仅适用于网关端点 “ AWS”:“ AWS-account-ID”或“ AWS”:“ arn:aws:iam :: AWS-account-ID:root”, 访问仅授予AWS账户根用户,而不是所有IAM 用户和帐户角色。
因此,要使S3端点正常工作,您需要在一般情况下将“ *”指定为主体