You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:17:30