如何将 aws-cdk typescript stack class 构造函数中的定义提取到单独的文件中?
How to extract definitions inside aws-cdk typescript stack class constructor function into separate files?
使用 aws-cdk 进行试验,很容易看出 stack/backend 构造 class 文件会变得非常大。在这个 cdk Stack class 示例中(从 aws-cdk api-cors-lambda-crud-dynamodb 示例复制和修剪)是否有一种惯用的方法来提取 dynamodb、lambda 和 api网关构造函数定义出栈class 构造函数放到单独的文件中?它们都以 this
作为第一个参数。我想要一个单独的文件用于所有 lambda def,一个用于 db def,api 网关配置等,它们仍然在主堆栈 class 中引用。有没有一种方法可以做到这一点而不必为每个定义创建新的 classes?
export class ApiLambdaCrudDynamoDBStack extends cdk.Stack {
constructor(app: cdk.App, id: string) {
super(app, id);
const dynamoTable = new dynamodb.Table(this, "items", {
partitionKey: {
name: "itemId",
type: dynamodb.AttributeType.STRING
},
tableName: "items"
});
const getOneLambda = new lambda.Function(this, "getOneItemFunction", {
code: new lambda.AssetCode("src"),
handler: "get-one.handler",
runtime: lambda.Runtime.NODEJS_10_X,
environment: {
TABLE_NAME: dynamoTable.tableName,
PRIMARY_KEY: "itemId"
}
});
const getAllLambda = new lambda.Function(this, "getAllItemsFunction", {
code: new lambda.AssetCode("src"),
handler: "get-all.handler",
runtime: lambda.Runtime.NODEJS_10_X,
environment: {
TABLE_NAME: dynamoTable.tableName,
PRIMARY_KEY: "itemId"
}
});
dynamoTable.grantReadWriteData(getAllLambda);
dynamoTable.grantReadWriteData(getOneLambda);
const api = new apigateway.RestApi(this, "itemsApi", {
restApiName: "Items Service"
});
const items = api.root.addResource("items");
const getAllIntegration = new apigateway.LambdaIntegration(getAllLambda);
items.addMethod("GET", getAllIntegration);
const singleItem = items.addResource("{id}");
const getOneIntegration = new apigateway.LambdaIntegration(getOneLambda);
singleItem.addMethod("GET", getOneIntegration);
}
}
是的,您可以将它们分成各自的堆栈。 'LambdaStack'、'DynamoDbStack' 等
或者如果您不想直接在构造函数中使用它,您可以单独使用 'helper' 类。这是一个简单的 C# 示例:
public class ApiLambdaCrudDynamoDbStack : Stack
{
internal ApiLambdaCrudDynamoDbStack(Construct scope, string id) : base (scope, id)
{
var helper = new MyHelper();
helper.CreateTable(this, "My-Cool-Table");
}
}
public class MyHelper
{
public void CreateTable(Construct scope, string tableName)
{
var table = new Table(scope, "My-Table", new TableProps()
{
TableName = tableName
});
}
}
使用 aws-cdk 进行试验,很容易看出 stack/backend 构造 class 文件会变得非常大。在这个 cdk Stack class 示例中(从 aws-cdk api-cors-lambda-crud-dynamodb 示例复制和修剪)是否有一种惯用的方法来提取 dynamodb、lambda 和 api网关构造函数定义出栈class 构造函数放到单独的文件中?它们都以 this
作为第一个参数。我想要一个单独的文件用于所有 lambda def,一个用于 db def,api 网关配置等,它们仍然在主堆栈 class 中引用。有没有一种方法可以做到这一点而不必为每个定义创建新的 classes?
export class ApiLambdaCrudDynamoDBStack extends cdk.Stack {
constructor(app: cdk.App, id: string) {
super(app, id);
const dynamoTable = new dynamodb.Table(this, "items", {
partitionKey: {
name: "itemId",
type: dynamodb.AttributeType.STRING
},
tableName: "items"
});
const getOneLambda = new lambda.Function(this, "getOneItemFunction", {
code: new lambda.AssetCode("src"),
handler: "get-one.handler",
runtime: lambda.Runtime.NODEJS_10_X,
environment: {
TABLE_NAME: dynamoTable.tableName,
PRIMARY_KEY: "itemId"
}
});
const getAllLambda = new lambda.Function(this, "getAllItemsFunction", {
code: new lambda.AssetCode("src"),
handler: "get-all.handler",
runtime: lambda.Runtime.NODEJS_10_X,
environment: {
TABLE_NAME: dynamoTable.tableName,
PRIMARY_KEY: "itemId"
}
});
dynamoTable.grantReadWriteData(getAllLambda);
dynamoTable.grantReadWriteData(getOneLambda);
const api = new apigateway.RestApi(this, "itemsApi", {
restApiName: "Items Service"
});
const items = api.root.addResource("items");
const getAllIntegration = new apigateway.LambdaIntegration(getAllLambda);
items.addMethod("GET", getAllIntegration);
const singleItem = items.addResource("{id}");
const getOneIntegration = new apigateway.LambdaIntegration(getOneLambda);
singleItem.addMethod("GET", getOneIntegration);
}
}
是的,您可以将它们分成各自的堆栈。 'LambdaStack'、'DynamoDbStack' 等
或者如果您不想直接在构造函数中使用它,您可以单独使用 'helper' 类。这是一个简单的 C# 示例:
public class ApiLambdaCrudDynamoDbStack : Stack
{
internal ApiLambdaCrudDynamoDbStack(Construct scope, string id) : base (scope, id)
{
var helper = new MyHelper();
helper.CreateTable(this, "My-Cool-Table");
}
}
public class MyHelper
{
public void CreateTable(Construct scope, string tableName)
{
var table = new Table(scope, "My-Table", new TableProps()
{
TableName = tableName
});
}
}