代码之家  ›  专栏  ›  技术社区  ›  Rick.Wang

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

  •  43
  • Rick.Wang  · 技术社区  · 6 年前

    我尝试使用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)
    
    2 回复  |  直到 4 年前
        1
  •  69
  •   DrCord    3 年前

    我已经成功地将数据流式传输到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")
    
        2
  •  9
  •   grepit    4 年前

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

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

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

    a、 打开 roles page 在IAM控制台中。

    b、 选择创建角色。

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

    -受信任的实体——AWS Lambda。

    -权限AWSLambdaExecute。

    -角色名称lambda-s3-Role。

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

    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)
          }