CFT到CDK的迁移-如何从CDK代码引用CFT创建的对象



我阅读了关于如何将Cloud Formation Template(CFT(导入CDK代码的描述。

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

这意味着,如果无法从CDK引用CFT对象,那么从CFT移动到CDK是一个完整的叉车升级。虽然这听起来不太正确,但这将是收养的一个重大障碍。

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

CDK创建的Lambda函数使用CFT中创建的DynamoDB表
  • CDK创建的Lambda函数附加到在CFT中创建的API网关
  • CDK创建的Lambda函数附加到CFT中创建的appsync解析器
  • 或者CDK代码使用CFT对象的任何其他示例
  • 我注意到文档告诉您如何获得ARN,但没有告诉您如何在CDK代码中使用该ARN。

    您引用的博客系列的第二部分给出了两个示例,一个用于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
    });
    

    一些API明确支持引用现有或待创建的实例。有些人没有。因此,请求的用例不能全部得到支持。以下是列表的状态和当前的支持,然后是一个有效的完整示例。遗憾的是,最简单的东西可以工作,而最复杂的构造(如ApiGateway和AppSync(则不能。这意味着叉车升级。

    注意:AWS可能会修复此问题,请参阅以获取更新

    1. CDK创建的Lambda函数使用在CFT-Works中创建的DynamoDB表。请参阅下面的示例
    2. CDK创建的Lambda函数附加到在CFT-ApiGateway中创建的API网关,该网关具有fromXXX函数,但不能解析为有用的对象。请参阅
    3. CDK创建的Lambda函数附加到在CFT中创建的appsync解析器上-appsync处于公测版,没有fromXXX函数。请参阅

    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);
    

    最新更新