![](/img/trans.png)
[英]Lambda Resource in CloudFormation Template Reports CodeUri as Invalid
[英]Reference resource in CloudFormation template in inline code property of a Lambda function
我有一個CloudFormation
模板,該模板具有Lambda
函數資源,該資源在注冊新AMI
時由CloudWatch事件觸發。 在Lambda資源塊中,我在Code
屬性中傳遞內聯代碼。 如果AMI
id是返回事件中解析的所需id,則該函數觸發SSM
自動化文檔執行。 出於問題的考慮,讓我們在模板中將此資源稱為“ My Doc
”。 因此,我的問題是,在我的模板中,如何在Lambda
資源的Code
屬性中的內嵌代碼中引用自動化文檔資源? 我在下面粘貼了一個代碼示例以幫助說明這一點。
模板中的資源塊:
"MyDoc": {
{
"Type" : "AWS::SSM::Document",
"Properties" : {
"Content" : JSON object,
"DocumentType" : Automation,
"Tags" : [ Resource Tag, ... ]
}
}
"MyLambdaFunction": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Role": {
"Fn::GetAtt": [
"SomeRole",
"Arn"
]
},
"Code": {
"ZipFile": {
"Fn::Join": [
"\n",
[
"import json",
"import boto3",
"def lambda_handler(event, context):",
" ssm = boto3.client('ssm')",
" amiId = event['AMI-ID']",
" if 'base_ami in amiId:",
" ssm.start_automation_execution(DocumentName=THIS IS WHERE I NEED TO REFERENCE THE DOCUMENT RESOURCE)",
" else:",
" print("Not the base AMI id.")"
]
]
}
},
"Runtime": "python3.6",
"Timeout": 300,
"Handler": "index.lambda_handler",
"MemorySize": 512
}
},
...
如果我理解正確,那么為了讓您的Lambda獲得該文檔,您首先必須將文檔的邏輯ID傳遞給Lambda。 您可以使用Lambda Environment變量中的!Ref MyDoc
來執行此操作,然后可以將該變量拉入函數並使用GetDocument API調用來獲取文檔。
為此,可以使用Sub內部函數而不是Join。 甚至組合Join和Sub功能-由您決定。
因此,結果代碼如下所示:
"Code": {
"ZipFile": {
"Fn::Join": [
"\n",
[
"import json",
"import boto3",
"def lambda_handler(event, context):",
" ssm = boto3.client('ssm')",
" amiId = event['AMI-ID']",
" if 'base_ami in amiId:",
{
"Fn::Sub": [
" ssm.start_automation_execution(DocumentName=${MyDocumentName})",
{ "MyDocumentName": {"Ref" : "MyDoc" }}
]
}
" else:",
" print("Not the base AMI id.")"
]
]
}
}
當然,這僅適用於內聯代碼,否則,應使用Lambda環境變量,如@Deiv所寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.