无法通过Lambda中的VPC端点访问S3

时间:2018-05-25 08:24:50

标签: amazon-web-services amazon-s3 aws-lambda endpoint vpc

我的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

4 个答案:

答案 0 :(得分:2)

如果您想允许AWS Lambda访问Amazon S3,请使用以下方法之一:

  • 不要将该功能与VPC相关联。然后自动访问。
  • 如果该功能已附加到VPC中的公有子网,请将弹性IP 与VPC中显示的Lambda函数的ENI相关联
  • 如果该功能已附加到VPC中的私有子网,请在公有子网中启动 NAT网关并更新路由表。流量将通过NAT网关流入Internet。
  • 在VPC中添加 Amazon S3 VPC端点并更新路由表。流量将流经该流量而不是Internet网关。

答案 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端点正常工作,您需要在一般情况下将“ *”指定为主体