Skip to content

Commit e28440b

Browse files
authored
refactor(iot): migrate to aws-sdk v3 (aws#8054)
## Problem AWS SDK V2 is at EOL. All clients should migrate to V3. ## Solution Migrate IoT client to AWS SDK V3. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent d5b55f7 commit e28440b

File tree

9 files changed

+853
-297
lines changed

9 files changed

+853
-297
lines changed

package-lock.json

Lines changed: 415 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,7 @@
539539
"@types/whatwg-url": "^11.0.4",
540540
"@types/xml2js": "^0.4.11",
541541
"@vue/compiler-sfc": "^3.3.2",
542+
"aws-sdk-client-mock": "^4.1.0",
542543
"c8": "^9.0.0",
543544
"circular-dependency-plugin": "^5.2.2",
544545
"css-loader": "^6.10.0",
@@ -580,6 +581,8 @@
580581
"@aws-sdk/client-ec2": "<3.731.0",
581582
"@aws-sdk/client-glue": "^3.852.0",
582583
"@aws-sdk/client-iam": "<3.731.0",
584+
"@aws-sdk/client-iot": "~3.693.0",
585+
"@aws-sdk/client-iotsecuretunneling": "~3.693.0",
583586
"@aws-sdk/client-lambda": "<3.731.0",
584587
"@aws-sdk/client-s3": "<3.731.0",
585588
"@aws-sdk/client-s3-control": "^3.830.0",

packages/core/src/awsService/iot/commands/attachCertificate.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { createQuickPick, DataQuickPickItem } from '../../../shared/ui/pickerPro
1212
import { PromptResult } from '../../../shared/ui/prompter'
1313
import { IotClient } from '../../../shared/clients/iotClient'
1414
import { isValidResponse } from '../../../shared/wizards/wizard'
15-
import { Iot } from 'aws-sdk'
15+
import { Certificate, ListCertificatesResponse } from '@aws-sdk/client-iot'
1616

1717
export type CertGen = typeof getCertList
1818

@@ -53,8 +53,8 @@ export async function attachCertificateCommand(node: IotThingNode, promptFun = p
5353
/**
5454
* Prompts the user to pick a certificate to attach.
5555
*/
56-
async function promptForCert(iot: IotClient, certFetch: CertGen): Promise<PromptResult<Iot.Certificate>> {
57-
const placeHolder: DataQuickPickItem<Iot.Certificate> = {
56+
async function promptForCert(iot: IotClient, certFetch: CertGen): Promise<PromptResult<Certificate>> {
57+
const placeHolder: DataQuickPickItem<Certificate> = {
5858
label: 'No certificates found',
5959
data: undefined,
6060
}
@@ -71,10 +71,10 @@ async function promptForCert(iot: IotClient, certFetch: CertGen): Promise<Prompt
7171
*/
7272
async function* getCertList(iot: IotClient) {
7373
let marker: string | undefined = undefined
74-
let filteredCerts: Iot.Certificate[]
74+
let filteredCerts: Certificate[]
7575
do {
7676
try {
77-
const certResponse: Iot.ListCertificatesResponse = await iot.listCertificates({ marker })
77+
const certResponse: ListCertificatesResponse = await iot.listCertificates({ marker })
7878
marker = certResponse.nextMarker
7979

8080
/* These fields should always be defined when using the above API,

packages/core/src/lambda/remoteDebugging/ldkClient.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44
*/
55

66
import * as vscode from 'vscode'
7-
import { IoTSecureTunneling, Lambda } from 'aws-sdk'
7+
import { Lambda } from 'aws-sdk'
8+
import {
9+
CloseTunnelCommand,
10+
IoTSecureTunnelingClient,
11+
ListTunnelsCommand,
12+
OpenTunnelCommand,
13+
RotateTunnelAccessTokenCommand,
14+
} from '@aws-sdk/client-iotsecuretunneling'
815
import { getClientId } from '../../shared/telemetry/util'
916
import { DefaultLambdaClient } from '../../shared/clients/lambdaClient'
1017
import { LocalProxy } from './localProxy'
@@ -61,7 +68,7 @@ export class LdkClient {
6168
private localProxy: LocalProxy | undefined
6269
private static instanceCreating = false
6370
private lambdaClientCache: Map<string, DefaultLambdaClient> = new Map()
64-
private iotSTClientCache: Map<string, IoTSecureTunneling> = new Map()
71+
private iotSTClientCache: Map<string, IoTSecureTunnelingClient> = new Map()
6572

6673
constructor() {}
6774

@@ -97,9 +104,9 @@ export class LdkClient {
97104
return this.lambdaClientCache.get(region)!
98105
}
99106

100-
private async getIoTSTClient(region: string): Promise<IoTSecureTunneling> {
107+
private getIoTSTClient(region: string): IoTSecureTunnelingClient {
101108
if (!this.iotSTClientCache.has(region)) {
102-
this.iotSTClientCache.set(region, await getIoTSTClientWithAgent(region))
109+
this.iotSTClientCache.set(region, getIoTSTClientWithAgent(region))
103110
}
104111
return this.iotSTClientCache.get(region)!
105112
}
@@ -124,13 +131,13 @@ export class LdkClient {
124131
const vscodeUuid = getClientId(globals.globalState)
125132

126133
// Create IoTSecureTunneling client
127-
const iotSecureTunneling = await this.getIoTSTClient(region)
134+
const iotSecureTunneling = this.getIoTSTClient(region)
128135

129136
// Define tunnel identifier
130137
const tunnelIdentifier = `RemoteDebugging+${vscodeUuid}`
131138
const timeoutInMinutes = 720
132139
// List existing tunnels
133-
const listTunnelsResponse = await iotSecureTunneling.listTunnels({}).promise()
140+
const listTunnelsResponse = await iotSecureTunneling.send(new ListTunnelsCommand({}))
134141

135142
// Find tunnel with our identifier
136143
const existingTunnel = listTunnelsResponse.tunnelSummaries?.find(
@@ -150,20 +157,20 @@ export class LdkClient {
150157
return rotateResponse
151158
} else {
152159
// Close tunnel if less than 15 minutes remaining
153-
await iotSecureTunneling
154-
.closeTunnel({
160+
await iotSecureTunneling.send(
161+
new CloseTunnelCommand({
155162
tunnelId: existingTunnel.tunnelId,
156163
delete: false,
157164
})
158-
.promise()
165+
)
159166

160167
getLogger().info(`Closed tunnel ${existingTunnel.tunnelId} with less than 15 minutes remaining`)
161168
}
162169
}
163170

164171
// Create new tunnel
165-
const openTunnelResponse = await iotSecureTunneling
166-
.openTunnel({
172+
const openTunnelResponse = await iotSecureTunneling.send(
173+
new OpenTunnelCommand({
167174
description: tunnelIdentifier,
168175
timeoutConfig: {
169176
maxLifetimeTimeoutMinutes: timeoutInMinutes, // 12 hours
@@ -172,7 +179,7 @@ export class LdkClient {
172179
services: ['WSS'],
173180
},
174181
})
175-
.promise()
182+
)
176183

177184
getLogger().info(`Created new tunnel with ID: ${openTunnelResponse.tunnelId}`)
178185

@@ -189,13 +196,13 @@ export class LdkClient {
189196
// Refresh tunnel tokens
190197
async refreshTunnelTokens(tunnelId: string, region: string): Promise<TunnelInfo | undefined> {
191198
try {
192-
const iotSecureTunneling = await this.getIoTSTClient(region)
193-
const rotateResponse = await iotSecureTunneling
194-
.rotateTunnelAccessToken({
199+
const iotSecureTunneling = this.getIoTSTClient(region)
200+
const rotateResponse = await iotSecureTunneling.send(
201+
new RotateTunnelAccessTokenCommand({
195202
tunnelId: tunnelId,
196203
clientMode: 'ALL',
197204
})
198-
.promise()
205+
)
199206

200207
return {
201208
tunnelID: tunnelId,

packages/core/src/lambda/remoteDebugging/utils.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import IoTSecureTunneling from 'aws-sdk/clients/iotsecuretunneling'
6+
import { IoTSecureTunnelingClient } from '@aws-sdk/client-iotsecuretunneling'
77
import { DefaultLambdaClient } from '../../shared/clients/lambdaClient'
88
import { getUserAgent } from '../../shared/telemetry/util'
99
import globals from '../../shared/extensionGlobals'
@@ -29,13 +29,14 @@ export function getLambdaUserAgent(): string {
2929
return `${getUserAgent({ includePlatform: true, includeClientId: true })}`
3030
}
3131

32-
export function getIoTSTClientWithAgent(region: string): Promise<IoTSecureTunneling> {
32+
export function getIoTSTClientWithAgent(region: string): IoTSecureTunnelingClient {
3333
const customUserAgent = `${customUserAgentBase} ${getUserAgent({ includePlatform: true, includeClientId: true })}`
34-
return globals.sdkClientBuilder.createAwsService(
35-
IoTSecureTunneling,
36-
{
37-
customUserAgent,
34+
return globals.sdkClientBuilderV3.createAwsService({
35+
serviceClient: IoTSecureTunnelingClient,
36+
clientOptions: {
37+
userAgent: [[customUserAgent]],
38+
region,
3839
},
39-
region
40-
)
40+
userAgent: false,
41+
})
4142
}

0 commit comments

Comments
 (0)