【问题标题】:Cloudformation nested stack import/export - No export named EXPORT_NAME foundCloudformation 嵌套堆栈导入/导出 - 找不到名为 EXPORT_NAME 的导出
【发布时间】:2020-01-25 17:38:11
【问题描述】:

我有一个 Cloudformation 堆栈,其中包含一个主模板和两个嵌套模板,其中一个包含一个 Lambda 和关联角色,另一个包含一个 S3 存储桶。我想从 Lambda 模板中导出 Lambda ARN 并将其传递给 S3 模板,这样我就可以做一些事件通知的事情(让 S3 存储桶中的新项目触发 Lambda)。

如果我在导入导出的 Lambda ARN 并将其传递到存储桶的主模板中注释掉 CF 代码,一切正常 - 主模板和嵌套模板部署正常,我可以看到导出的 Lambda ARN -

(c4abb639548f2545e145ea54ed13d2ea) justin@justin-XPS-13-9360:~/work/gists/c4abb639548f2545e145ea54ed13d2ea$ ./describe_outputs.sh xxx-MyLambda-1B451J61821EC
------------------------------------------------------------------------------------------------------------------
|                                                 DescribeStacks                                                 |
+-------------------------+--------------+-----------------------------------------------------------------------+
|       ExportName        |  OutputKey   |                              OutputValue                              |
+-------------------------+--------------+-----------------------------------------------------------------------+
|  xxx-lambda-arn|  FunctionArn |  arn:aws:lambda:eu-west-1:119552584133:function:xxx-lambda   |
+-------------------------+--------------+-----------------------------------------------------------------------+

但是,如果我取消注释将导出的 Lambda ARN 传递给存储桶模板的代码 -

  MyBucket:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "https://s3.${AWS::Region}.amazonaws.com/${S3Bucket}/${AppName}/templates/bucket.yaml"
      Parameters:
        BucketName: !Join
          - '-'
          - - Ref: AppName
            - bucket
        LambdaArn:                            # <- this
          Fn::ImportValue:                    # <- this
            Fn::Sub: "${AppName}-lambda-arn"  # <- this

然后突然部署整个堆栈失败 -

(c4abb639548f2545e145ea54ed13d2ea) justin@justin-XPS-13-9360:~/work/gists/c4abb639548f2545e145ea54ed13d2ea$ aws cloudformation describe-stack-events --stack-name xxx
{...}
ROLLBACK_IN_PROGRESS |  No export named xxx-lambda-arn found. Rollback requested by user. 

我很惊讶主堆栈无法检测到其中一个嵌套堆栈(S3 堆栈)需要从另一个嵌套堆栈(Lambda 堆栈)导出一个值。

我希望可以通过添加 DependsOn 块来解决此问题,使 S3 嵌套堆栈依赖于 Lambda 嵌套堆栈,但这也不起作用。

在属于同一个主堆栈的嵌套堆栈中导入/导出值是否存在某种限制?或者有什么解决办法?

这里有完整的要点-

https://gist.github.com/jhw/c4abb639548f2545e145ea54ed13d2ea

【问题讨论】:

    标签: amazon-cloudformation


    【解决方案1】:

    在您的嵌套堆栈中,您需要指定一个输出,以便主堆栈可以从资源访问它,即

    Lambda 堆栈

    "Resources": {
        "LambdaFunction": ...
    }
    "Outputs": {
        "LambdaFunction": {
                    "Value":
                    { "Fn::GetAtt": ["LambdaFunction","Arn"] }
        }
    

    主堆栈

    LambdaArn: !GetAtt Lambda.Outputs.LambdaArn
    

    可以从主堆栈中引用 Lambda 以获取更多信息,请查看此参考架构https://github.com/aws-samples/ecs-refarch-cloudformation

    【讨论】:

    • 您不需要从嵌套堆栈中导出值吗? (正如你所描述的,我有一个输出块,但它使用了导出;我注意到你没有导入/导出任何东西?)
    • 嵌套栈使用时不需要导出。仅当您想在另一个堆栈中使用 Fn::ImportValue 函数时才使用导出值,差异很小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 2019-10-28
    • 2020-09-17
    相关资源
    最近更新 更多