【问题标题】:CFT to CDK migration - how to reference CFT created objects from CDK codeCFT 到 CDK 迁移 - 如何从 CDK 代码引用 CFT 创建的对象
【发布时间】:2020-04-02 04:07:04
【问题描述】:

我阅读了this description,了解如何将云形成模板 (CFT) 导入您的 CDK 代码。

这很有趣,但似乎没有一种方法可以在 CDK 代码中使用由 CFT 创建的任何对象。因此,例如,如果您在 CFT 中定义了一个 apigateway 或 appsync 实例,并希望使用非常好的机制在 CDK 中创建 Lambda 函数,那么似乎没有办法将 Lambda 函数附加到 apigateway 或 appsync 实例。

这意味着如果无法从 CDK 引用 CFT 对象,则从 CFT 迁移到 CDK 是一次完整的叉式升级。但这听起来不对,这将是采用的一个重大障碍。

如何在 CDK 代码中引用 CFT 创建的对象?以下是四个可能的示例,其中任何一个的解决方案都应该能够通过揭示要使用的代码模式来回答问题:

  1. CDK 创建的 Lambda 函数使用在 CFT 中创建的 DynamoDB 表
  2. 由 CDK 创建的 Lambda 函数附加到在 CFT 中创建的 API 网关
  3. 由 CDK 创建的 Lambda 函数附加到在 CFT 中创建的 appsync 解析器
  4. 或任何其他 CDK 代码使用 CFT 对象的示例。

我注意到documentation tells you how to get an an ARN,但没有告诉您可以在 CDK 代码中使用该 ARN 做什么。

【问题讨论】:

    标签: amazon-cloudformation aws-cdk


    【解决方案1】:

    you referenced 给出两个例子的博客系列的second part,一个用于VPC,一个用于ALB。

    如何引用现有资源?

    大多数情况下,需要引用已在您的 AWS 账户中创建的现有资源。通过另一个 CloudFormation 堆栈或另一个 CDK 应用程序。

    为此,许多 CDK 构造都支持 fromXXX() 方法。

    VPC 示例

    const vpc = Vpc.fromLookup(this, 'MyExistingVPC', { isDefault: true });
    

    示例 ALB

    const existingAlb = elb.ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes(this, "ImportedALB", {
      loadBalancerArn: "arn:aws:elasticloadbalancing:eu-west-1:123456789012...",
      securityGroupId: "MyAlbSecurityGroupA12345AB"
    });
    

    然后,您可以将现有资源引用用作 CDK 代码中的对象。这是一个使用 VPC 的示例。

    const fn = new lambda.Function(this, 'MyFunction', {
      runtime: lambda.Runtime.NODEJS_10_X,
      handler: 'index.handler',
      code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
      vpc: vpc
    });
    

    【讨论】:

    • fromXXXX 方法似乎不适用于 ApiGateway,它创建的是 iRestAPI 而不是 RestApi // this fails because api is of type IRestAPI not RestApi api.root.addMethod("GET", getWidgetsIntegration); // GET /
    • api.root.addMethod("GET", getWidgetsIntegration); 将修改您的 RestAPI。我给出的答案与从 CDK 应用程序中引用外部资源有关。在 ApplicationLoadBalancer 类下查找 fromApplicationLoadBalancerAttributes 方法。 docs.aws.amazon.com/cdk/api/latest/typescript/api/…
    • 我认为很少有 API 允许导入。 LoadBalancer 和 VPC 是的。 ApiGateway 和 AppSync,没有。唉,很难找到一个规范的列表,因为文档的搜索功能非常有限。
    • docs.aws.amazon.com/cdk/api/latest/docs/… 显示了 ApiGateway fromRestApiId 方法。它返回 IRestAPI,它是一个接口。在我看来,您正在尝试从 CDK 中修改以前在 CDK 之外创建的资源。对吗?
    • 我不确定“修改”资源和“添加到资源”之间的区别,因为将Methods 添加到 API 网关,但我猜答案是“是”。
    【解决方案2】:

    某些 API 明确支持引用现有或将要创建的实例。有些没有。因此,不能全部支持所要求的用例。这是列表的状态和当前支持的支持,然后是一个完整的示例。唉,最简单的东西可以工作,而最复杂的结构(例如 ApiGateway 和 AppSync)却不行。这意味着叉车升级。

    注意:AWS 可能会解决此问题,see for updates

    1. CDK 创建的 Lambda 函数使用在 CFT 中创建的 DynamoDB 表 - Works。请参见下面的示例。
    2. 由 CDK 创建的 Lambda 函数附加到在 CFT 中创建的 API 网关 - ApiGateway 具有 fromXXX 函数,但不能解析为有用的对象。 See
    3. 由 CDK 创建的 Lambda 函数附加到在 CFT 中创建的 appsync 解析程序 - AppSync 处于公开测试阶段,没有 fromXXX 函数。 See

    CFT 中的示例 DynamoDB 实例,添加使用表的 lambda 函数

    const existingTemplate = new cdk.CfnInclude(this, "ExistingInfrastructure", {
      template: yamlParse(fs.readFileSync("aws-stack.yaml").toString())
    });
    const ddbArn = cdk.Fn.getAtt("DynamoDBUserTable", "Arn");   // DynamoDBUserTable is a named element in aws-stack.yaml of type DynamoDB::Table
    const userTable = dynamodb.Table.fromTableArn(this, 'importedTable', ddbArn.toString());
    const handler = new lambda.Function(this, "UserGetHandler", {
      runtime: lambda.Runtime.NODEJS_10_X, // So we can use async in user-get.js
      code: lambda.Code.asset("resources"),
      handler: "user-get.main",
    });
    
    userTable.grantReadWriteData(handler);
    

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 2020-03-07
      • 2021-11-27
      • 2020-01-11
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      相关资源
      最近更新 更多