amazon-web-services - 在内联python中使用cfnresponse创建自定义支持的云形成资源时出错
问题描述
尝试创建内联 python lambda 函数作为自定义支持的 cloudformation 资源.. 使用 cfnresponse 获取资源创建的信息..但我的堆栈正在回滚并出现错误。
错误:CustomResource 属性错误:供应商响应在对象 arn:aws:cloudformation:us-west-2:stack/Custom-lambda/8eaeead0-68b8-11e9-8e31-0247c451c136|CustomResource|3a7885fc-0959-中不包含消息键S3 存储桶 cloudformation-custom-resource-storage-uswest2 中的 4284-b4f6-8153fe6420df。用户请求回滚。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "AWS CloudFormation to set up a custom CloudFormation resource with Lambda, and then call it in the same template.",
"Resources": {
"CustomFunction": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"ZipFile": {
"Fn::Join": [
"\n",
[
"import urllib2",
"import os",
"import boto3",
"import json",
"import cfnresponse",
"def lambda_handler(event, context):",
"",
" print 'EVENT ##################'",
" print json.dumps(event)",
" print '########################'",
"",
" pid = 'optionalPhysicalID'",
" response = {}",
"",
" try:",
"",
" response['Output'] = '-' + event['ResourceProperties']['Input'].upper() + '-'",
"",
" if event['RequestType'] == 'Create':",
" print 'Creating stack'",
"",
" if event['RequestType'] == 'Update':",
" print 'Updating Stack'",
"",
" if event['RequestType'] == 'Delete':",
" print 'Deleting Stack'",
"",
" except Exception as e:",
" print str(e)",
" cfnresponse.send(event, context, cfnresponse.FAILED, { 'error': str(e) }, pid)",
" return",
"",
" cfnresponse.send(event, context, cfnresponse.SUCCESS, response, pid)",
"",
" client = boto3.client('s3')",
" response = urllib2.urlopen('https://s3-us-west-2.amazonaws.com/')",
" html = response.read()",
" filename = 'test.sh' ",
" path ='/tmp/'+filename",
" file_ = open(path, 'w')",
" file_.write(html)",
" file_.close()",
" local_file_name = 'tmp/'+filename",
" account_number =boto3.client('sts').get_caller_identity().get('Account')",
" print(account_number)",
" client.create_bucket(Bucket='abc-'+account_number+'-emr-files',",
" CreateBucketConfiguration={'LocationConstraint': 'us-west-2'})",
" client.put_object(Bucket='abc-'+account_number+'-emr-files',Key=filename)"
]
]
}
},
"Role": {
"Fn::Join": [
"",
[
"arn:aws:iam::",
{
"Ref": "AWS::AccountId"
},
":role/AWS__AD_DNS_EMR_Clnup_Lambda_Exctn_Role"
]
]
},
"Handler": "index.lambda_handler",
"MemorySize": "128",
"Runtime": "python2.7",
"Timeout": 180
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "e683a5e0-d8e2-4747-84ed-3273acd09d66"
}
}
},
"CustomResource": {
"Type": "Custom::CustomResource",
"Properties": {
"ServiceToken": {
"Fn::GetAtt": [
"CustomFunction",
"Arn"
]
},
"Input": "Parameter to pass into Custom Lambda Function"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "2a474cb7-859c-4647-958e-c72674dd1a6b"
}
}
}
},
"Outputs": {
"Message": {
"Description": "The message from the custom resource.",
"Value": {
"Fn::GetAtt": [
"CustomResource",
"Message"
]
}
},
"CustomFunctionArn": {
"Description": "The arn of the custom resource function.",
"Value": {
"Fn::GetAtt": [
"CustomFunction",
"Arn"
]
}
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"e683a5e0-d8e2-4747-84ed-3273acd09d66": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 60,
"y": 90
},
"z": 1,
"embeds": []
},
"2a474cb7-859c-4647-958e-c72674dd1a6b": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 180,
"y": 90
},
"z": 1,
"embeds": []
}
}
}
}
解决方案
检查部分Message
中的密钥Outputs
。您正在使用内在函数GetAtt
来获取一个名为Message
from的属性CustomResource
。产生的 CloudFormation 错误告诉我们该函数没有Message
作为资源的返回值。
推荐阅读
- c++ - 如何一次删除由 `cmake -D` 定义的所有变量?
- c# - 仅使用 VSTO 和 C# 获取 Outlook 电子邮件中的最新回复文本
- java - 当我运行应用程序时,构建成功但应用程序崩溃。请帮帮我。以下是我在运行选项卡中收到的错误
- java - 在 Spring 中更改 postmapping 给我一个 404
- c - MISRA C 2012 21.1
- python - Python:Unstacked DataFrame 太大,导致 int32 溢出
- android - Android 中的特殊警报对话框
- python - 在已经存在的 json 列表中插入新的 json 数据
- javascript - 当我单击一个时,所有可折叠项都会打开
- c++ - 数组 X[n] 仅存储名称。编写算法以在数组中插入或删除 ITEM