无法在AWS Lambda中从S3下载文件而不会出现任何HTTP错误

时间:2016-07-19 00:08:06

标签: json amazon-s3 lambda

这是我在AWS lambda中的代码:

import boto3
def worker_handler(event, context):

s3 = boto3.resource('s3')
s3.meta.client.download_file('s3-bucket-with-script','scripts/HelloWorld.sh', '/tmp/hw.sh')
print "Connecting to "

我只想下载存储在S3中的文件,但是当我启动代码时,程序只运行到超时并且什么都不打印。 这是日志文件

START RequestId: 8b9b86dd-4d40-11e6-b6c4-afcc5006f010 Version: $LATEST
END RequestId: 8b9b86dd-4d40-11e6-b6c4-afcc5006f010
REPORT RequestId: 8b9b86dd-4d40-11e6-b6c4-afcc5006f010  Duration: 300000.12 ms  Billed Duration: 300000 ms  Memory Size: 128 MB Max Memory Used: 28 MB  
2016-07-18T23:42:10.273Z 8b9b86dd-4d40-11e6-b6c4-afcc5006f010 Task timed out after 300.00 seconds

I have this role in the this Lambda function, it shows that I have the permission to get file from S3
{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "ec2:CreateNetworkInterface",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DeleteNetworkInterface"
        ],
        "Resource": "*"
    },
    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": "arn:aws:logs:*:*:*"
    },
    {
        "Sid": "AllowPublicRead",
        "Effect": "Allow",
        "Action": [
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    }
]
}

我错过了其他任何设置吗?或者无论如何我可以继续这个计划? 谢谢你提前。

4 个答案:

答案 0 :(得分:0)

根据docs,您的代码应该略有不同:

    import boto3

    # Get the service client
    s3 = boto3.client('s3')

    # Download object at bucket-name with key-name to tmp.txt
    s3.download_file("bucket-name", "key-name", "tmp.txt")

另外,请注意Lambda有一个短暂的文件结构,意味着下载文件,没有真正做任何事情。你刚下载它然后Lambda关闭并不再存在,你需要在将它下载到Lambda之后将它发送到某个地方,如果你想保留它。

此外,您可能需要将timeout settings调整为更高。

答案 1 :(得分:0)

正如您提到的超时,我会检查网络配置。如果您正在通过VPC,这可能是由于缺少到互联网的路线造成的。这可以使用NAT网关或S3 VPC端点来解决。以下视频介绍了所需的配置。

Introducing VPC Support for AWS Lambda

答案 2 :(得分:0)

如另一个答案所示,您可能需要 NAT 网关或 S3 VPC 端点。我需要它,因为我的 Lambda 位于 VPC 中,因此它可以访问 RDS。我开始遇到设置 NAT 网关的麻烦,直到我意识到 NAT 网关目前每小时 0.045 美元,或每天约 1 美元(1.08 美元),这远远超过我想要的花费。

然后我需要考虑 S3 VPC 端点。这听起来像是设置另一个 VPC,但它不是 VPC,而是 VPC 端点。如果您进入 VPC 部分,则会有一个“端点”部分(在左侧)以及子网、路由、NAT 网关等。对于设置 NAT 网关的所有复杂性(在我看来),端点令人惊讶很简单。

唯一棘手的部分是选择服务。您会注意到服务名称与您所在的区域相关联。例如,我的是“com.amazonaws.us-east-2.s3”

但是您可能会注意到您有两个选项,一个“网关”和一个“接口”。在 Reddit 上有人声称他们对接口收费而不是网关收费,所以我选择了网关,一切似乎都有效。

https://www.reddit.com/r/aws/comments/a6yppu/eli5_what_is_the_difference_between_interface/

如果你不信任那个 Reddit 用户,我后来发现 AWS 目前是这样说的: "注意:为了避免本示例中的 NAT 网关数据处理费用,您可以设置网关类型 VPC 端点并通过 VPC 端点路由进出 S3 的流量,而不是通过 NAT 网关。没有数据处理或每小时使用网关类型 VPC 端点的费用。有关如何使用 VPC 端点的详细信息,请访问 VPC 端点文档。"

https://aws.amazon.com/vpc/pricing/

请注意,我还根据另一个问题的答案更新了路径类型,但我不确定这是否真的很重要。

https://stackoverflow.com/a/44478894/764365

答案 3 :(得分:0)

您是否检查过您的超时设置是否正确?我遇到了同样的问题,它超时了,因为我的默认值设置为 3 秒,下载文件所需的时间比下载时间长。

这里是你设置超时设置的地方:

enter image description here