具有云形成的Lambda:将Cloud形成变量传递给python代码 [英] Lambda with cloud formation : Pass Cloud formation variable to python code
问题描述
下面是clouformation,代码中有我们将lambda函数s3复制到s3的python代码段。这里无法将目标存储桶从云形成参数传递给python代码段,如target_bucket = Ref:dstBucket
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
我现在正在硬编码target_bucket = destination1,但我想通过Ref值
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}
下面是clouformation,代码中有我们将lambda函数s3复制到s3的python代码段。在这里无法通过从云形成参数到python代码段的目标存储区为target_bucket = Ref:dstBucket
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
我现在对target_bucket = destination1进行硬编码,但我想作为Ref值传递
I am hardcoding now target_bucket = destination1 but i want to pass as Ref value
我尝试了不同的方法但未成功。
I have tried different ways did not succeed.
推荐答案
您可以使用您的lambda上的环境属性,例如
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']
或者,如果您确实要使用引用,则可以使用!Sub
函数,例如
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}"
...
这篇关于具有云形成的Lambda:将Cloud形成变量传递给python代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!