You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:31:05