如何在CloudFormation模板中为IoT规则引用动态生成的Lambda ARN
在AWS Amplify CloudFormation模板中动态引用Lambda ARN到IoT规则
好问题!这完全贴合基础设施即代码的最佳实践需求,咱们可以通过CloudFormation的内置函数轻松解决这个动态引用的问题,不用再依赖手动配置UI。
核心思路:利用CloudFormation的!GetAtt函数引用Lambda的ARN
Amplify在创建Lambda函数时,已经在CloudFormation模板中定义了对应的Lambda资源(类型为AWS::Lambda::Function)。你只需要找到这个资源的逻辑ID,然后用!GetAtt函数直接提取它的ARN属性即可。
步骤1:找到Amplify生成的Lambda资源逻辑ID
打开你的完整CloudFormation模板,搜索"Type": "AWS::Lambda::Function",找到对应的资源键名(也就是逻辑ID)。通常Amplify生成的Lambda逻辑ID会带有函数名后缀,比如你的函数叫s3SignedUrlGenerator,逻辑ID可能是S3SignedUrlGeneratorLambdaFunction。
步骤2:修改IoT规则模板,替换静态ARN为动态引用
把你模板中FunctionArn的静态值替换为!GetAtt [你的Lambda逻辑ID, Arn]。修改后的片段如下:
"IoTRuleS3RequestSignedUrl": { "Type": "AWS::IoT::TopicRule", "Properties": { "RuleName": "twinTigerSecurityS3SignedUrlRequests", "TopicRulePayload": { "Actions": [ { "Lambda": { "FunctionArn": !GetAtt [S3SignedUrlGeneratorLambdaFunction, Arn] } } ], "Description": "Get S3 bucket signed URL to upload image directly to S3.", "RuleDisabled": false, "Sql": "SELECT operation, bucket, key, replyTo FROM 'iot/topic'" } } }
重要补充:添加IoT调用Lambda的权限
别忘了,默认情况下IoT服务没有权限调用你的Lambda函数,所以需要在模板中添加一个AWS::Lambda::Permission资源,授予IoT触发Lambda的权限:
"IoTLambdaInvokePermission": { "Type": "AWS::Lambda::Permission", "Properties": { "FunctionName": !GetAtt [S3SignedUrlGeneratorLambdaFunction, Arn], "Action": "lambda:InvokeFunction", "Principal": "iot.amazonaws.com", "SourceArn": !GetAtt [IoTRuleS3RequestSignedUrl, Arn] } }
这个权限资源会确保只有你定义的这个IoT规则才能触发对应的Lambda函数,既安全又符合代码化配置的要求。
为什么这样做?
- 不管你的环境(开发/测试/生产)如何变化,CloudFormation都会自动解析当前环境下Lambda的真实ARN,避免了手动维护静态值的麻烦。
- 完全保留了Amplify倡导的基础设施即代码工作流,方便版本控制和长期维护。
内容的提问来源于stack exchange,提问作者Christopher Stevens
相关产品推荐
相关产品推荐

