【问题标题】:How could I use aws lambda to write file to s3 (python)?我如何使用 aws lambda 将文件写入 s3 (python)?
【发布时间】:2018-08-03 08:44:52
【问题描述】:

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

【问题讨论】:

    标签: python amazon-web-services amazon-s3 aws-lambda serverless-framework


    【解决方案1】:

    我已经成功地将数据流式传输到 S3,必须对其进行编码才能做到这一点:

    import boto3
    
    def lambda_handler(event, context):
        string = "dfghj"
        encoded_string = string.encode("utf-8")
    
        bucket_name = "s3bucket"
        file_name = "hello.txt"
        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")
    

    【讨论】:

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

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

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

    2.Follow below steps 否则您的 lambda 将因权限/访问而失败。我也为您复制并粘贴了此处的链接内容,以防万一他们更改网址/将其移动到其他页面。

    一个。在 IAM 控制台中打开roles page

    b.选择创建角色。

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

    -可信实体 – AWS Lambda。

    -权限 – AWSLambdaExecute。

    -角色名称 - lambda-s3-role.

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

    1. 将其复制并粘贴到您的 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)
          }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-06
      • 2021-01-27
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2018-09-16
      • 2019-08-21
      • 2017-03-04
      相关资源
      最近更新 更多