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

如何使用aws lambda将文件写入s3(python)?,python,amazon-web-services,amazon-s3,aws-lambda,serverless-framework,Python,Amazon Web Services,Amazon S3,Aws Lambda,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

我曾尝试使用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)

我已经成功地将数据流传输到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)
如果数据在文件中,您可以读取此文件并将其发送到:

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

encoded_string = string.encode("utf-8")

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

1.转到S3 bucket并创建一个要写入的bucket

2.遵循以下步骤,否则lambda将因权限/访问而失败。我也为你复制并粘贴了链接内容,以防他们更改url/将其移动到其他页面

a。在IAM控制台中打开

b。选择创建角色

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

-受信任的实体–AWS Lambda

-权限–AWSLambdaExecute

-角色名称–lambda-s3-Role

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

  • 将其复制并传递到Lambda python函数中

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

  • 谢谢。我的代码也是有效的,我忘了重新加载S3存储桶。我也尝试了你的方法,它也很有效。非常感谢。我发现S3路径不应该有一个前导的
    /
    ,否则会创建一个空文件夹,实际上变成
    //100001
    ,所以我想这行应该是:
    S3\u path=“100001/20180223/”+文件名
    ,注意这不是流式传输,但是缓冲到磁盘然后发送这个解决方案非常有效。我需要写一个csv文件,所以我实际上写了一个io.StringIO,然后将缓冲区内容编码为utf-8并保存到S3文件为什么需要一个lambda path变量?