Python AWS CDK自定义资源仅在第一次执行

use*_*358 0 python python-3.x aws-cdk aws-cdk-custom-resource

我已将 Python 3.8 lambda 函数连接为 cdk 堆栈中的自定义资源。堆栈运行并触发 lambda 执行。然而,在堆栈的后续更新中,它不会执行任何调用 lambda 自定义资源的操作。

这是拉姆达

def lambda_handler(event, context):
   print('lambda executed')
   print('request: {}'.format(json.dumps(event)))
   return { 'PhysicalResourceId': "1234" }
Run Code Online (Sandbox Code Playgroud)

这就是它在堆栈中的连接方式

from constructs import Construct
from aws_cdk import (
    Stack,
    custom_resources as cr,
    aws_lambda as _lambda,
    CustomResource
)

cust_res_lambda = _lambda.Function(
   self, 'crLambda',
   runtime=_lambda.Runtime.PYTHON_3_8,
   code=_lambda.Code.from_asset('my-resources'),
   handler='lambda.lambda_handler',
   function_name='cr_Lambda'
)
        
res_provider = cr.Provider(
   self,'crProvider',
   on_event_handler= cust_res_lambda
)
            
CustomResource(self, 'cust_res',service_token= res_provider.service_token,properties={"curr_account":"4563563","curr_region":"us-east-1", "res_id": ''})
Run Code Online (Sandbox Code Playgroud)

为什么我第二次部署 cdk 堆栈时没有调用自定义资源 lambda?

fed*_*nev 5

TL;DR 因为您的资源没有改变。

docs:当您将 Lambda 函数与自定义资源关联时,每当创建、更新或删除自定义资源时都会调用该函数。

换句话说,当自定义资源添加到堆栈、从堆栈中删除或其属性发生更改时,CloudFormation(潜伏在 CDK 抽象后面)将调用您的 Lambda。1

因此,如果您希望在每次部署时调用 CR Lambda 的风格2 ,请包含时间戳作为属性。时间戳值将更改每次部署,导致 CR Lambda 触发更新事件。


  1. 此行为模仿 CloudFormation 处理“常规”资源的方式。如果您的模板是使用未更改的 S3 存储桶配置进行第二次部署的,则 CloudFormation 将不会触及它。
  2. 考虑触发器构造,这是一种更易于使用的更高级别的 CR 实现。它有一个executeOnEveryDeployment选项。