Запись файла в S3 в вызванной AWS лямбда-функции из другой функции - PullRequest
0 голосов
/ 06 мая 2020

Этот вопрос относится к лямбда-функции AWS, которая вызывается из другой AWS лямбда-функции, а затем в вызванной функции я хотел прочитать файл и записать файл обратно в S3. Но почему-то это не работает. Детали приведены ниже:

Я использовал основную AWS лямбда-функцию для вызова другой функции с этим кодом:

import json
import boto3

def lambda_handler(event, context):
    invokerLam = boto3.client("lambda") # Defining an object for the lambda service
    BlastFoldername = '1.047. 2020 S3C 5009 P1'
    inputsForInvocation = {'BlastFoldername' : BlastFoldername }


    response = invokerLam.invoke(FunctionName = 'arn:aws:lambda:us-east- 
                         1:131394402205:function:DestinationLambda', InvocationType = 'Event',
                                 Payload = json.dumps(inputsForInvocation))

Вызванная AWS лямбда-функция затем импортирует полезную нагрузку, чтение файла из корзины и запись того же файла в корзину со следующим кодом:

import json
import boto3
import io
import pandas as pd

def lambda_handler(event, context):

    # Reading the payload
    BlastFolder = event['BlastFoldername']
    NewBlastFolder = BlastFolder + "_transformed"
    FileName = "Collar Coordiantes 2820 S3C 5007 P1"
    LocationKey1 = NewBlastFolder + "/" + FileName



    #Read from the s3 Bucket with the same code
    s3 = boto3.client('s3')
    bucket_name = 'shivay.aws108'
    file_name = 'Transformed/Blast/Collar Coordinates.xls'
    file_cor = s3.get_object(Bucket = bucket_name, Key = file_name)
    file_content = file_cor['Body'].read()
    read_excel_data = io.BytesIO(file_content)
    df = pd.read_excel(read_excel_data)
    print(df)



    #Writing the data frame as CSV in the same S3 bucket
    csv_buffer = io.StringIO()
    df.to_csv(csv_buffer)
    s3_resource = boto3.resource('s3')
    HoleFile_save1 = "/Transformed/WritingBackCheck.csv"
    s3_path = HoleFile_save1
    s3_resource.Object(bucket_name, s3_path).put(Body = csv_buffer.getvalue())

Третий шаг записи файла в s3 не работает. Однако чтение файла и создание фрейма данных работают. Эта функция работает в других обычных AWS лямбда-функциях, где лямбда-функция запускается триггером создания объекта, но когда она запускается из другой лямбда-функции, она не записывает файл в s3.

Для справки: роль для первой функции:


{
  "permissionsBoundary": {},
  "roleName": "trackore-lambda",
  "policies": [
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
          }
        ]
      },
      "name": "AmazonS3FullAccess",
      "id": "ANPAIFIR6V6BVTRAHWINE",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/AmazonS3FullAccess"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": [
              "autoscaling:Describe*",
              "cloudwatch:*",
              "logs:*",
              "sns:*",
              "iam:GetPolicy",
              "iam:GetPolicyVersion",
              "iam:GetRole"
            ],
            "Effect": "Allow",
            "Resource": "*"
          },
          {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/events.amazonaws.com/AWSServiceRoleForCloudWatchEvents*",
            "Condition": {
              "StringLike": {
                "iam:AWSServiceName": "events.amazonaws.com"
              }
            }
          }
        ]
      },
      "name": "CloudWatchFullAccess",
      "id": "ANPAIKEABORKUXN6DEAZU",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/CloudWatchFullAccess"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ],
            "Resource": "*"
          }
        ]
      },
      "name": "AWSLambdaBasicExecutionRole",
      "id": "ANPAJNCQGXC42545SKXIK",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "lambda:InvokeFunction"
            ],
            "Resource": [
              "*"
            ]
          }
        ]
      },
      "name": "AWSLambdaRole",
      "id": "ANPAJX4DPCRGTC4NFDUXI",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaRole"
    }
  ],
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]
}

, а роль для второй функции:

{
  "permissionsBoundary": {},
  "roleName": "trackore-lambda",
  "policies": [
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
          }
        ]
      },
      "name": "AmazonS3FullAccess",
      "id": "ANPAIFIR6V6BVTRAHWINE",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/AmazonS3FullAccess"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": [
              "autoscaling:Describe*",
              "cloudwatch:*",
              "logs:*",
              "sns:*",
              "iam:GetPolicy",
              "iam:GetPolicyVersion",
              "iam:GetRole"
            ],
            "Effect": "Allow",
            "Resource": "*"
          },
          {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/events.amazonaws.com/AWSServiceRoleForCloudWatchEvents*",
            "Condition": {
              "StringLike": {
                "iam:AWSServiceName": "events.amazonaws.com"
              }
            }
          }
        ]
      },
      "name": "CloudWatchFullAccess",
      "id": "ANPAIKEABORKUXN6DEAZU",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/CloudWatchFullAccess"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "logs:CreateLogGroup",
              "logs:CreateLogStream",
              "logs:PutLogEvents"
            ],
            "Resource": "*"
          }
        ]
      },
      "name": "AWSLambdaBasicExecutionRole",
      "id": "ANPAJNCQGXC42545SKXIK",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "lambda:InvokeFunction"
            ],
            "Resource": [
              "*"
            ]
          }
        ]
      },
      "name": "AWSLambdaRole",
      "id": "ANPAJX4DPCRGTC4NFDUXI",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaRole"
    }
  ],
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]
}

Пожалуйста, помогите.

Спасибо

1 Ответ

1 голос
/ 06 мая 2020

На основе разговора в чате было обнаружено, что проблема была тайм-аутом .

Таймаут по умолчанию для второй функции был 3 секунды . Это было слишком коротко. Решением было увеличить тайм-аут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...