我如何使用aws lambda将文件写入s3(python)?

Ric*_*ang 15 python lambda amazon-s3 amazon-web-services serverless-framework

我曾尝试使用lambda函数将文件写入S3,然后测试显示"成功",但我的S3存储桶中没有出现任何内容.发生了什么?有人能给我一些建议或解决方案吗?非常感谢.这是我的代码.

import json
import boto3

def lambda_handler(event, context):

string = "dfghj"

file_name = "hello.txt"
lambda_path = "/tmp/" + file_name
s3_path = "/100001/20180223/" + file_name

with open(lambda_path, 'w+') as file:
    file.write(string)
    file.close()

s3 = boto3.resource('s3')
s3.meta.client.upload_file(lambda_path, 's3bucket', s3_path)
Run Code Online (Sandbox Code Playgroud)

Tim*_*m B 27

我已成功将数据流传输到S3,必须对其进行编码才能执行此操作:

import boto3

def lambda_handler(event, context):
    string = "dfghj"
    encoded_string = string.encode("utf-8")

    bucket_name = "s3bucket"
    file_name = "hello.txt"
    lambda_path = "/tmp/" + file_name
    s3_path = "/100001/20180223/" + file_name

    s3 = boto3.resource("s3")
    s3.Bucket(bucket_name).put_object(Key=s3_path, Body=encoded_string)
Run Code Online (Sandbox Code Playgroud)

如果数据在文件中,您可以读取此文件并将其发送:

with open(filename) as f:
    string = f.read()

encoded_string = string.encode("utf-8")
Run Code Online (Sandbox Code Playgroud)

  • 我发现S3路径不应该有一个前导`/`否则会创建一个空文件夹,基本上变成`// 100001`所以我认为该行应该是:`s3_path ="100001/20180223 /"+ file_name` (8认同)
  • 请注意,这不是流式传输,而是缓冲到磁盘然后发送 (3认同)
  • 为什么需要 lambda 路径变量? (2认同)

gre*_*pit 14

我的回答与 Tim B 非常相似,但最重要的部分是

\n\n

1.进入S3存储桶并创建一个要写入的存储桶

\n\n

2.按照以下步骤操作,否则 lambda 将因权限/访问而失败。我也为您复制并粘贴了链接内容,以防万一他们更改网址/将其移动到其他页面。

\n\n

A。在 IAM 控制台中打开角色页面。

\n\n

b. 选择创建角色。

\n\n

C。创建具有以下属性的角色。

\n\n

- 受信任实体 \xe2\x80\x93 AWS Lambda。

\n\n

- 权限 \xe2\x80\x93 AWSLambdaExecute。

\n\n

- 角色名称 \xe2\x80\x93 lambda-s3-role。

\n\n

AWSLambdaExecute 策略具有该函数管理 Amazon S3 中的对象并将日志写入 CloudWatch Logs 所需的权限。

\n\n
    \n
  1. 将其复制并粘贴到您的 Lambda python 函数中

    \n\n
    import json, boto3,os, sys, uuid\nfrom urllib.parse import unquote_plus\n\ns3_client = boto3.client(\'s3\')\n\ndef lambda_handler(event, context):\n    some_text = "test"\n    #put the bucket name you create in step 1\n    bucket_name = "my_buck_name"\n    file_name = "my_test_file.csv"\n    lambda_path = "/tmp/" + file_name\n    s3_path = "output/" + file_name\n    os.system(\'echo testing... >\'+lambda_path)\n    s3 = boto3.resource("s3")\n    s3.meta.client.upload_file(lambda_path, bucket_name, file_name)\n\n    return {\n        \'statusCode\': 200,\n        \'body\': json.dumps(\'file is created in:\'+s3_path)\n    }\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
\n