解决CloudFormation向Python Lambda传递BucketName的代码换行问题
解决CloudFormation Lambda ZipFile中Ref传递导致的Python缩进问题
这个问题的根源在于你直接将Ref作为Fn::Join数组的独立元素,拼接时会自动在前后添加换行符,破坏了Python代码的连续行结构和缩进规则。下面是两种可行的解决方案:
方案1:使用Fn::Sub替代Fn::Join(推荐)
Fn::Sub支持在字符串模板中直接引用资源/参数的值,无需拆分代码行,能完美保持Python代码的缩进和格式。示例如下:
"ZipFile": { "Fn::Sub": [ "import boto3\nimport json\ndef handler(event, context):\n try:\n s3BucketName=event['detail']['requestParameters']['bucketName']\n if s3BucketName == '${BucketName}':\n return {\n 'statusCode': 200,\n 'body': json.dumps('Matched target bucket!')\n }\n except Exception as e:\n return {\n 'statusCode': 500,\n 'body': json.dumps(str(e))\n }", { "BucketName": {"Ref": "BucketName"} } ] }
说明:
- 用
${BucketName}在模板字符串中占位,CloudFormation会自动替换为Ref获取的存储桶名称 - 用
\n手动控制代码换行,缩进可以直接按照Python规范编写,完全不会被破坏 - 整个Lambda代码是一个连续的字符串模板,避免了拼接拆分导致的格式问题
方案2:嵌套Fn::Join修复拼接格式
如果你坚持使用Fn::Join,可以通过嵌套Fn::Join将Ref值与前后字符串拼接成一个完整的代码行,避免插入额外换行:
"ZipFile": { "Fn::Join": [ "\n", [ "import boto3", "import json", "def handler(event, context):", " try:", " s3BucketName=event['detail']['requestParameters']['bucketName']", { "Fn::Join": [ "", [ " if s3BucketName == '", {"Ref": "BucketName"}, "':" ] ] }, " return {'statusCode': 200, 'body': json.dumps('Match found')}", " except Exception as e:", " return {'statusCode': 500, 'body': json.dumps(str(e))}" ] ] }
说明:
- 嵌套的
Fn::Join用空字符串""作为分隔符,把"if s3BucketName == '"、Ref结果、"':"拼接成一个无换行的完整代码行 - 这个完整行作为外层
Fn::Join的一个元素,最终拼接后能保持正确的缩进和语法结构
内容的提问来源于stack exchange,提问作者user1056426
相关产品推荐
相关产品推荐

