Lambda with cloud formation : Pass Cloud formation variable to python code

故事扮演 提交于 2019-12-06 15:06:16

问题


Hi below is the clouformation ,code we have python snippet for lambda function s3 to s3 copy.Here could not able to pass the destination bucket from cloud formation parameters to python snippet as target_bucket = Ref: dstBucket

I am hardcoding now target_bucket = destination1 but i want to pass as Ref value

I have tried different ways did not succeed.

                    ---
                    AWSTemplateFormatVersion: '2010-09-09'
                    Description: 'objects from Prod bucket to Dev data bucket '
                    Parameters:
                      CustomerName:
                        Description: Customer Name
                        Type: String
                        Default: incoming
                      ProjectName:
                        Description: Project Name
                        Type: String
                        Default: TEST
                      ENV:
                        Description: Environment (dev, prd)
                        Type: String
                        Default: dev
                      srcBucket:
                        Description: Source Bucket that receives data from outside
                        Default: source1
                        Type: String
                      dstBucket:
                        Description: Destination Bucket that will receive files
                        Type: String
                        Default: destination1
                    Resources:
                      LambdaRole:
                        Type: AWS::IAM::Role
                        Properties:
                          AssumeRolePolicyDocument:
                            Version: '2012-10-17'
                            Statement:
                            - Effect: Allow
                              Principal:
                                Service:
                                - lambda.amazonaws.com
                                - s3.amazonaws.com
                              Action:
                              - sts:AssumeRole
                          Path:
                            Fn::Sub: "/${ProjectName}/"
                          Policies:
                          - PolicyName:
                              Fn::Sub: "${AWS::StackName}"
                            PolicyDocument:
                              Version: '2012-10-17'
                              Statement:
                              - Sid: AllowLogging
                                Effect: Allow
                                Action:
                                - logs:CreateLogGroup
                                - logs:CreateLogStream
                                - logs:PutLogEvents
                                Resource: "*"
                              - Sid: SrcBucketPrivs
                                Action:
                                - s3:GetObject
                                - s3:List*
                                Resource:
                                - Fn::Sub: arn:aws:s3:::${srcBucket}/*
                                - Fn::Sub: arn:aws:s3:::${srcBucket}
                                Effect: Allow
                              - Sid: DstBucketPrivs
                                Action:
                                - s3:PutObject
                                - s3:List*
                                Resource:
                                - Fn::Sub: arn:aws:s3:::${dstBucket}/*
                                - Fn::Sub: arn:aws:s3:::${dstBucket}
                                Effect: Allow
                      LambdaFunction:
                        Type: AWS::Lambda::Function
                        DependsOn: LambdaRole
                        Properties:
                          Code:
                            ZipFile: |
                               from __future__ import print_function
                               import os
                               import json
                               import boto3
                               import time
                               import string
                               import urllib
                               print('Loading function')
                               s3 = boto3.client('s3')
                               def handler(event, context):
                                  source_bucket = event['Records'][0]['s3']['bucket']['name']
                                  key = event['Records'][0]['s3']['object']['key']


                                  target_bucket     =  Ref: dstBucket
                                  copy_source = {'Bucket':source_bucket, 'Key':key}

                                  try:
                                    s3.copy_object(Bucket=target_bucket, Key=key, CopySource=copy_source)

                                  except Exception as e:
                                    print(e)
                                    print('Error getting object {} from bucket {}. Make sure they exist '
                                       'and your bucket is in the same region as this '
                                       'function.'.format(key, source_bucket))
                                    raise e

                          Description: Copies objects from srcBucket to dstBucket based on S3 Event Trigger
                          FunctionName:
                            Fn::Sub: "${AWS::StackName}"
                          Handler: index.handler
                          MemorySize: 128
                          Role:
                            Fn::GetAtt:
                            - LambdaRole
                            - Arn
                          Runtime: python3.6
                          Timeout: 60
                      LambdaInvokePermission:
                        Type: AWS::Lambda::Permission
                        DependsOn: LambdaFunction
                        Properties:
                          FunctionName:
                            Fn::GetAtt:
                            - LambdaFunction
                            - Arn
                          Action: lambda:InvokeFunction
                          Principal: s3.amazonaws.com
                          SourceAccount:
                            Ref: AWS::AccountId
                          SourceArn:
                            Fn::Sub: arn:aws:s3:::${srcBucket}

Hi below is the clouformation ,code we have python snippet for lambda function s3 to s3 copy.Here could not able to pass the destination bucket from cloud formation parameters to python snippet as target_bucket = Ref: dstBucket

I am hardcoding now target_bucket = destination1 but i want to pass as Ref value

I have tried different ways did not succeed.


回答1:


You could use the Environment property on your lambda like

LambdaFunction:
  Type: AWS::Lambda::Function
  DependsOn: LambdaRole
  Properties:
    ...
    Environment:
      Variables:
        DESTINATION_BUCKET: !Ref dstBucket

Then you can update your code to read the environment variable

target_bucket = os.environ['DESTINATION_BUCKET']

Alternatively, if you really want to use the reference, you can use the !Sub function, like

LambdaFunction:
  Type: AWS::Lambda::Function
  DependsOn: LambdaRole
  Properties:
    Code:
      ZipFile: !Sub |
         ...
            target_bucket     =  "${dstBucket}"
         ...



回答2:


RTM

Also this if you need more context.

LambdaFunction:
    Type: AWS::Lambda::Function
    DependsOn: LambdaRole
    Properties:
        ...
        Environment:
            ...


来源:https://stackoverflow.com/questions/49503569/lambda-with-cloud-formation-pass-cloud-formation-variable-to-python-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!