将现有 AWS 资源整合到 CloudFormation 堆栈中

Posted

技术标签:

【中文标题】将现有 AWS 资源整合到 CloudFormation 堆栈中【英文标题】:Incorporate existing AWS resources into a CloudFormation stack 【发布时间】:2019-06-22 23:03:06 【问题描述】:

有没有办法将在 CloudFormation 之外创建的现有 AWS 资源合并到现有 CloudFormation 堆栈中?我想这样做,而不必在 CloudFormation 堆栈中添加新资源并将现有资源的数据迁移到该新资源。我看到 AWS 现在对 CloudFormation 堆栈进行了漂移检测。我想知道是否可以利用它来将现有资源合并到堆栈中。

【问题讨论】:

【参考方案1】:

将资源导入/采用到现有 CloudFormation 堆栈的能力是 CloudFormation 客户提出的第一个要求。我们一直在考虑如何做到这一点,但还没有找到既能满足客户需求又能在服务运营规模上发挥作用的机制。

由于我们不会在服务之外的任何地方公开堆栈状态信息供您修改,因此在我们提供采用功能之前,您可以采取的唯一方法是将有关资源的元数据存储在参数存储中,或者使用自定义资源作为包装器,用于检索有关底层资源的信息,然后通过 Fn::GetAtt 将其呈现给您的堆栈。

【讨论】:

感谢您的建议!非常感谢!【参考方案2】:

现在你终于可以使用资源导入功能了,参考:

https://github.com/aws/aws-sdk-js/blob/master/CHANGELOG.md

https://twitter.com/shortjared/status/1193985448164691970?s=21

【讨论】:

你能提供一个简单的例子吗?我已经尝试通过 AWS 控制台上的 CloudFormation 进行操作,但看起来您仍然需要导入模板或提供 s3 url。 @TrieuNomad 尝试将它与former2.com结合使用【参考方案3】:

您可以通过Parameters 将现有资源信息传递到您的堆栈来做到这一点。 Here is an example 如何将这些参数传递给堆栈。

查看 Eric Hammond 的 this blog post,描述如何将这些参数合并到堆栈的其余部分。描述的用例有点不同,如果没有传入,它们可以选择创建新资源,但整体结构适用于您描述的情况。

在这种情况下,我认为漂移检测不会对您有所帮助,因为它会显示已部署资源与堆栈中描述的配置之间的差异。不会检查在堆栈之外定义/创建的资源。

【讨论】:

我看到了那篇博文,如果我在这里错了,请纠正我,但我认为这涉及资源的条件创建,而不是将资源完全合并 cloudformation 堆栈,对吧?我希望 cloudformation 堆栈完全承担/接管 AWS 资源并在那里进行管理。目前使用 AWS 似乎不太可能。 是的,没错。我理解您的问题意味着您想引用现有资源但不在堆栈中定义它们。据我所知,如果不重建现有资源,就无法将现有资源的配置委托给 cloudformation。【参考方案4】:

Amazons CDK(在撰写本文时目前处于开发者预览阶段)提供了一种方法:

如果您需要引用在您的 CDK 应用程序之外定义的资源,例如 Amazon S3 存储桶或 VPC,您可以使用 AWS 构造上可用的 Xxxx.import(...) 静态方法。例如,您可以使用 Bucket.import() 方法获取 BucketRef 对象,该对象可以在大多数需要存储桶的地方使用。这种模式可以将在您的应用之外定义的资源视为您的应用的一部分。

来源:https://docs.aws.amazon.com/CDK/latest/userguide/aws_construct_lib.html

它还允许导入现有的 CloudFormation 模板: https://docs.aws.amazon.com/CDK/latest/userguide/use_cfn_template.html

【讨论】:

【参考方案5】:

CloudFormation 现在支持将现有资源导入堆栈:

来自 AWS 的公告:AWS CloudFormation Launches Resource Import

示例说明:HERE

【讨论】:

【参考方案6】:

Cloudformer 可能会帮助您从现有资源创建新堆栈,然后您可以向堆栈添加更多资源。但不知道如何将现有堆栈与堆栈外的现有资源“合并”。

【讨论】:

是的,我对此进行了调查,但我真的不想走创建新堆栈的方式。现在,我可以继续像以前那样管理堆栈外的一些资源,但我很好奇此时是否有办法将这些资源合并到现有堆栈中。谢谢!【参考方案7】:

在我的情况下,我需要从我的账户中现有的 SAM 输出中导入一个 ARN 值,以便我可以在我的新堆栈中添加正确的调用策略。

我一直在寻找 SAM 的 Fn::ImportValue 的等效项,发现核心模块有一个静态的 Fn.importValue 方法,您可以这样使用:

const cdk = require('@aws-cdk/core');
const lambda = require('@aws-cdk/aws-lambda')

class MyStack extends cdk.Stack 
    constructor(scope, id, props) 
        super(scope, id, props);

        // The below line did the trick
        const arn = cdk.Fn.importValue(`your-sam-function-export-name`)
        const myLambda = lambda.Function.fromFunctionArn(this, 'myLambda', arn)
        // ...
    



参考:https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_core.Fn.html

【讨论】:

以上是关于将现有 AWS 资源整合到 CloudFormation 堆栈中的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS CLI 将现有资源导入 CloudFormation

使用AWS CLI将现有资源导入CloudFormation

Terraform 和 AWS:修改现有策略

有没有办法使用 cloudformation 修改 AWS 现有资源?

如何修复漂移的 AWS CloudFormation 堆栈?

将现有 AWS CloudWatch 警报导出到 CloudFormation 模板