关于AwsCustomResource多操作及IoT ThingType删除的技术咨询
AWS IoT ThingType 自定义资源删除问题解决方案
我创建了一个自定义AWS CDK资源来管理IoT ThingType(AWS尚未将其实现为原生CloudFormation对象),代码如下:
String physicalResIdThingType = "ThisISMyThing"; AwsCustomResource.Builder.create(this, "myThingType") .onCreate(AwsSdkCall.builder() .service("Iot") .action("createThingType") .physicalResourceId(PhysicalResourceId.of(physicalResIdThingType)) .parameters(new HashMap() {{ put("thingTypeName", "myThingType"); }}) .build()) .onDelete(AwsSdkCall.builder() .service("Iot") .action("deleteThingType") .physicalResourceId(PhysicalResourceId.of(physicalResIdThingType)) .parameters(new HashMap() {{ put("thingTypeName", "myThingType"); }}).build()) .policy(AwsCustomResourcePolicy.fromSdkCalls(SdkCallsPolicyOptions.builder() .resources(AwsCustomResourcePolicy.ANY_RESOURCE) .build())) .installLatestAwsSdk(false) .resourceType(Consts.CUSTOM_RESOURCE_THING_TYPE) .build();
该资源创建正常,但删除时失败——因为AWS IoT要求ThingType必须先弃用,且弃用后需要等待约5分钟才能执行删除操作。针对以下问题给出解决方案:
1. 是否可跳过该弃用步骤?
不行。AWS IoT的ThingType机制明确要求:只有处于已弃用(DEPRECATED)状态的ThingType才能被删除,没有官方途径跳过这个步骤。这是为了防止误删仍被Thing实例关联的ThingType,避免引发依赖错误。
2. 若不可行,能否无需自定义Lambda函数即可执行多个AwsSdkCall?
可以。AWS CDK的AwsCustomResource支持在单个生命周期钩子(比如onDelete)中执行多步顺序调用,无需额外编写自定义Lambda。你可以通过向onDelete传入多个AwsSdkCall组成的列表来实现(注意部分CDK版本需使用actions参数而非单个action)。
3. 若以上均不可行,如何通过AwsCustomResource实现ThingType的删除?
结合弃用、等待、删除三个步骤调整onDelete逻辑即可,具体实现如下:
修改后的代码示例
String physicalResIdThingType = "ThisISMyThing"; String thingTypeName = "myThingType"; AwsCustomResource.Builder.create(this, "myThingType") .onCreate(AwsSdkCall.builder() .service("Iot") .action("createThingType") .physicalResourceId(PhysicalResourceId.of(physicalResIdThingType)) .parameters(Map.of("thingTypeName", thingTypeName)) .build()) .onDelete(List.of( // 步骤1:弃用ThingType AwsSdkCall.builder() .service("Iot") .action("deprecateThingType") .parameters(Map.of("thingTypeName", thingTypeName)) .build(), // 步骤2:等待5分钟(300秒)——使用CDK内置的延迟机制或自定义Lambda AwsSdkCall.builder() .service("Lambda") .action("invoke") .parameters(Map.of( "FunctionName", "arn:aws:lambda:你的区域:你的账号ID:function:cdk-wait-function", "Payload", "{\"waitSeconds\": 300}" )) .build(), // 步骤3:执行删除操作 AwsSdkCall.builder() .service("Iot") .action("deleteThingType") .parameters(Map.of("thingTypeName", thingTypeName)) .build() )) .policy(AwsCustomResourcePolicy.fromSdkCalls(SdkCallsPolicyOptions.builder() .resources(AwsCustomResourcePolicy.ANY_RESOURCE) .build())) .installLatestAwsSdk(false) .resourceType(Consts.CUSTOM_RESOURCE_THING_TYPE) .build();
注意事项
- 确保自定义资源的IAM权限包含
iot:DeprecateThingType、iot:DeleteThingType以及Lambda调用权限(如果使用Lambda等待) - 等待时间建议设置为300秒以上,避免AWS内部同步延迟导致删除失败
- 可在删除步骤中配置重试逻辑,应对偶尔的同步问题
内容的提问来源于stack exchange,提问作者Raziza O
相关产品推荐
相关产品推荐

