【问题标题】:Using the CfnOutput created inside a LambdaRestApi in AWS CDK使用在 AWS CDK 的 LambdaRestApi 中创建的 CfnOutput
【发布时间】:2022-02-08 00:25:42
【问题描述】:

我正在创建一个LambdaRestApi,如下所示

        this.gateway = new apigw.LambdaRestApi(this, "Endpoint", {
            handler: hello,
            endpointExportName: "MainURL"
        })

我想访问它生成的CfnOutput,这可能吗?我想将它传递给其他函数,并且我想避免创建一个新函数。

我正在处理的具体情况是这样的:我有一个后期阶段,它使用CfnOutput 验证事情是否正常工作:

deployStage.addPost(
    new CodeBuildStep("VerifyAPIGatewayEndpoint", {
        envFromCfnOutputs: {
            ENDPOINT_URL: deploy.hcEndpoint
        },
        commands: [
            "curl -Ssf $ENDPOINT_URL",
            "curl -Ssf $ENDPOINT_URL/hello",
            "curl -Ssf $ENDPOINT_URL/test"
        ]
    })
)

deploy.hcEndpoint 是我在创建 LambdaRestApi 后手动创建的 CfnOutput:

const gateway = new LambdaRestApi(this, "Endpoint", {handler: hello})
this.hcEndpoint = new CfnOutput(this, "GatewayUrl", {value: gateway.url})

然后确保每个构造都对其父级可用。

在部署后步骤中使用CfnOutputs 是有意义的。我正在努力学习正确的做事方式,并且也有干净的堆栈。只有一个 Lambda 函数没什么大不了的,但如果有几十个或几百个函数,它可能会。而且由于 LambdaRestApi 已经创建了输出,所以感觉就像我在重复自己创建一个相同的输出一样。

【问题讨论】:

    标签: amazon-web-services aws-cdk


    【解决方案1】:

    假设您为 LambdaRestApi 使用以下代码:

    this.gateway = new apigw.LambdaRestApi(this, "Endpoint", {
        handler: hello,
        endpointExportName: "MainURL"
    });
    

    在与 LambdaRestApi 相同的堆栈中引用

    const outputValue = this.gateway.urlForPath("/");
    

    查看source code,输出值只是对urlForPath 的调用。方法是公开的,可以直接使用。

    从另一个堆栈引用

    您可以使用cross stack references 来获取对堆栈输出值的引用。

    import { Fn } from 'aws-cdk-lib';
    const outputValue = Fn.importValue("MainURL");
    

    如果你尝试在另一个堆栈中使用第一种方法,CDK 只会通过添加额外的输出来动态生成跨堆栈引用,因此最好直接导入该值。

    【讨论】:

    • 感谢您的回答。而不是importValue,我可以让gateway.url 可访问但父构造,但在某些时候,我必须将它重新打包在CfnOutput 中,因为这是CodeBuildStep 所期望的。因为LambdaRestApi 已经为我做了,所以再做一次感觉很奇怪。我用这些细节更新了问题。
    • @pupeno 如果需要直接引用CodeBuildStep 中的CfnOutput,可以使用@fedonev 建议的逃生舱口方法
    【解决方案2】:

    我想访问它生成的CfnOutput,可以吗?

    是的。使用escape hatch 语法获取对RestApiendpointExportName 创建的CfnOutput 的引用:

    const urlCfnOutput = this.gateway.node.findChild('Endpoint') as cdk.CfnOutput;
    
    console.log(urlCfnOutput.exportName);
    // MainURL
    
    console.log(urlCfnOutput.value);
    // https://${Token[TOKEN.258]}.execute-api.us-east-1.${Token[AWS.URLSuffix.3]}/${Token[TOKEN.277]}/
    

    首选标准 CDK

    顾名思义,“逃生舱口”用于 CDK 标准解决方案失败时的“紧急情况”。你的用例可能就是这样一个例子,我不知道。但正如@Kaustubh Khavnekar 指出的那样,您不需要CfnOutput 来获取url 令牌值。

    console.log(this.gateway.url)
    // https://${Token[TOKEN.258]}.execute-api.us-east-1.${Token[AWS.URLSuffix.3]}/${Token[TOKEN.277]}/
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 2021-02-03
      • 2021-09-27
      • 2021-12-29
      • 2022-07-21
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      相关资源
      最近更新 更多