问题可能是由于 AWS CDK 在部署期间使用 CloudFormation 来管理资源。当需求没有发生变化时,CloudFormation 不会更新资源,这可能会导致在之后的部署中不再运行代码。为了避免这种情况,可以强制 CloudFormation 更新资源。这可以通过在 AWS CDK 中添加自定义资源并将其用作占位符来完成。
以下是一个使用自定义资源的示例:
import * as cdk from 'aws-cdk-lib';
import * as cloudformation from 'aws-cdk-lib/aws-cloudformation';
import * as iam from 'aws-cdk-lib/aws-iam';
export class MyStack extends cdk.Stack {
constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const resource = new cloudformation.CustomResource(this, 'MyResource', {
provider: cloudformation.CustomResourceProvider.lambda(new MyLambda(this, 'MyLambda')),
properties: {
// Add any required properties here
}
});
// Grant the IAM role used by CloudFormation to invoke the Lambda function
resource.role?.addToPolicy(new iam.PolicyStatement({
actions: ['lambda:InvokeFunction'],
resources: [resource.provider.serviceToken],
effect: iam.Effect.ALLOW,
}));
}
}
class MyLambda extends cdk.Construct implements cloudformation.ICustomResourceProvider {
public readonly serviceToken: string;
constructor(scope: cdk.Construct, id: string) {
super(scope, id);
// Define your Lambda function here
const fn = new lambda.Function(this, 'MyFn', {
runtime: lambda.Runtime.NODEJS_12_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('./my-lambda'),
});
this.serviceToken = fn.functionArn;
}
public async onCreate(_event: cloudformation.Event): Promise {
// Add code to run when the resource is created
return { status: cloudformation.OperationStatus.SUCCESS };
}
public async onUpdate(_event: cloudformation.Event): Promise {
// Add code to run when the resource is updated
return { status: cloudformation.OperationStatus.SUCCESS };
}
public async onDelete(_event: cloudformation.Event): Promise {
// Add code to run when the resource is deleted
return { status: cloudformation.OperationStatus.SUCCESS };
}
}
此代码创建了一个自定义资源,其中可以运行特定的代码