我正在尝试简单的 CDK 教程,但是我遇到了一些错误。
我的代码就是这样,
Argument of type 'App' is not assignable to parameter of type 'Construct'.
Type 'App' is missing the following properties from type 'Construct': onValidate, onPrepare, onSynthesize, validate, and 2 more.
7 new HelloCdkStack(app, 'HelloCdkStack', {
不知何故,这个错误出现了,但在一些使用
cdk.App()
的教程中。为什么会出现这个错误??
import * as cdk from "@aws-cdk/core";
import {Table, AttributeType} from "@aws-cdk/aws-dynamodb";
export class HelloCdkStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new Table(this, "items", {
partitionKey: {
name: "itemId",
type: AttributeType.STRING,
},
tableName: "items",
removalPolicy: cdk.RemovalPolicy.DESTROY, // NOT recommended for production code
});
// The code that defines your stack goes here
// example resource
// const queue = new sqs.Queue(this, 'HelloCdkQueue', {
// visibilityTimeout: cdk.Duration.seconds(300)
// });
}
}
const app = new cdk.App();
new HelloCdkStack(app, "HelloCdkStack");
app.synth();
在 AWS CDK 1.x 中,导入是使用 import were made from '@aws-cdk/core' 完成的。这在 CDK 2.x 中发生了变化,其中导入是从 aws-cdk-lib 包进行的。
许多教程仍然使用 CDK 1.x,而 CDK 的起始代码使用 2.x。这就是为什么您会出现差异,因为应用程序初始化的代码会说使用较新的模块,而教程会假设您会以旧的方式执行此操作。
要解决这个问题,
import { Stack, StackProps } from 'aws-cdk-lib';
或
import * as cdk from '@aws-cdk/core';
AWS CDK 2.x 文档:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html
AWS CDK 1.x 文档:https://docs.aws.amazon.com/cdk/api/v1/docs/aws-construct-library.html
转到
cdk_primer-stack.ts
文件并将核心 SDK 的导入从 import * as cdk from 'aws-cdk-lib';
修复为 import * as cdk from '@aws-cdk/core';
问题是您在文件中使用的 CDK Core 版本与在 cdk_primer-stack.ts
中导入的版本不同。
AWS 文档建议现在将 aws-cdk 从 CDK 1.x 升级到 CDK 2.x,可以像这样导入:
import {} from "aws-cdk-lib";
现在来到错误部分,我们不必单独导入“@aws-cdk/aws-dynamodb”或“@aws-cdk/aws-ecs”。在V2中会出现上述错误。相反,将其更改为:
import { Stack, StackProps, aws_dynamodb as dynamodb, aws_ecs as ecs } from 'aws-cdk-lib';
这称为经典导入。请参阅此处:https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#classic-import
然后在如下代码中使用它:
export class AwsBackendStack extends Stack {
constructor(scope: App, id: string, props?: StackProps) {
super(scope, id, props);
const table = new dynamodb.Table(this, 'table_name', {
partitionKey: {name: 'id', type: dynamodb.AttributeType.STRING}
});
....rest of the code
}
}
这会很有魅力。