<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>AWS Developer Tools Blog</title>
	<atom:link href="https://aws.amazon.com/blogs/developer/feed/" rel="self" type="application/rss+xml"/>
	<link>https://aws.amazon.com/blogs/developer/</link>
	<description/>
	<lastBuildDate>Mon, 03 Aug 2026 21:03:09 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Announcing General Availability of DynamoDB Mapper for Kotlin</title>
		<link>https://aws.amazon.com/blogs/developer/announcing-general-availability-of-dynamodb-mapper-for-kotlin/</link>
					
		
		<dc:creator><![CDATA[Ian Botsford]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 21:03:09 +0000</pubDate>
				<category><![CDATA[Amazon DynamoDB]]></category>
		<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[aws-sdk]]></category>
		<category><![CDATA[SDK]]></category>
		<guid isPermaLink="false">34edb7cf9df69fa2be1810527091c5cad7c7d5bb</guid>

					<description>DynamoDB Mapper for Kotlin is now generally available, giving Kotlin developers a fully idiomatic way to read, write, and query Amazon DynamoDB using natural Kotlin data types without managing low-level API details. Since the Developer Preview launch in October 2024, we’ve added significant new capabilities based on community feedback including the updateItem operation, batch and […]</description>
										<content:encoded>&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper.html"&gt;DynamoDB Mapper for Kotlin&lt;/a&gt; is now generally available, giving Kotlin developers a fully idiomatic way to read, write, and query &lt;a href="https://aws.amazon.com/dynamodb/"&gt;Amazon DynamoDB&lt;/a&gt; using natural Kotlin data types without managing low-level API details. Since the &lt;a href="https://aws.amazon.com/blogs/developer/announcing-dev-preview-of-dynamodb-mapper-for-kotlin/"&gt;Developer Preview launch in October 2024&lt;/a&gt;, we’ve added significant new capabilities based on community feedback including the &lt;code&gt;updateItem&lt;/code&gt; operation, batch and transaction operations, atomic counters, TTL management, and more. These features make DynamoDB Mapper a complete, production-ready solution for Kotlin developers working with DynamoDB.&lt;/p&gt; 
&lt;p&gt;DynamoDB Mapper is a high-level library that provides idiomatic ways to map data between your Kotlin data classes and Amazon DynamoDB tables. It handles schema generation, type conversion, and expression building so you can focus on your business logic instead of low-level DynamoDB API details. In this post I demonstrate the features, call patterns, and API of DynamoDB Mapper.&lt;/p&gt; 
&lt;h1&gt;Getting started&lt;/h1&gt; 
&lt;p&gt;Start by adding the DynamoDB Mapper dependencies and schema generator plugin to your Gradle build:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;// build.gradle.kts
plugins {
    kotlin("jvm") version "2.4.20"
    id("aws.sdk.kotlin.hll.dynamodbmapper.schema.generator")
}

dependencies {
    implementation("aws.sdk.kotlin:dynamodb-mapper:$sdkVersion")
    implementation("aws.sdk.kotlin:dynamodb-mapper-annotations:$sdkVersion")
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Annotate a data class and let the plugin generate the schema at build time:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;@DynamoDbItem
data class Order(
    @DynamoDbPartitionKey  val customerId: String,
    @DynamoDbSortKey val orderId: String,
    val status: String,
    val totalCents: Long,
    val productSkus: List&amp;lt;String&amp;gt;,
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Then use the mapper with type-safe operations:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;val client = DynamoDbClient.fromEnvironment()
val mapper = DynamoDbMapper(client)
val ordersTable = mapper.getOrderTable("orders")

// Write an item
val order = Order(
    customerId = "customer-123",
    orderId = "ORDER#2026-07-08#001",
    status = "PENDING",
    totalCents = 4_999L,
    productSkus = listOf("SKU-1", "SKU-2"),
)
ordersTable.putItem(order)

// Get an item by its partition key and sort key
val fetched = ordersTable.getItem("customer-123", "ORDER#2026-07-08#001").item
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;DynamoDB Mapper automatically generates code for your data classes including item schemas (for example, &lt;code&gt;OrderItemSchema&lt;/code&gt;) and extension methods (for example, &lt;code&gt;Table.getOrderTable&lt;/code&gt;).&lt;/p&gt; 
&lt;h1&gt;Features available since Developer Preview&lt;/h1&gt; 
&lt;p&gt;The Developer Preview release of DynamoDB Mapper supported many fundamental features which are unchanged in the GA release including:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Automatic mapping between DynamoDB items and idiomatic Kotlin types&lt;/strong&gt;. Work with your own data classes and business types rather than low-level attributes. The mapper uses item schemas to control the transformation of data from your business logic into DynamoDB’s API. This keeps your code type-safe, clean, and maintainable. You can generate schemas automatically from your existing data classes or provide completely custom schema implementations for finer control. For an introduction to the mapping features, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-get-started.html"&gt;Get started with DynamoDB Mapper&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Annotation-driven schema generation&lt;/strong&gt;. Add annotations to your existing data classes and the mapper’s schema generator plugin for Gradle generates item converters, schemas, and even extension functions for convenient access to tables. For more details, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-anno-schema-gen.html"&gt;Generate a schema from annotations&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Support for the &lt;code&gt;deleteItem&lt;/code&gt;, &lt;code&gt;getItem&lt;/code&gt;, &lt;code&gt;putItem&lt;/code&gt;, &lt;code&gt;queryPaginated&lt;/code&gt;, and &lt;code&gt;scanPaginated&lt;/code&gt; operations&lt;/strong&gt;. Key CRUD operations are made available as APIs that closely parallel DynamoDB’s low-level API—except operating on your Kotlin-level types instead of items and attributes. Like the low-level DynamoDB client for Kotlin, the mapper’s operations are fully integrated with Kotlin coroutines. One-shot operations use &lt;code&gt;suspend&lt;/code&gt; methods and paginated operations return &lt;code&gt;Flow&amp;lt;T&amp;gt;&lt;/code&gt; values. For more details, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-operations.html"&gt;Operations overview&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;DSL syntax for filter expressions&lt;/strong&gt;. The Kotlin language provides excellent support for domain-specific languages for more natural interaction with structured data. DynamoDB Mapper continues this tradition with an expressive syntax for defining filter criteria, forming attribute paths, and constructing complex boolean logic. For more details, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-expressions.html"&gt;Use expressions&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;And many more&lt;/strong&gt;! For a full recap, see &lt;a href="https://blog-statistics.wwso.aws.dev/blogs/detail?u=https%3A%2F%2Faws.amazon.com%2Fblogs%2Fdeveloper%2Fannouncing-dev-preview-of-dynamodb-mapper-for-kotlin%2F"&gt;Announcing the Developer Preview of DynamoDB Mapper for Kotlin&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;What’s new since Developer Preview&lt;/h1&gt; 
&lt;p&gt;The GA release expands on the Developer Preview to add more functionality for key use cases. Here are some of the highlights:&lt;/p&gt; 
&lt;h2&gt;Condition expressions&lt;/h2&gt; 
&lt;p&gt;Filter expressions were available in the Developer Preview for &lt;code&gt;queryPaginated&lt;/code&gt; and &lt;code&gt;scanPaginated&lt;/code&gt;. In GA, those expressions have been extended to optional conditions in the &lt;code&gt;deleteItem&lt;/code&gt;, &lt;code&gt;putItem&lt;/code&gt;, and &lt;code&gt;updateItem&lt;/code&gt; operations:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;ordersTable.putItem {
    item = newOrder
    condition { attr["orderId"].notExists() }
}

ordersTable.deleteItem {
    partitionKey = Key("customer-123")
    sortKey = Key("ORDER#2026-07-08#001")
    condition { attr["status"] eq "CANCELED" }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The new batch and transaction operations also support per-action conditions. For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-expressions.html"&gt;Use expressions&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;&lt;code&gt;updateItem&lt;/code&gt; and update expressions DSL&lt;/h2&gt; 
&lt;p&gt;With the newly-added &lt;code&gt;updateItem&lt;/code&gt; operation, you can perform partial, in-place updates on items without fetching and re-writing the entire object. The accompanying update DSL supports all four DynamoDB update actions—&lt;code&gt;SET&lt;/code&gt;, &lt;code&gt;REMOVE&lt;/code&gt;, &lt;code&gt;ADD&lt;/code&gt;, and &lt;code&gt;DELETE&lt;/code&gt;—with an idiomatic Kotlin syntax:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;ordersTable.updateItem {
    partitionKey = Key("customer-123")
    sortKey = Key("ORDER#2026-07-08#001")
    update {
        set {
            attr["status"] = "SHIPPED"
            attr["totalCents"] = attr["totalCents"] - 500L  // apply a discount
            attr["notes"] = attr["notes"] orElse "none"  // if_not_exists
            attr["productSkus"] = attr["productSkus"] appending listOf("SKU-9")
        }
        remove {
            -attr["couponCode"]  // remove an attribute
        }
        add {
            attr["tags"] += setOf("priority")  // add to a set
        }
        delete {
            attr["tags"] -= setOf("gift")  // remove from a set
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-expressions.html"&gt;Use expressions&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Batch operations&lt;/h2&gt; 
&lt;p&gt;Operate on items across multiple tables in a single call with &lt;code&gt;batchWriteItem&lt;/code&gt; and &lt;code&gt;batchGetItem&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;// Batch write: put and delete items in one call in one or more tables
mapper.batchWriteItem {
    table(ordersTable) {
        putItem(Order("customer-123", "ORDER#2026-07-08#001", "SHIPPED", 100_000L, listOf("SKU-1", "SKU-2"))
        putItem(Order("customer-123", "ORDER#2026-07-08#002", "REFUNDED", 39_000L, listOf("SKU-2", "SKU-4"))
        deleteKey(Key("customer-234", "ORDER#2026-07-02#006"))
    }
}

// Batch get: retrieve items by key from one or more tables
val response = mapper.batchGetItem {
    table(ordersTable) {
        key("customer-123", "ORDER#2026-07-08#001")
        key("customer-123", "ORDER#2026-07-08#002")
    }
}
val orders = response.table(ordersTable).items
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-batch.html"&gt;Perform batch operations&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Transactions&lt;/h2&gt; 
&lt;p&gt;Perform all-or-nothing operations across multiple tables with full ACID guarantees:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;val ordersTable = mapper.getOrderTable("orders")
val productsTable = mapper.getProductTable("products")
val customersTable = mapper.getCustomerTable("customers")

mapper.transactWriteItems {
    table(ordersTable) {
        put(newOrder) {
            condition { attr["orderId"].notExists() }
        }
    }
    table(productsTable) {
        update(Key("SKU-1")) {
            condition { attr["inventory"] gte 1L }
            update {
                set { attr["inventory"] = attr["inventory"] - 1 }
            }
        }
    }
    table(customersTable) {
        update(Key("customer-123")) {
            condition { attr["balanceCents"] gte 4_999L }
            update {
                set { attr["balanceCents"] = attr["balanceCents"] - 4_999L }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Transactional reads are also supported:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;val response = mapper.transactGetItems {
    table(ordersTable) { key("customer-123", "ORDER#2026-06-25#0042") }
    table(customersTable) { key("customer-123") }
}
val order = response.table(ordersTable).items.firstOrNull()
val customer = response.table(customersTable).items.firstOrNull()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-transactions.html"&gt;Perform transactional operations&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Atomic counters&lt;/h2&gt; 
&lt;p&gt;Annotate a numeric field with &lt;code&gt;@DynamoDbCounter&lt;/code&gt; to have it automatically incremented on every &lt;code&gt;putItem&lt;/code&gt; or &lt;code&gt;updateItem&lt;/code&gt; call. This feature is useful for view counts, sequence numbers, or inventory tracking:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;@DynamoDbItem
data class Product(
    @DynamoDbPartitionKey val sku: String,
    val name: String,
    val category: String,
    val priceCents: Long,
    @DynamoDbCounter var viewCount: Long = 0,
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-builtins.html"&gt;Built-in features&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;TTL management&lt;/h2&gt; 
&lt;p&gt;Annotate an attribute with &lt;code&gt;@DynamoDbTtlSeconds&lt;/code&gt; to have DynamoDB Mapper automatically set its value to the current time plus the specified lifetime (in seconds) whenever the item is written. This integrates with DynamoDB’s &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html"&gt;Time to Live&lt;/a&gt; feature to automatically delete expired items:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;@DynamoDbItem
data class ShoppingCart(
    @DynamoDbPartitionKey val sessionId: String,
    val productSkus: List&amp;lt;String&amp;gt;,
    @DynamoDbTtlSeconds(lifetime = 86_400) var expiresAt: Long,  // 24-hour TTL
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-builtins.html"&gt;Built-in features&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Custom attribute converters&lt;/h2&gt; 
&lt;p&gt;Use the &lt;code&gt;@DynamoDbAttributeConverter&lt;/code&gt; annotation to specify a custom converter for individual attributes. This is useful for types that DynamoDB Mapper doesn’t handle out of the box, like &lt;code&gt;UUID&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;object UuidConverter : ValueConverter&amp;lt;UUID&amp;gt; {
    override fun convertRight(from: UUID): AttributeValue = AttributeValue.S(from.toString())
    override fun convertLeft(from: AttributeValue): UUID = UUID.fromString(from.asS())
}

@DynamoDbItem
data class Order(
    @DynamoDbPartitionKey val customerId: String,
    @DynamoDbSortKey val orderId: String,
    // ...
    @DynamoDbAttributeConverter(UuidConverter::class)
    val idempotencyKey: UUID,
)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-code-schemas.html"&gt;Manually define schemas&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Secondary index annotations&lt;/h2&gt; 
&lt;p&gt;Secondary index querying was available in Developer Preview, but the GA release adds annotation-driven schema generation for index projections. You can now define a dedicated data class for your index’s projected attributes and generate its schema automatically:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-kotlin"&gt;@DynamoDbItem
data class ProductByCategory(
    @DynamoDbPartitionKey val category: String,
    @DynamoDbSortKey val priceCents: Long,
    val sku: String,
    val name: String,
)

// Use with a secondary index
val byCategory = productsTable.getIndex("products-by-category", ProductByCategorySchema)
val cheapElectronics = byCategory
    .queryPaginated {
        keyCondition = KeyFilter("Electronics", { sortKey lt 5_000L })
    }
    .items()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper-secondary-indexes.html"&gt;Use secondary indexes with DynamoDB Mapper&lt;/a&gt;.&lt;/p&gt; 
&lt;h1&gt;Bug fixes since Developer Preview&lt;/h1&gt; 
&lt;p&gt;The following bugs have been fixed since the initial release of Developer Preview:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Fixed key field conversion during paginated &lt;code&gt;Scan&lt;/code&gt; and &lt;code&gt;Query&lt;/code&gt; operations (&lt;a href="https://github.com/awslabs/aws-sdk-kotlin/issues/1596"&gt;#1596&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;Fixed schema code generation for nullable &lt;code&gt;List&lt;/code&gt; and &lt;code&gt;Map&lt;/code&gt; elements (&lt;a href="https://github.com/awslabs/aws-sdk-kotlin/issues/1590"&gt;#1590&lt;/a&gt;)&lt;/li&gt; 
 &lt;li&gt;Fixed condition expression mapping for operations that support conditions, such as &lt;code&gt;putItem&lt;/code&gt; and &lt;code&gt;deleteItem&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Breaking changes from Developer Preview&lt;/h1&gt; 
&lt;p&gt;If you were using the Developer Preview release, note these changes when upgrading:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;@DynamoDbItem&lt;/code&gt; annotation&lt;/strong&gt;: The &lt;code&gt;converterName: String&lt;/code&gt; parameter has been replaced with &lt;code&gt;converter: KClass&amp;lt;...&amp;gt;&lt;/code&gt; for type safety. 
  &lt;ul&gt; 
   &lt;li&gt;Example before: &lt;code&gt;@DynamoDbItem("my.custom.item.converter.MyEmployeeConverter")&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Example now: &lt;code&gt;@DynamoDbItem(MyEmployeeConverter::class)&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Converter interfaces refactored&lt;/strong&gt;: The &lt;code&gt;ItemConverter&lt;/code&gt; interface has been replaced with a simple type alias of &lt;code&gt;Converter&lt;/code&gt;. Item converter implementations no longer need to identify their keys or perform subset conversions. If you have any custom item converter implementations, they only need to implement &lt;code&gt;convertLeft&lt;/code&gt; and &lt;code&gt;convertRight&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;Filter&lt;/code&gt; → &lt;code&gt;FilterDsl&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;SortKeyFilter&lt;/code&gt; → &lt;code&gt;SortKeyFilterDsl&lt;/code&gt;&lt;/strong&gt;: The expression builder interfaces have been renamed for clarity.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Multi-attribute key types&lt;/strong&gt;: &lt;code&gt;KeySpec.String&lt;/code&gt; / &lt;code&gt;KeySpec.Number&lt;/code&gt; / &lt;code&gt;KeySpec.ByteArray&lt;/code&gt; have been replaced with &lt;code&gt;KeySpec.Key1&lt;/code&gt; through &lt;code&gt;KeySpec.Key4&lt;/code&gt; supporting composite keys. 
  &lt;ul&gt; 
   &lt;li&gt;Example before: &lt;code&gt;productsTable.getItem { partitionKey = "SKU-1" }&lt;/code&gt;&lt;/li&gt; 
   &lt;li&gt;Example now: &lt;code&gt;productsTable.getItem { partitionKey = Key("SKU-1") }&lt;/code&gt;&lt;/li&gt; 
  &lt;/ul&gt; &lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;code&gt;@ExperimentalApi&lt;/code&gt; annotations removed&lt;/strong&gt;: All APIs are now stable and production-ready.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h1&gt;Next steps&lt;/h1&gt; 
&lt;p&gt;In this post, I covered how to use some of the new features of DynamoDB Mapper for Kotlin. To get started with your own projects, check out:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/ddb-mapper.html"&gt;Developer Guide&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-kotlin/api/latest/dynamodb-mapper/aws.sdk.kotlin.hll.dynamodbmapper/-dynamo-db-mapper/"&gt;API Reference&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://github.com/aws/aws-sdk-kotlin"&gt;GitHub repository&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;We’d love to hear how you’re using DynamoDB Mapper. If you have questions, start a discussion on GitHub. If you’ve found a bug, &lt;a href="https://github.com/aws/aws-sdk-kotlin/issues/new/choose"&gt;file an issue&lt;/a&gt; on GitHub.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>AWS Durable Execution SDK for .NET now Generally Available</title>
		<link>https://aws.amazon.com/blogs/developer/aws-durable-execution-sdk-for-net-now-generally-available/</link>
					
		
		<dc:creator><![CDATA[Garrett Beatty]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 16:36:23 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS .NET Development]]></category>
		<category><![CDATA[AWS SDK for .NET]]></category>
		<category><![CDATA[aws-lambda]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[Lambda]]></category>
		<guid isPermaLink="false">f6ea5a4d5188e4162319019fdd64b4afdade8ac3</guid>

					<description>The AWS Lambda Durable Execution SDK for .NET is now generally available. AWS Lambda now supports durable executions for .NET, joining the existing Python, TypeScript, and Java SDKs. You install the SDK from NuGet, write your workflows in familiar C#, and deploy them with the AWS Extensions for .NET CLI – the same tools you […]</description>
										<content:encoded>&lt;p&gt;The &lt;a href="https://docs.aws.amazon.com/durable-execution/sdk-reference/languages/csharp/"&gt;AWS Lambda Durable Execution SDK for .NET&lt;/a&gt; is now generally available. &lt;a href="https://docs.aws.amazon.com/lambda/"&gt;AWS Lambda&lt;/a&gt; now supports durable executions for .NET, joining the existing Python, TypeScript, and Java SDKs. You install the SDK from NuGet, write your workflows in familiar C#, and deploy them with the &lt;a href="https://github.com/aws/aws-extensions-for-dotnet-cli"&gt;AWS Extensions for .NET CLI&lt;/a&gt; – the same tools you already use for Lambda functions today.&lt;/p&gt; 
&lt;p&gt;Your multi-step processes that charge cards, wait for approvals, or call external APIs need to survive interruptions. If your Lambda function times out or crashes between steps, you lose the work it already completed unless you build something to preserve it. On Lambda today, you build that yourself. You persist which steps completed and what each one returned. You retry failed calls, re-trigger the function after a delay, and determine where to resume when the next invocation starts. Every new workflow means more of this plumbing, more edge cases in the resume logic, and more code unrelated to your actual goal.&lt;/p&gt; 
&lt;p&gt;The AWS Durable Execution SDK handles all that coordination for you. You write your workflow in regular C# syntax. The SDK checkpoints progress after each step, retries failures with configurable backoff, and suspends execution during waits for up to a year &lt;a href="https://aws.amazon.com/lambda/pricing/"&gt;without billing you for compute while paused&lt;/a&gt;. If something interrupts your function, Lambda re-invokes it. The SDK replays from the last checkpoint and returns the cached result for every step that already completed. Your code reads like straightforward sequential logic. The checkpointing, replay, and recovery happen underneath.&lt;/p&gt; 
&lt;p&gt;In this post, you build an order processing workflow with the SDK. You use steps, retries, waits, and child contexts, then deploy it to the managed &lt;code&gt;dotnet10&lt;/code&gt; runtime.&lt;/p&gt; 
&lt;h2&gt;How Lambda durable functions work&lt;/h2&gt; 
&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-functions.html"&gt;Lambda durable functions&lt;/a&gt; extend the familiar Lambda programming model you already use. Your handler receives an &lt;code&gt;IDurableContext&lt;/code&gt; parameter. Its methods provide the durable operations: run checkpointed steps, wait, and receive external callbacks. The runtime uses a checkpoint-and-replay mechanism: after each operation completes, Lambda checkpoints the result. The AWS Durable Execution SDK makes your long-running workflows resilient automatically, so you do not have to write your own state management code.&lt;/p&gt; 
&lt;p&gt;The core operations on &lt;code&gt;IDurableContext&lt;/code&gt; are:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Steps&lt;/strong&gt;: &lt;code&gt;context.StepAsync&lt;/code&gt; runs a unit of work, checkpoints its result, and retries with configurable strategies. On replay, the step returns its cached value instead of running again.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Waits&lt;/strong&gt;: &lt;code&gt;context.WaitAsync&lt;/code&gt; suspends the workflow for a duration, from one second up to a year.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Child contexts&lt;/strong&gt;: &lt;code&gt;context.RunInChildContextAsync&lt;/code&gt; groups related steps into a single logical operation that checkpoints them together.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Callbacks&lt;/strong&gt;: &lt;code&gt;context.WaitForCallbackAsync&lt;/code&gt; suspends the workflow until an external system, such as a human approver, a webhook, or another service, delivers a result.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Parallel and map&lt;/strong&gt;: &lt;code&gt;context.ParallelAsync&lt;/code&gt; and &lt;code&gt;context.MapAsync&lt;/code&gt; distribute independent branches concurrently and aggregate their results.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Because the workflow code re-runs from the top on every invocation, it must be &lt;a href="https://docs.aws.amazon.com/durable-execution/patterns/best-practices/determinism/#handler-code-must-be-deterministic"&gt;deterministic&lt;/a&gt;: the same operations, in the same order, on each replay.&lt;/p&gt; 
&lt;h2&gt;Prerequisites&lt;/h2&gt; 
&lt;p&gt;Before you begin, make sure you have the following:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Install the &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;.NET 10 SDK&lt;/a&gt; or later.&lt;/li&gt; 
 &lt;li&gt;Configure AWS credentials by running &lt;code&gt;aws configure&lt;/code&gt; or set up credentials using your preferred method. For more information, see &lt;a href="https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/creds-assign.html"&gt;Configuring the AWS SDK for .NET&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Use credentials with permission to deploy and invoke Lambda functions and to create the function’s execution role. For more information, see &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/durable-security.html"&gt;Durable functions security&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Getting started&lt;/h2&gt; 
&lt;p&gt;The Durable Function blueprint ships with the &lt;a href="https://www.nuget.org/packages/Amazon.Lambda.Templates"&gt;Amazon.Lambda.Templates&lt;/a&gt; package and scaffolds a complete, deployable workflow. The following .NET CLI commands install the lambda tooling and create a new project from the Durable Function blueprint:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet tool install -g Amazon.Lambda.Tools
dotnet new install Amazon.Lambda.Templates
dotnet new lambda.DurableFunction -n OrderProcessor
cd OrderProcessor&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To deploy with a CloudFormation &lt;code&gt;serverless.template&lt;/code&gt; using &lt;a href="https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.Annotations"&gt;Lambda Annotations&lt;/a&gt;, use the &lt;code&gt;serverless.DurableFunction&lt;/code&gt; blueprint instead. To add the SDK to an existing project, run the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet add package Amazon.Lambda.DurableExecution&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Building a production-ready order processing workflow&lt;/h2&gt; 
&lt;p&gt;The &lt;a href="https://github.com/aws/aws-lambda-dotnet/blob/master/Blueprints/BlueprintDefinitions/vs2026/DurableFunction/template/src/BlueprintBaseName.1/Function.cs"&gt;blueprint&lt;/a&gt; scaffolds a complete order processing workflow in &lt;code&gt;Function.cs&lt;/code&gt;. The function validates an order, charges payment, waits out a settlement period, and ships the order, all as one method.&lt;/p&gt; 
&lt;h3&gt;Setup and entry point&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;Handler&lt;/code&gt; is the Lambda entry point the managed runtime invokes directly (via the &lt;code&gt;Assembly::Type::Method&lt;/code&gt; handler string in &lt;code&gt;aws-lambda-tools-defaults.json&lt;/code&gt;). &lt;code&gt;DurableFunction.WrapAsync&lt;/code&gt; bridges the durable invocation envelope to your strongly-typed &lt;code&gt;ProcessOrder&lt;/code&gt; workflow, so the workflow itself works with &lt;code&gt;OrderRequest&lt;/code&gt; and &lt;code&gt;OrderResult&lt;/code&gt; instead of the raw envelope.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;using Amazon.Lambda.Core;
using Amazon.Lambda.DurableExecution;
using Amazon.Lambda.Serialization.SystemTextJson;
using Microsoft.Extensions.Logging;

// The durable runtime reads this serializer off ILambdaContext.Serializer to (de)serialize the
// invocation envelope and every checkpointed step input/output.
[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]

namespace OrderProcessor;

public class Function
{
    public Task&amp;lt;DurableExecutionInvocationOutput&amp;gt; Handler(
        DurableExecutionInvocationInput input, ILambdaContext context)
        =&amp;gt; DurableFunction.WrapAsync&amp;lt;OrderRequest, OrderResult&amp;gt;(ProcessOrder, input, context);&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;The workflow method&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;ProcessOrder&lt;/code&gt; receives the order and an &lt;code&gt;IDurableContext&lt;/code&gt;, and the following snippets show the method body. Because the workflow re-runs from the top on every invocation, always log through &lt;code&gt;context.Logger&lt;/code&gt;. This logger suppresses log lines during replay, so a line appears once even if a 30-step workflow replays 30 times.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;public async Task&amp;lt;OrderResult&amp;gt; ProcessOrder(OrderRequest order, IDurableContext context)
{
    // The durable logger is replay-aware: this line is emitted once, not once per replay.
    context.Logger.LogInformation("Processing order {OrderId}", order.OrderId);&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Step 1: Validate the order&lt;/h3&gt; 
&lt;p&gt;This is a standard step. &lt;code&gt;StepAsync&lt;/code&gt; runs the body, checkpoints the result, and on replay returns the cached value instead of running the body again. The body receives an &lt;code&gt;IStepContext&lt;/code&gt; (its own replay-aware logger, the 1-based attempt number, and an operation ID) and a &lt;code&gt;CancellationToken&lt;/code&gt; linked to the workflow-shutdown signal. Each &lt;code&gt;StepAsync&lt;/code&gt; call is a checkpoint boundary.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var itemCount = await context.StepAsync(
    async (step, _) =&amp;gt;
    {
        await Task.CompletedTask;
        step.Logger.LogInformation("Validating order with {Count} item(s)", order.Items?.Length ?? 0);
        if (order.Items is null || order.Items.Length == 0)
            throw new InvalidOperationException("Order has no items.");
        return order.Items.Length;
    },
    name: "validate_order");&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Step 2: Charge payment with retries&lt;/h3&gt; 
&lt;p&gt;Payment gateways can return transient errors, so this step carries a retry policy. &lt;code&gt;RetryStrategy.Exponential&lt;/code&gt; retries transient failures with backoff and jitter, and the SDK checkpoints only the successful attempt. The built-in &lt;code&gt;RetryStrategy.Default&lt;/code&gt;, &lt;code&gt;RetryStrategy.Transient&lt;/code&gt;, and &lt;code&gt;RetryStrategy.None&lt;/code&gt; presets cover &lt;a href="https://docs.aws.amazon.com/durable-execution/sdk-reference/error-handling/retries/#retry-presets"&gt;common cases&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;StepSemantics.AtMostOncePerRetry&lt;/code&gt; keeps the SDK from silently re-running an attempt’s body if the function is interrupted mid-execution. Use it for non-idempotent side effects like charging a card or sending email, and use the default &lt;code&gt;AtLeastOncePerRetry&lt;/code&gt; for idempotent operations.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;AtMostOncePerRetry&lt;/code&gt; limits re-execution within a single attempt, not across the whole step. A step with retries configured can still run its body again on a later attempt. When an attempt is interrupted, it surfaces as a &lt;code&gt;StepInterruptedException&lt;/code&gt; and the retry strategy decides whether to start a new one. If you need the charge to run exactly once, combine &lt;code&gt;AtMostOncePerRetry&lt;/code&gt; with &lt;code&gt;RetryStrategy.None&lt;/code&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var transactionId = await context.StepAsync(
    async (step, ct) =&amp;gt;
    {
        // step.AttemptNumber is 1-based and increments on each retry, so log it so retries
        // are visible in the history. Forward ct to any cancellation-aware call (HttpClient,
        // the AWS SDK, Task.Delay) so the body unwinds cleanly if the workflow is torn down.
        step.Logger.LogInformation("Charging payment, attempt {Attempt}", step.AttemptNumber);
        await Task.Delay(TimeSpan.FromMilliseconds(50), ct);
        return $"txn-{order.OrderId}";
    },
    name: "charge_payment",
    config: new StepConfig
    {
        RetryStrategy = RetryStrategy.Exponential(
            maxAttempts: 5,
            initialDelay: TimeSpan.FromSeconds(2),
            maxDelay: TimeSpan.FromSeconds(30),
            backoffRate: 2.0),
        Semantics = StepSemantics.AtMostOncePerRetry,
    });&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Step 3: Wait out the settlement period&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;WaitAsync&lt;/code&gt; suspends the workflow for a fixed delay, anywhere from one second up to a year, and the runtime re-invokes the function when the timer fires. While the workflow is suspended, you are not billed for compute.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;await context.WaitAsync(TimeSpan.FromSeconds(5), name: "settlement_delay");&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Step 4: Ship the order in a child context&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;RunInChildContextAsync&lt;/code&gt; groups related steps into a single logical operation that checkpoints together. The &lt;code&gt;pack&lt;/code&gt; and &lt;code&gt;label&lt;/code&gt; steps run inside a nested &lt;code&gt;IDurableContext&lt;/code&gt; with its own operation-ID space. Checkpoints are what make the crash story work: if the function crashes after &lt;code&gt;charge_payment&lt;/code&gt; succeeds but before shipping, replay returns the cached transaction ID and resumes at the wait. The SDK never re-runs a charge that has already succeeded.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var trackingId = await context.RunInChildContextAsync(
    async (childContext, _) =&amp;gt;
    {
        await childContext.StepAsync(
            async (step, _) =&amp;gt;
            {
                await Task.CompletedTask;
                step.Logger.LogInformation("Packing order {OrderId}", order.OrderId);
                return "packed";
            },
            name: "pack");

        return await childContext.StepAsync(
            async (_, _) =&amp;gt; { await Task.CompletedTask; return $"trk-{order.OrderId}"; },
            name: "label");
    },
    name: "ship_order");&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Returning the result&lt;/h3&gt; 
&lt;p&gt;The workflow finishes by logging completion and returning an &lt;code&gt;OrderResult&lt;/code&gt; built from the values each step produced.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;context.Logger.LogInformation("Order {OrderId} shipped: {TrackingId}", order.OrderId, trackingId);

return new OrderResult
{
    OrderId = order.OrderId,
    Status = "shipped",
    ItemCount = itemCount,
    TransactionId = transactionId,
    TrackingId = trackingId,
};&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The workflow returns a plain &lt;code&gt;OrderResult&lt;/code&gt;. The input and output are simple POCOs:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;/// &amp;lt;summary&amp;gt;Input payload for the workflow.&amp;lt;/summary&amp;gt;
public class OrderRequest
{
    public string? OrderId { get; set; }
    public string[]? Items { get; set; }
}

/// &amp;lt;summary&amp;gt;Output payload returned when the workflow completes.&amp;lt;/summary&amp;gt;
public class OrderResult
{
    public string? OrderId { get; set; }
    public string? Status { get; set; }
    public int ItemCount { get; set; }
    public string? TransactionId { get; set; }
    public string? TrackingId { get; set; }
}&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Adding a human approval step&lt;/h3&gt; 
&lt;p&gt;The scaffolded workflow runs start to finish on its own. Real order pipelines often need a person in the loop: a manager signs off on a high-value order before it ships. Let’s edit the workflow to pause for that approval.&lt;/p&gt; 
&lt;p&gt;The following C# snippet adds a callback between the payment and settlement steps in &lt;code&gt;ProcessOrder&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;// Pause until a manager approves. The submitter runs once, handing the callback ID
// to whatever will resolve it later: a queue, a webhook, an approval UI.
var approval = await context.WaitForCallbackAsync&amp;lt;ApprovalResult&amp;gt;(
    submitter: async (callbackId, cbContext, ct) =&amp;gt;
    {
        await notificationService.RequestApprovalAsync(order.OrderId, callbackId, ct);
    },
    name: "manager_approval");&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;notificationService&lt;/code&gt; and &lt;code&gt;ApprovalResult&lt;/code&gt; here are placeholders for your own integration: the way you notify an approver that a decision is needed, and the shape of the result they send back. This snippet is an example showing where that integration plugs in. Replace these with the notification and response mechanisms your system uses.&lt;/p&gt; 
&lt;p&gt;When the workflow reaches this point it suspends and waits. The approval system resolves the callback by calling &lt;code&gt;SendDurableExecutionCallbackSuccess&lt;/code&gt; (or &lt;code&gt;SendDurableExecutionCallbackFailure&lt;/code&gt;) with that ID, and the workflow resumes from exactly where it was suspended. The approval can arrive seconds later or days later.&lt;/p&gt; 
&lt;h2&gt;Deploying the workflow&lt;/h2&gt; 
&lt;p&gt;Durable functions run on the managed &lt;code&gt;dotnet10&lt;/code&gt; runtime and deploy as a standard .zip package. A durable execution always runs against a published function version, so pass &lt;code&gt;--function-publish&lt;/code&gt; to publish a numbered version when you deploy. The following .NET CLI command deploys and publishes the function:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet lambda deploy-function --function-publish True&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You deploy a durable function with the same command as a standard Lambda function. The only difference is two configuration settings that &lt;code&gt;Amazon.Lambda.Tools&lt;/code&gt; exposes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;--durable-execution-timeout&lt;/code&gt; (&lt;code&gt;durable-execution-timeout&lt;/code&gt; in &lt;code&gt;aws-lambda-tools-defaults.json&lt;/code&gt;) – the maximum time in seconds a single durable execution may run before it times out. The blueprint sets &lt;code&gt;86400&lt;/code&gt; (one day).&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;--durable-retention-period&lt;/code&gt; (&lt;code&gt;durable-retention-period&lt;/code&gt;) – optional; the number of days to retain execution history after an execution completes.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;An execution timeout is required for a durable function, so always set &lt;code&gt;--durable-execution-timeout&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;When the tool creates the function’s execution role for you, it automatically attaches the &lt;code&gt;AWSLambdaBasicDurableExecutionRolePolicy&lt;/code&gt; managed policy, which grants the checkpoint permissions a durable function needs at runtime. If you supply your own role with &lt;code&gt;--function-role&lt;/code&gt;, attach that policy to it.&lt;/p&gt; 
&lt;p&gt;Then invoke the function with a sample order. You invoke durable functions asynchronously, so pass &lt;code&gt;--invoke-mode DurableExecution&lt;/code&gt;. The following .NET CLI command deploys and invokes the function, streaming the operation history as it goes:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet lambda invoke-function OrderProcessor --payload '{"OrderId":"order-123","Items":["sku-1","sku-2"]}' --invoke-mode DurableExecution&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The &lt;code&gt;InvocationCompleted&lt;/code&gt; event immediately following &lt;code&gt;settlement_delay: WaitStarted&lt;/code&gt; indicates that the function has suspended during the wait. A second invocation then resumes at &lt;code&gt;ship_order&lt;/code&gt; and does not repeat the earlier steps. The following output shows the complete execution history for a sample order:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Resolved latest version 1 for function OrderProcessor to ARN: arn:aws:lambda:us-west-2:123456789012:function:OrderProcessor:1
Durable execution ARN: arn:aws:lambda:us-west-2:123456789012:function:OrderProcessor:1/durable-execution/ad36ac33-2bb4-4d90-841a-c5491cb6e6ea/5c4aac8e-26c1-3403-9a1b-18c1a2cd0389

Monitoring durable execution progress:
   [2026-07-06 18:18:34Z] ad36ac33-2bb4-4d90-841a-c5491cb6e6ea: ExecutionStarted
      Execution Timeout: 86400
      Input: {"OrderId":"order-123","Items":["sku-1","sku-2"]}
   [2026-07-06 18:18:36Z] validate_order: StepStarted
   [2026-07-06 18:18:36Z] validate_order: StepSucceeded
      Result: 2
      Current Attempt: 1
   [2026-07-06 18:18:36Z] charge_payment: StepStarted
   [2026-07-06 18:18:36Z] charge_payment: StepSucceeded
      Result: "txn-order-123"
      Current Attempt: 1
   [2026-07-06 18:18:36Z] settlement_delay: WaitStarted
      Duration: 5
      Scheduled End Timestamp: 7/6/2026 6:18:41 PM
   [2026-07-06 18:18:36Z] : InvocationCompleted
      Request Id: 851f7662-5f0f-4381-a2eb-0390668411c9
      Start Timestamp: 7/6/2026 6:18:34 PM
      End Timestamp: 7/6/2026 6:18:36 PM
   [2026-07-06 18:18:41Z] settlement_delay: WaitSucceeded
      Duration: 5
   [2026-07-06 18:18:41Z] ship_order: ContextStarted
   [2026-07-06 18:18:41Z] pack: StepStarted
   [2026-07-06 18:18:41Z] pack: StepSucceeded
      Result: "packed"
      Current Attempt: 1
   [2026-07-06 18:18:41Z] label: StepStarted
   [2026-07-06 18:18:41Z] label: StepSucceeded
      Result: "trk-order-123"
      Current Attempt: 1
   [2026-07-06 18:18:42Z] ship_order: ContextSucceeded
      Result: "trk-order-123"
   [2026-07-06 18:18:42Z] : InvocationCompleted
      Request Id: 764c6852-b351-4385-aac6-86e08d5de914
      Start Timestamp: 7/6/2026 6:18:41 PM
      End Timestamp: 7/6/2026 6:18:42 PM
   [2026-07-06 18:18:42Z] ad36ac33-2bb4-4d90-841a-c5491cb6e6ea: ExecutionSucceeded
      Result: {"OrderId":"order-123","Status":"shipped","ItemCount":2,"TransactionId":"txn-order-123","TrackingId":"trk-order-123"}

Durable execution finished with status: SUCCEEDED
Result:
{"OrderId":"order-123","Status":"shipped","ItemCount":2,"TransactionId":"txn-order-123","TrackingId":"trk-order-123"}&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The execution history captures every step, wait, and child context with its result. You can retrieve this history at any time through the durable execution APIs or the Lambda console.&lt;/p&gt; 
&lt;h2&gt;Testing locally&lt;/h2&gt; 
&lt;p&gt;You can test your durable workflows locally with the &lt;code&gt;Amazon.Lambda.DurableExecution&lt;/code&gt;. Testing package, no AWS resources required. &lt;code&gt;DurableTestRunner&lt;/code&gt; runs your handler in-process against the real durable runtime with an in-memory backend. You can assert on the result and on individual checkpointed steps. This approach enables fast iteration and is especially valuable for agentic workflows with complex execution graphs. The following .NET CLI commands add a test project with the required packages:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet add package Amazon.Lambda.DurableExecution.Testing
dotnet add package xunit.v3
dotnet add package xunit.runner.visualstudio&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The following C# test class covers the scaffolded workflow end-to-end, including the happy path and the empty-order failure:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;using Amazon.Lambda.DurableExecution.Testing;
using Xunit;

public class FunctionTest
{
    [Fact]
    public async Task ProcessOrder_ShipsOrder()
    {
        var function = new Function();

        // The runner drives the workflow to completion in-process using the real durable runtime
        // with an in-memory backend. SkipTime collapses the settlement WaitAsync delay so the test
        // does not actually block for 5 seconds.
        await using var runner = new DurableTestRunner&amp;lt;OrderRequest, OrderResult&amp;gt;(
            handler: function.ProcessOrder,
            options: new TestRunnerOptions { SkipTime = true });

        var input = new OrderRequest { OrderId = "order-123", Items = new[] { "sku-1", "sku-2" } };

        // TestContext.Current.CancellationToken is xunit.v3's per-test token; the runner honors it.
        var result = await runner.RunAsync(input, cancellationToken: TestContext.Current.CancellationToken);

        result.EnsureSucceeded();
        Assert.Equal("order-123", result.Result!.OrderId);
        Assert.Equal("shipped", result.Result.Status);
        Assert.Equal(2, result.Result.ItemCount);
        Assert.Equal("txn-order-123", result.Result.TransactionId);
        Assert.Equal("trk-order-123", result.Result.TrackingId);

        // Each named operation is checkpointed and inspectable.
        Assert.Equal(OperationStatus.Succeeded, result.GetStep("validate_order").Status);
        Assert.Equal(OperationStatus.Succeeded, result.GetStep("charge_payment").Status);
    }

    [Fact]
    public async Task ProcessOrder_EmptyOrder_Fails()
    {
        var function = new Function();

        await using var runner = new DurableTestRunner&amp;lt;OrderRequest, OrderResult&amp;gt;(
            handler: function.ProcessOrder,
            options: new TestRunnerOptions { SkipTime = true });

        var input = new OrderRequest { OrderId = "order-456", Items = System.Array.Empty&amp;lt;string&amp;gt;() };

        var result = await runner.RunAsync(input, cancellationToken: TestContext.Current.CancellationToken);

        Assert.True(result.IsFailed);
    }
}&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Run the tests with the following .NET CLI command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet test&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you added the approval step, the workflow suspends on the callback instead of completing, so &lt;code&gt;RunAsync&lt;/code&gt; no longer applies. The following C# example starts the workflow, waits for it to reach the callback, resolves it, and then waits for the result:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var arn = await runner.StartAsync(input);
var callbackId = await runner.WaitForCallbackAsync(arn, name: "manager_approval");
await runner.SendCallbackSuccessAsync(callbackId, new ApprovalResult("approved", "manager-1"));

var result = await runner.WaitForResultAsync(arn);
result.EnsureSucceeded();&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Clean up&lt;/h2&gt; 
&lt;p&gt;If you deployed the function, delete it when you finish to avoid incurring charges:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet lambda delete-function OrderProcessor&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If the tooling created an execution role for you and you no longer need it, delete the role and its attached policy as well. The local tests run entirely in-memory and create no AWS resources, so there is nothing to clean up for those.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;This order workflow is a starting point. You can use these building blocks to compose much more complex workflows and sub-workflows. Checkpoints mean a crash resumes from the last completed step instead of the top. Configurable retries with at-most-once semantics mean an unreliable payment call never charges a card twice. A suspended workflow can pause for minutes or days without incurring compute charges. You get durable orchestration in the language and tools you already use, instead of custom state management and failure-handling code.&lt;/p&gt; 
&lt;p&gt;Next steps:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Create a project from the &lt;code&gt;lambda.DurableFunction&lt;/code&gt; blueprint and deploy your first workflow to the managed &lt;code&gt;dotnet10&lt;/code&gt; runtime.&lt;/li&gt; 
 &lt;li&gt;Explore the &lt;a href="https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.DurableExecution"&gt;SDK on GitHub&lt;/a&gt; for advanced patterns like &lt;code&gt;InvokeAsync&lt;/code&gt; and &lt;code&gt;WaitForConditionAsync&lt;/code&gt;, and refer to the &lt;a href="https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.DurableExecution/README.md"&gt;README&lt;/a&gt; for more documentation.&lt;/li&gt; 
 &lt;li&gt;Read the &lt;a href="https://docs.aws.amazon.com/durable-execution/"&gt;AWS Durable Execution SDK Developer Guide&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Check the &lt;a href="https://aws.amazon.com/lambda/pricing/"&gt;AWS Lambda Pricing&lt;/a&gt; page to see how paused executions are billed.&lt;/li&gt; 
 &lt;li&gt;Create an &lt;a href="https://github.com/aws/aws-lambda-dotnet/issues"&gt;issue&lt;/a&gt; or a &lt;a href="https://github.com/aws/aws-lambda-dotnet/pulls"&gt;pull request&lt;/a&gt; if you have ideas for improvements.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Happy building!&lt;/p&gt; 
&lt;p&gt;– Garrett&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Annual .NET target updates for the AWS SDK for .NET</title>
		<link>https://aws.amazon.com/blogs/developer/annual-net-target-updates-for-the-aws-sdk-for-net/</link>
					
		
		<dc:creator><![CDATA[Norm Johanson]]></dc:creator>
		<pubDate>Wed, 29 Jul 2026 21:18:33 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[AWS SDK for .NET]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">41e3ac449b23e1cb243f152d7fafc9bce0ae9099</guid>

					<description>Starting November 2026 the AWS SDK for .NET will adopt a new annual schedule of adding and removing .NET build targets for the SDK. In April 2025, we released V4 of the AWS SDK for .NET. A major goal of V4 was to modernize the .NET targets supported by the SDK so we can start […]</description>
										<content:encoded>&lt;p&gt;Starting November 2026 the AWS SDK for .NET will adopt a new annual schedule of adding and removing .NET build targets for the SDK.&lt;/p&gt; 
&lt;p&gt;In April 2025, we released &lt;a href="https://aws.amazon.com/blogs/developer/general-availability-of-aws-sdk-for-net-v4-0/" target="_blank" rel="noopener"&gt;V4 of the AWS SDK for .NET&lt;/a&gt;. A major goal of V4 was to modernize the .NET targets supported by the SDK so we can start taking advantage of modern high-performance .NET APIs. Since the V4 release, we have continued working with the community to take advantage of modern .NET and improve performance. Here are some &lt;a href="https://github.com/aws/aws-sdk-net/pulls?q=is%3Apr+label%3Aperf" target="_blank" rel="noopener"&gt;performance improvement PRs&lt;/a&gt; from this year.&lt;/p&gt; 
&lt;p&gt;Now that V4 has established a modern foundation for the AWS SDK for .NET, we want to ensure it stays current. To do this, we are defining a predictable annual schedule for adding and removing .NET targets from the SDK.&lt;/p&gt; 
&lt;h2&gt;Background&lt;/h2&gt; 
&lt;p&gt;Across AWS there are many .NET NuGet packages published, and not all packages are considered part of the AWS SDK for .NET. The NuGet packages that are referred to as the AWS SDK for .NET are the core library &lt;code&gt;AWSSDK.Core&lt;/code&gt; package and the individual AWS service packages that follow the naming pattern &lt;code&gt;AWSSDK.&amp;lt;service-name&amp;gt; &lt;/code&gt; such as &lt;code&gt;AWSSDK.S3&lt;/code&gt; or &lt;code&gt;AWSSDK.SQS&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Today, the V4 AWS SDK for .NET builds for the following targets:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;.NET Framework 4.7.2&lt;/li&gt; 
 &lt;li&gt;.NET Standard 2.0&lt;/li&gt; 
 &lt;li&gt;.NET Core 3.1&lt;/li&gt; 
 &lt;li&gt;.NET 8&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The .NET Framework 4.7.2 target supports our .NET Framework customers. There is no end-of-life schedule for .NET Framework 4.7.2 from Microsoft, and we will continue to include this target for the foreseeable future. The .NET Standard 2.0 target is currently required for &lt;a href="https://aws.amazon.com/powershell/" target="_blank" rel="noopener"&gt;AWS Tools for PowerShell&lt;/a&gt;. That means the .NET Standard 2.0 target will also be included for the foreseeable future.&lt;/p&gt; 
&lt;p&gt;As documented by the &lt;a href="https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core" target="_blank" rel="noopener"&gt;Microsoft .NET support cycle&lt;/a&gt; modern cross-platform .NET has new major versions released every November, with every other year being an LTS (Long Term Support) release with 3 years of support and the alternating years being STS (Standard Term Support) with 2 years of support.&lt;/p&gt; 
&lt;h2&gt;The case for a defined schedule&lt;/h2&gt; 
&lt;p&gt;Until now, the SDK has only added a new .NET build target when there were new APIs in a .NET release that we wanted to take advantage of. For example, in 2023, we added the .NET 8 target to support Native AOT. This approach works because the SDK only depends on the base .NET runtime, which maintains very strong backward compatibility between releases.&lt;/p&gt; 
&lt;p&gt;However, this ad hoc approach has led to several issues:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Customer confusion&lt;/strong&gt;: Customers see in NuGet the latest target is .NET 8 and conclude that we haven’t updated the SDK for .NET 10, thinking we are behind.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Unclear target removal&lt;/strong&gt;: Without a defined schedule, old .NET targets linger with the SDK building technical debt that reduces the amount of effort that can be spent optimizing for the latest .NET version. These old .NET targets also make it harder for community members to build the SDK because it requires them to have versions well past end of support installed in their development environment.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Delayed feature adoption&lt;/strong&gt;: Without a schedule, new .NET features require a one-off decision about whether to add a new target, which can result in features being delayed indefinitely with no clear timeline for adoption.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;A defined schedule addresses all of these issues by setting clear expectations for both our team and the users of the SDK.&lt;/p&gt; 
&lt;h2&gt;The schedule&lt;/h2&gt; 
&lt;p&gt;Every year, the SDK will be updated to add the build target for the current year’s release. We will attempt to align as closely as possible with the .NET November release cycle but may fall back to December depending on demands for other priorities, particularly for &lt;a href="https://aws.amazon.com/events/reinvent/" target="_blank" rel="noopener"&gt;AWS re:Invent&lt;/a&gt;. The list of .NET targets will contain at most two LTS versions. If adding the new target would bring the total to three LTS versions, the oldest LTS is removed along with any STS versions that precede the new oldest LTS version.&lt;/p&gt; 
&lt;p&gt;This schedule gives an additional year of AWS SDK support from AWS after Microsoft has declared end of life for the .NET runtime. That is six months longer than the AWS SDK’s documented &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#dep-life-cycle" target="_blank" rel="noopener"&gt;Maintenance policy&lt;/a&gt; because it provides a better alignment with the .NET yearly release cycle.&lt;/p&gt; 
&lt;p&gt;Each yearly update of .NET targets will be released as a new minor version of the SDK. In November 2026 we will release V4.1; in November 2027 V4.2; and so on. While the product version receives the minor version bump, the assembly version compiled into the binary will remain 4.0.0. The assembly version is part of the assembly identity. Other assemblies bind to this identity when referenced as a dependency during compilation. This means third-party libraries compiled against V4.0 will continue to work without recompilation because the assembly identity doesn’t change. This follows the same versioning practice we used with V3, ensuring backward compatibility for all third-party libraries.&lt;/p&gt; 
&lt;h2&gt;Yearly target examples&lt;/h2&gt; 
&lt;p&gt;The following examples show how the target list evolves each year. LTS versions are &lt;strong&gt;bolded&lt;/strong&gt; and removed targets are &lt;del datetime="2026-07-28T22:26:04+00:00"&gt;struck out&lt;/del&gt;.&lt;/p&gt; 
&lt;h3&gt;November 2026 (V4.1)&lt;/h3&gt; 
&lt;p&gt;Because this is the first year the schedule applies, it will be handled as a special case. We will add the .NET 10 LTS version and remove .NET Core 3.1, which has been end of life since December 2022. By the schedule, we would also add the STS .NET 9 target, but adding a target at the time it is going out of support is unnecessary.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;.NET Framework 4.7.2&lt;/li&gt; 
 &lt;li&gt;.NET Standard 2.0&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;del datetime="2026-07-28T22:17:38+00:00"&gt;.NET Core 3.1 (LTS) (Removed)&lt;/del&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;.NET 8 (LTS)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 10 (LTS)&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;.NET 11 (STS)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;November 2027 (V4.2)&lt;/h3&gt; 
&lt;p&gt;The .NET 8 target is removed because it would become a third LTS version.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;.NET Framework 4.7.2&lt;/li&gt; 
 &lt;li&gt;.NET Standard 2.0&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;del datetime="2026-07-28T22:17:38+00:00"&gt;.NET 8 (LTS) (Removed)&lt;/del&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 10 (LTS)&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;.NET 11 (STS)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 12 (LTS)&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;November 2028 (V4.3)&lt;/h3&gt; 
&lt;p&gt;Only the new .NET 13 STS is added and nothing is removed. You can continue to use .NET 10 and .NET 11 for another year even though they have reached Microsoft end of life.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;.NET Framework 4.7.2&lt;/li&gt; 
 &lt;li&gt;.NET Standard 2.0&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 10 (LTS) (Microsoft end of life)&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;.NET 11 (STS) (Microsoft end of life)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 12 (LTS)&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;.NET 13 (STS)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;November 2029 (V4.4)&lt;/h3&gt; 
&lt;p&gt;The new .NET 14 LTS is added, triggering the removal of .NET 10 (the oldest LTS) and .NET 11 (STS older than the new oldest LTS).&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;.NET Framework 4.7.2&lt;/li&gt; 
 &lt;li&gt;.NET Standard 2.0&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;&lt;del datetime="2026-07-28T22:26:04+00:00"&gt;.NET 10 (LTS) (Removed)&lt;/del&gt;&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;del datetime="2026-07-28T22:26:04+00:00"&gt;.NET 11 (STS) (Removed)&lt;/del&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 12 (LTS)&lt;/strong&gt;&lt;/li&gt; 
 &lt;li&gt;.NET 13 (STS)&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;.NET 14 (LTS)&lt;/strong&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;What this means for you&lt;/h2&gt; 
&lt;p&gt;For most of you, this schedule is transparent. NuGet will resolve the best matching target for your application automatically. If you are using a .NET version that is no longer a build target in the latest SDK minor version, you have two options:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Stay on the previous SDK minor version.&lt;/strong&gt; There will be no new releases for the previous minor version, so you will not receive any more SDK updates.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Update to the latest SDK version.&lt;/strong&gt; NuGet will resolve to the .NET Standard 2.0 version of the SDK. For most use cases, .NET Standard 2.0 provides the functionality you need, though it will be missing some target-specific optimizations. For example, if you were using .NET 8 and updated to V4.2 in 2027 when .NET 8 was dropped, you would fall back to .NET Standard 2.0, losing Native AOT support and .NET 8+ performance optimizations.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Conclusion&lt;/h3&gt; 
&lt;p&gt;This schedule brings predictability to how the SDK evolves with the .NET ecosystem. You will always know that the latest .NET version is supported by the end of the year of its release, and you will have a full year of additional AWS SDK support after Microsoft ends support for a .NET version.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Installing and updating the AWS CLI with single-line commands</title>
		<link>https://aws.amazon.com/blogs/developer/installing-and-updating-the-aws-cli-with-single-line-commands/</link>
					
		
		<dc:creator><![CDATA[Steve Yoo]]></dc:creator>
		<pubDate>Tue, 28 Jul 2026 14:55:26 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS CLI]]></category>
		<category><![CDATA[Foundational (100)]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<category><![CDATA[aws-cli]]></category>
		<category><![CDATA[CLI]]></category>
		<guid isPermaLink="false">a8ddb79ea8c059bda64b96d0521c0646f27e51b3</guid>

					<description>The AWS Command Line Interface v2 (AWS CLI) can now be installed and updated using single-line commands. Previously, to install the AWS CLI, you had to download the correct installer for your platform and architecture, configure the installation path, and manually run the installer. To update the AWS CLI, you had to repeat the same […]</description>
										<content:encoded>&lt;p&gt;The &lt;a href="https://aws.amazon.com/cli/"&gt;AWS Command Line Interface v2 (AWS CLI)&lt;/a&gt; can now be installed and updated using single-line commands.&lt;/p&gt; 
&lt;p&gt;Previously, to install the AWS CLI, you had to download the correct installer for your platform and architecture, configure the installation path, and manually run the installer. To update the AWS CLI, you had to repeat the same installation steps.&lt;/p&gt; 
&lt;p&gt;To simplify these workflows, we released install scripts that automatically download, configure, and run official AWS CLI installers. We also released &lt;code&gt;aws update&lt;/code&gt;, a new command that updates the current AWS CLI installation to the latest version.&lt;/p&gt; 
&lt;p&gt;In this post, you’ll learn to install the AWS CLI with an install script and update to the latest version with &lt;code&gt;aws update&lt;/code&gt;. Before getting started, ensure your system meets the minimum requirements to use AWS CLI installers. &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"&gt;See our documentation for details&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Installing&lt;/h2&gt; 
&lt;p&gt;To install, use the following platform-specific guides to download and execute the install script.&lt;/p&gt; 
&lt;h3&gt;macOS and Linux&lt;/h3&gt; 
&lt;p&gt;Run the following command in a terminal. By default, the AWS CLI is installed for the current user in &lt;code&gt;$HOME/.local/share/aws-cli&lt;/code&gt; and symlinks are created in &lt;code&gt;$HOME/.local/bin&lt;/code&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;curl -fsSL 'https://awscli.amazonaws.com/v2/install.sh' | bash&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can configure the user install location by setting the following environment variables:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;XDG_DATA_HOME&lt;/code&gt; (default &lt;code&gt;$HOME/.local/share/aws-cli&lt;/code&gt;)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;XDG_BIN_HOME&lt;/code&gt; (default &lt;code&gt;$HOME/.local/bin&lt;/code&gt;)&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;To install for all users system-wide, pass the script’s &lt;code&gt;--system&lt;/code&gt; flag. This will install the AWS CLI in &lt;code&gt;/usr/local/aws-cli&lt;/code&gt; and create symlinks in &lt;code&gt;/usr/local/bin&lt;/code&gt;. Note that this requires root permissions.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;curl -fsSL 'https://awscli.amazonaws.com/v2/install.sh' | sudo bash -s -- --system&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Windows&lt;/h3&gt; 
&lt;p&gt;Run the following command in PowerShell. By default, the AWS CLI is installed for the current user in &lt;code&gt;%LOCALAPPDATA%\Programs\Amazon\AWSCLIV2&lt;/code&gt;.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-powershell"&gt;irm 'https://awscli.amazonaws.com/v2/install.ps1' | iex&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To install for all users system-wide, pass the script’s &lt;code&gt;-System&lt;/code&gt; flag. This will install the AWS CLI in &lt;code&gt;%ProgramW6432%\Amazon\AWSCLIV2&lt;/code&gt;. Note that this requires an elevated shell with administrator privileges.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-powershell"&gt;irm 'https://awscli.amazonaws.com/v2/install.ps1' -OutFile install.ps1; try { .\install.ps1 -System } finally { Remove-Item install.ps1 }&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Updating&lt;/h2&gt; 
&lt;p&gt;Starting with version 2.36.0, you can upgrade to the latest AWS CLI version by running &lt;code&gt;aws update&lt;/code&gt;. The &lt;code&gt;update&lt;/code&gt; command detects and reuses the current AWS CLI installation path.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;aws update&lt;/code&gt; is supported only for installations managed by an official installer, install script, or the update command itself.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;We’ve made it easier to install the AWS CLI using install scripts and upgrade to the latest version using the &lt;code&gt;aws update&lt;/code&gt; command. We recommend that you use these new tools instead of the installers to get started faster. To learn more, &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"&gt;visit our docs on installing and updating the AWS CLI&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Please share your questions, comments, and issues with us on &lt;a href="https://github.com/aws/aws-cli"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Updating TypeScript version support in AWS SDK for JavaScript v3</title>
		<link>https://aws.amazon.com/blogs/developer/updating-typescript-version-support-in-aws-sdk-for-javascript-v3/</link>
					
		
		<dc:creator><![CDATA[Abhinav Goyal]]></dc:creator>
		<pubDate>Wed, 15 Jul 2026 16:07:03 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for JavaScript in Node.js]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[aws-sdk]]></category>
		<category><![CDATA[aws-sdk-js]]></category>
		<category><![CDATA[aws-sdk-js-v3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">20fb28e88674b58a84d511c7cbb39394913bab32</guid>

					<description>We’re updating TypeScript version support in the AWS SDK for JavaScript v3. Starting January 4, 2027, the SDK will require TypeScript versions published within the last 2.5 years. Read on to learn what’s changing, why this change is necessary, and what actions you may need to take. We built the AWS SDK for JavaScript with […]</description>
										<content:encoded>&lt;p&gt;We’re updating TypeScript version support in the &lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/"&gt;AWS SDK for JavaScript v3&lt;/a&gt;. Starting January 4, 2027, the SDK will require TypeScript versions published within the last 2.5 years. Read on to learn what’s changing, why this change is necessary, and what actions you may need to take.&lt;/p&gt; 
&lt;p&gt;We built the AWS SDK for JavaScript with TypeScript-first development in mind, designed to deliver smaller artifacts while taking advantage of modern TypeScript features. This&amp;nbsp;support policy&amp;nbsp;update&amp;nbsp;also aligns&amp;nbsp;the&amp;nbsp;SDK&amp;nbsp;with the&amp;nbsp;broader TypeScript ecosystem.&lt;/p&gt; 
&lt;h2&gt;What’s&amp;nbsp;changing and&amp;nbsp;why&lt;/h2&gt; 
&lt;p&gt;This change applies only if you use TypeScript with the AWS SDK for JavaScript v3.&lt;/p&gt; 
&lt;p&gt;The TypeScript ecosystem has broadly converged on supporting only recent compiler versions:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;DefinitelyTyped&lt;/strong&gt;, the central repository for community-maintained TypeScript type definitions (hosting types for 8,000+ npm packages including &lt;code&gt;@types/node&lt;/code&gt; and &lt;code&gt;@types/react&lt;/code&gt;), only tests packages against TypeScript versions less than 2 years old. For more information, see &lt;a href="https://github.com/DefinitelyTyped/DefinitelyTyped#support-window"&gt;Support Window&lt;/a&gt; on GitHub.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;typescript-eslint&lt;/strong&gt;, the most widely used TypeScript linting framework, &lt;a href="https://typescript-eslint.io/users/dependency-versions/#typescript"&gt;mirrors the DefinitelyTyped support window&lt;/a&gt; and only supports TypeScript versions less than 2 years old.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Real-world applications depend on many packages beyond the SDK. Once the broader ecosystem drops an older version,&amp;nbsp;you’re&amp;nbsp;likely to&amp;nbsp;encounter&amp;nbsp;incompatible&amp;nbsp;typings&amp;nbsp;regardless.&lt;/p&gt; 
&lt;p&gt;We are&amp;nbsp;aligning&amp;nbsp;with&amp;nbsp;this ecosystem norm.&amp;nbsp;The&amp;nbsp;SDK&amp;nbsp;will follow the&amp;nbsp;DefinitelyTyped&amp;nbsp;support window plus a 6-month grace period,&amp;nbsp;giving&amp;nbsp;you&amp;nbsp;up to&amp;nbsp;a&amp;nbsp;2.5-year window to upgrade&amp;nbsp;your&amp;nbsp;TypeScript&amp;nbsp;version.&amp;nbsp;For more information,&amp;nbsp;see&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#dep-life-cycle"&gt;AWS SDKs and Tools maintenance policy&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The following table shows the end-of-support timeline for each TypeScript version:&lt;/p&gt; 
&lt;table style="height: 230px;border-color: #000000" border="1" width="709"&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;strong&gt;TypeScript version&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;Release Date&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;DefinitelyTyped&amp;nbsp;end-of-support&lt;/strong&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;strong&gt;JS SDK end-of-support&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&amp;lt;=5.5&lt;/td&gt; 
   &lt;td&gt;June 20, 2024&lt;/td&gt; 
   &lt;td&gt;June 20, 2026*&lt;/td&gt; 
   &lt;td&gt;January&amp;nbsp;4, 2027&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;5.6&lt;/td&gt; 
   &lt;td&gt;September 24, 2024&lt;/td&gt; 
   &lt;td&gt;September 24, 2026*&lt;/td&gt; 
   &lt;td&gt;March 31, 2027&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;5.7&lt;/td&gt; 
   &lt;td&gt;November 22, 2024&lt;/td&gt; 
   &lt;td&gt;November 22, 2026*&lt;/td&gt; 
   &lt;td&gt;May 31, 2027&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;5.8&lt;/td&gt; 
   &lt;td&gt;March 5, 2025&lt;/td&gt; 
   &lt;td&gt;March 5, 2027*&lt;/td&gt; 
   &lt;td&gt;September 30, 2027&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;5.9&lt;/td&gt; 
   &lt;td&gt;August 1, 2025&lt;/td&gt; 
   &lt;td&gt;August 1, 2027&lt;/td&gt; 
   &lt;td&gt;February 29, 2028&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;&lt;em&gt;*&amp;nbsp;Speculative, based on the&amp;nbsp;DefinitelyTyped&amp;nbsp;support window.&amp;nbsp;&lt;/em&gt;&lt;/p&gt; 
&lt;h2&gt;What you can expect&lt;/h2&gt; 
&lt;h3&gt;A clear minimum supported TypeScript version&lt;/h3&gt; 
&lt;p&gt;We will document a minimum TypeScript version in the GitHub repository’s &lt;a href="https://github.com/aws/aws-sdk-js-v3/blob/main/README.md"&gt;README&lt;/a&gt; and will keep it updated as part of the normal maintenance process. We define&amp;nbsp;“supported”&amp;nbsp;as:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;We build and test the SDK against TypeScript versions within the support window.&lt;/li&gt; 
 &lt;li&gt;We may not address issues specific to out-of-window TypeScript versions.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Smaller package artifacts and simpler publishing&lt;/h3&gt; 
&lt;p&gt;This change reduces build and release complexity, published package size, and &lt;a href="https://docs.aws.amazon.com/lambda/"&gt;AWS Lambda&lt;/a&gt; artifact size.&lt;/p&gt; 
&lt;h2&gt;What you need to do&lt;/h2&gt; 
&lt;p&gt;You don’t need to take immediate action. If your project uses a TypeScript version within the support window, no changes are needed. For projects on an older TypeScript version, your existing setup will continue to work as long as you don’t update the SDK version. However, we recommend that you upgrade your TypeScript version to continue receiving the latest SDK updates.&lt;/p&gt; 
&lt;p&gt;You have two options for staying compatible with the SDK:&lt;/p&gt; 
&lt;h3&gt;&lt;strong&gt;Option 1: Upgrade TypeScript&amp;nbsp;to a&amp;nbsp;supported&amp;nbsp;version&amp;nbsp;(recommended)&lt;/strong&gt;&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Upgrade TypeScript in your dev dependencies.&lt;/li&gt; 
 &lt;li&gt;Run your project’s type check to validate your code against the new TypeScript version.&lt;/li&gt; 
 &lt;li&gt;Address any new diagnostics.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;&lt;em&gt;Tip: Newer compilers often catch issues that older versions missed, so new diagnostics might reveal real bugs in your code.&lt;/em&gt;&lt;/p&gt; 
&lt;h3&gt;&lt;strong&gt;Option 2: Pin the AWS SDK for JavaScript v3 packages&lt;/strong&gt;&lt;/h3&gt; 
&lt;p&gt;Pin&amp;nbsp;&lt;code&gt;@aws-sdk/*&lt;/code&gt; dependencies to the last version that supported your TypeScript version. This prevents short-term disruption, but you won’t receive newer SDK updates, security patches, or new features.&lt;/p&gt; 
&lt;h2&gt;FAQ&lt;/h2&gt; 
&lt;h3&gt;Is this a runtime breaking change?&lt;/h3&gt; 
&lt;p&gt;No. This change affects type-level compatibility (your build) and the SDK’s ability to ship types efficiently. This can cause build failures with older (unsupported) TypeScript compilers.&lt;/p&gt; 
&lt;h3&gt;Why not keep&amp;nbsp;downleveling&amp;nbsp;indefinitely?&lt;/h3&gt; 
&lt;p&gt;Downleveling hasn’t been required since TypeScript 4.7, which was published in May 2022. Down-leveling makes every release heavier:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Downlevel types account for 18% of the published package size in the SDK.&lt;/li&gt; 
 &lt;li&gt;Downleveling is an additional step in the SDK’s release process.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;We recommend upgrading to a supported TypeScript version ahead of this change to keep receiving updates, security patches, and new features. For the current minimum supported version, see &lt;a href="https://github.com/aws/aws-sdk-js-v3/blob/main/README.md"&gt;AWS SDK for JavaScript v3 README&lt;/a&gt; on GitHub.&lt;/p&gt; 
&lt;p&gt;We’d love to hear from you. Open a &lt;a href="https://github.com/aws/aws-sdk-js-v3/discussions"&gt;discussion&lt;/a&gt; or &lt;a href="https://github.com/aws/aws-sdk-js-v3/issues"&gt;issue&lt;/a&gt; on our GitHub.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>AWS CLI v1 maintenance mode: announcing changes to dependency updates</title>
		<link>https://aws.amazon.com/blogs/developer/aws-cli-v1-maintenance-mode-announcing-changes-to-dependency-updates/</link>
		
		<dc:creator><![CDATA[Kenneth Daily]]></dc:creator>
		<pubDate>Wed, 10 Jun 2026 18:31:56 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS CLI]]></category>
		<category><![CDATA[Foundational (100)]]></category>
		<guid isPermaLink="false">c03b2070b65a625131a0e0abfe182ce9626480a5</guid>

					<description>Learn how AWS CLI v1 maintenance mode will bundle botocore and s3transfer dependencies starting July 15, 2026, and what this means for your workflows.</description>
										<content:encoded>&lt;p&gt;When version 1 of the AWS Command Line Interface (&lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-welcome.html" target="_blank" rel="noopener noreferrer"&gt;AWS CLI v1&lt;/a&gt;) enters maintenance mode on July 15, 2026, the way its botocore and s3transfer dependencies are bundled will change. This post explains these changes and provides steps to minimize impacts on your workflows and applications. For more information about AWS CLI v1 maintenance mode, refer to the blog post &lt;a href="https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/" target="_blank" rel="noopener noreferrer"&gt;CLI v1 Maintenance Mode Announcement&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Background&lt;/h2&gt; 
&lt;p&gt;The AWS CLI v1 is built on top of two foundational Python libraries:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;botocore&lt;/strong&gt; is the low-level library that provides AWS service definitions, request signing, response parsing, and retry logic. When AWS launches a new service or adds new API operations to an existing service, those changes are delivered through botocore updates.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;s3transfer&lt;/strong&gt; is the library that manages Amazon S3 file transfers, including multipart uploads, parallel downloads, and transfer configuration. High-level S3 commands in the AWS CLI rely on s3transfer, such as &lt;code&gt;aws s3 cp&lt;/code&gt; and &lt;code&gt;aws s3 sync&lt;/code&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;What’s happening?&lt;/h2&gt; 
&lt;p&gt;Currently, each version of the AWS CLI v1 depends on specific versions of botocore and s3transfer. These dependencies are installed as separate packages. This means that upgrading the AWS CLI v1 also brings in a newer version of these packages. Starting with maintenance mode, botocore and s3transfer will be vendored (bundled and packaged directly) into the AWS CLI v1 codebase. The AWS CLI v1 will no longer rely on the standalone packages. This represents a significant shift in how dependencies are managed within the AWS CLI v1.&lt;/p&gt; 
&lt;p&gt;If you rely on automatic dependency updates when upgrading the AWS CLI v1, this behavior will change. The AWS CLI v1 will include its own internal copies of botocore and s3transfer. Updates to these internal copies will only occur when AWS releases a new version of CLI v1. Installing or upgrading the standalone botocore or s3transfer packages will have no effect on the versions used by the AWS CLI v1.&lt;/p&gt; 
&lt;p&gt;botocore and s3transfer will continue to be developed and released as separate packages, because they are also dependencies of the &lt;a href="https://aws.amazon.com/sdk-for-python/" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for Python&lt;/a&gt; (boto3). However, those standalone package updates will not affect the AWS CLI v1—the CLI will only use its own bundled copies.&lt;/p&gt; 
&lt;h3&gt;How you may be affected&lt;/h3&gt; 
&lt;p&gt;Upgrading the AWS CLI v1 will no longer upgrade the standalone botocore and s3transfer packages. The AWS CLI v1 will use only its own internal copies, and the standalone packages will remain at whatever version is independently installed.&lt;/p&gt; 
&lt;p&gt;If your environment has both the AWS CLI v1 and boto3 installed, they will each use their own separate copies of botocore and s3transfer. Updating either the AWS CLI or boto3 will not affect the other’s dependencies. Additionally, because the AWS CLI v1 will bundle its own copies of botocore and s3transfer alongside the standalone packages used by boto3, environments with both installed will contain two copies of these libraries.&lt;/p&gt; 
&lt;p&gt;Updates to the standalone botocore and s3transfer packages will continue as before, since they are also dependencies of boto3. However, those updates will not reach the AWS CLI v1 unless a new AWS CLI v1 version is released with updated internal copies. As described in the maintenance mode announcement, new AWS CLI v1 versions will only be released to address critical bug fixes and security issues.&lt;/p&gt; 
&lt;h2&gt;Recommended actions&lt;/h2&gt; 
&lt;p&gt;To stay updated with the latest AWS services and features, we recommend that you migrate to AWS CLI v2. To learn more about transitioning to AWS CLI v2, refer to the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener noreferrer"&gt;Migration guide for the AWS CLI version 2&lt;/a&gt;. Additionally, verify if your workflows rely on botocore or s3transfer brought into your environment via the AWS CLI v1. If you have other applications in the same environment that consume them, you may need to explicitly pin their dependency versions. Be sure to validate your existing scripts and automation with the new maintenance mode releases. Last, monitor the &lt;a href="https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst" target="_blank" rel="noopener noreferrer"&gt;AWS CLI changelog&lt;/a&gt; to stay informed about new AWS CLI v1 versions and vendored dependency updates.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;As the AWS CLI v1 enters maintenance mode on July 15, 2026, the botocore and s3transfer dependencies will be vendored, which may affect your workflows and scripts. While the CLI v1 will continue to receive critical updates, we encourage you to migrate to AWS CLI v2 for the latest features and improvements.&lt;/p&gt; 
&lt;h2&gt;Feedback&lt;/h2&gt; 
&lt;p&gt;If you need migration assistance or have feedback, reach out to your usual AWS support contacts. You can also open an &lt;a href="https://github.com/aws/aws-cli/issues" target="_blank" rel="noopener noreferrer"&gt;issue on GitHub&lt;/a&gt;. Thank you for using the AWS CLI!&lt;/p&gt;</content:encoded>
					
		
		
			</item>
		<item>
		<title>Introducing Open-Source Skills for AWS SDK Best Practices</title>
		<link>https://aws.amazon.com/blogs/developer/introducing-open-source-skills-for-aws-sdk-best-practices/</link>
					
		
		<dc:creator><![CDATA[David Yaffe]]></dc:creator>
		<pubDate>Tue, 02 Jun 2026 18:54:26 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Generative AI]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[aws-sdk-js-v3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">e7383f588e1c097bd2985385d6e129809a3ce7a4</guid>

					<description>We released a set of AWS SDK Skills as part of the open-source Agent Toolkit for AWS. These are AI skills that teach coding agents how to follow AWS SDK best practices. The project is available on GitHub under the Apache-2.0 license. The problem AI coding agents know the general shape of AWS SDK usage, […]</description>
										<content:encoded>&lt;p&gt;We released a set of &lt;a href="https://github.com/aws/agent-toolkit-for-aws/tree/main/skills/core-skills"&gt;AWS SDK Skills&lt;/a&gt; as part of the open-source &lt;a href="https://github.com/aws/agent-toolkit-for-aws/tree/main"&gt;Agent Toolkit for AWS&lt;/a&gt;. These are AI skills that teach coding agents how to follow AWS SDK best practices. The project is available on GitHub under the Apache-2.0 license.&lt;/p&gt; 
&lt;h2&gt;The problem&lt;/h2&gt; 
&lt;p&gt;AI coding agents know the general shape of AWS SDK usage, but they get the details wrong. They generate incorrect API names, use incorrect parameter types, and miss SDK-specific patterns like paginators, waiters, and high-level APIs such as the transfer manager for Amazon Simple Storage Service (Amazon S3). These errors are especially common for newer SDKs like the &lt;a href="https://docs.aws.amazon.com/sdk-for-swift/"&gt;AWS SDK for Swift&lt;/a&gt;, where agents generate code that looks plausible but fails to compile.&lt;/p&gt; 
&lt;p&gt;As developers increasingly rely on AI agents to write AWS SDK code, we need to make sure those agents produce code that compiles, follows best practices, and uses each SDK the way it was intended to be used.&lt;/p&gt; 
&lt;h2&gt;What’s in a skill&lt;/h2&gt; 
&lt;p&gt;Skills are modular packages that give AI coding agents specialized SDK knowledge. Each skill is authored by the SDK team that owns the language, so it reflects the things agents consistently get wrong for that specific SDK. A skill includes:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;SKILL.md&lt;/code&gt; — core instructions with SDK-specific patterns and concrete examples&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;references/&lt;/code&gt; — on-demand documentation for deeper topics, loaded only when needed&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;scripts/&lt;/code&gt; — automation for build, test, and validation workflows&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Skills are agent-agnostic. They work with any coding agent that supports the &lt;a href="https://github.com/agentskills/agentskills"&gt;open skills format&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Common mistakes skills help prevent&lt;/h2&gt; 
&lt;p&gt;&lt;strong&gt;Code that doesn’t compile.&lt;/strong&gt; This is the most common failure mode for newer SDKs where the agent’s training data is thin or out of date. The &lt;a href="https://docs.aws.amazon.com/sdk-for-swift/"&gt;AWS SDK for Swift&lt;/a&gt; uses Swift concurrency throughout. Operations are async-throwing, and so are the convenience client constructors. Agents frequently miss this and produce code that looks reasonable but doesn’t build:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-swift"&gt;// What agents tend to write. Does not compile.
let client = S3Client()
let response = client.listBuckets(input: ListBucketsInput())
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Both lines are wrong: &lt;code&gt;S3Client()&lt;/code&gt; is &lt;code&gt;async throws&lt;/code&gt;, and so is &lt;code&gt;listBuckets&lt;/code&gt;. With the Swift skill installed, the agent writes the modern Swift concurrency form:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-swift"&gt;let config = try await S3Client.S3ClientConfig(region: "us-west-2")
let client = S3Client(config: config)
let response = try await client.listBuckets(input: ListBucketsInput())
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The first version sends the developer back to the docs to figure out why a plausible-looking line won’t build. The second one runs.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Code that runs but performs poorly or costs more.&lt;/strong&gt; Agents often skip SDK features that exist precisely to make AWS calls efficient: paginators for &lt;code&gt;ListObjects&lt;/code&gt; and similar APIs, waiters for resource-state polling, and the SDK’s high-level file methods like &lt;code&gt;upload_file&lt;/code&gt; / &lt;code&gt;download_file&lt;/code&gt; for large transfers. A handwritten loop that calls &lt;code&gt;ListObjects&lt;/code&gt; without pagination silently drops results past the first page, polling code without waiters burns API calls and risks throttling, and manual file I/O for S3 transfers gives up multipart uploads and parallelism. The code compiles and often appears to work in small tests, but breaks once you’re dealing with real data volumes. With a skill installed, the agent reaches for the right SDK feature for the job: paginators for list operations, waiters for state polling, and the high-level transfer methods for files.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Code that runs but has subtle bugs.&lt;/strong&gt; Manually marshalling DynamoDB types like &lt;code&gt;{"S": "value"}&lt;/code&gt; is easy to get slightly wrong in ways that fail only on certain inputs. Catching a generic &lt;code&gt;Exception&lt;/code&gt; instead of typed exceptions like &lt;code&gt;ConditionalCheckFailedException&lt;/code&gt; makes retry logic swallow real failures. With a skill installed, the agent reaches for the document client (which handles the conversion correctly) and uses typed exceptions tied to the actual operations it’s calling.&lt;/p&gt; 
&lt;h2&gt;Measuring the impact&lt;/h2&gt; 
&lt;p&gt;We evaluate each skill against a benchmark of real SDK tasks (Amazon S3 operations, Amazon DynamoDB queries, client configuration, presigned URL generation, credential management) and grade the generated code on whether it compiles, passes lint, and actually does what the task asked for (judged by an LLM). Every task runs twice: once with no skill installed, and once with the relevant skill loaded.&lt;/p&gt; 
&lt;p&gt;Across our test suite, code generated with a skill installed consistently passed more checks than code generated without one.&lt;/p&gt; 
&lt;h2&gt;Available skills&lt;/h2&gt; 
&lt;p&gt;The following table summarizes the skills available at launch:&lt;/p&gt; 
&lt;table&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th&gt;Skill&lt;/th&gt; 
   &lt;th&gt;SDK&lt;/th&gt; 
   &lt;th&gt;What it covers&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href="https://github.com/aws/agent-toolkit-for-aws/tree/main/skills/core-skills/aws-sdk-swift-usage"&gt;&lt;code&gt;aws-sdk-swift-usage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-swift/"&gt;AWS SDK for Swift&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Async patterns, struct-based config types, client initialization&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href="https://github.com/aws/agent-toolkit-for-aws/tree/main/skills/core-skills/aws-sdk-js-v3-usage"&gt;&lt;code&gt;aws-sdk-js-v3-usage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/"&gt;AWS SDK for JavaScript v3&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Package structure, client styles, middleware, runtime validation&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td&gt;&lt;a href="https://github.com/aws/agent-toolkit-for-aws/tree/main/skills/core-skills/aws-sdk-python-usage"&gt;&lt;code&gt;aws-sdk-python-usage&lt;/code&gt;&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;&lt;a href="https://docs.aws.amazon.com/boto3/latest/"&gt;Boto3 / botocore&lt;/a&gt;&lt;/td&gt; 
   &lt;td&gt;Client vs. resource interfaces, paginators, waiters, error handling&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Get started&lt;/h2&gt; 
&lt;p&gt;You’ll need a coding agent that supports the open skills format. To install a skill from the &lt;a href="https://github.com/aws/agent-toolkit-for-aws"&gt;Agent Toolkit for AWS&lt;/a&gt;, run:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;npx skills add aws/agent-toolkit-for-aws/skills --skill &amp;lt;skill&amp;gt;
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Replace &lt;code&gt;&amp;lt;skill&amp;gt;&lt;/code&gt; with the one you want:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;aws-sdk-swift-usage&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;aws-sdk-js-v3-usage&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;aws-sdk-python-usage&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Or pass &lt;code&gt;--skill&lt;/code&gt; multiple times to install more than one.&lt;/p&gt; 
&lt;p&gt;If your favorite SDK is missing or you’ve seen agents make mistakes that aren’t covered yet, open an issue or submit a skill. Visit the &lt;a href="https://github.com/aws/agent-toolkit-for-aws"&gt;repository on GitHub&lt;/a&gt; to try it out.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Announcing the General Availability of the AWS IoT Device SDK for Swift</title>
		<link>https://aws.amazon.com/blogs/developer/announcing-the-general-availability-of-the-aws-iot-device-sdk-for-swift/</link>
					
		
		<dc:creator><![CDATA[Vera Xia]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 23:15:34 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS IoT Core]]></category>
		<category><![CDATA[AWS SDK for Swift]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Intermediate (200)]]></category>
		<category><![CDATA[Internet of Things]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[SDK]]></category>
		<category><![CDATA[Swift]]></category>
		<guid isPermaLink="false">aa07005998a1ae49f611f0fae186d0265355ad6b</guid>

					<description>We are excited to announce the General Availability (GA) of the AWS IoT Device SDK for Swift. This release gives Swift developers a production-ready SDK with stable APIs and integrated service clients to connect applications to AWS IoT Core. What’s New The GA release now provides easy-to-configure service clients for three essential AWS IoT Core […]</description>
										<content:encoded>&lt;p&gt;We are excited to announce the General Availability (GA) of the &lt;a href="https://github.com/aws/aws-iot-device-sdk-swift" target="_blank" rel="noopener noreferrer"&gt;AWS IoT Device SDK for Swift&lt;/a&gt;. This release gives Swift developers a production-ready SDK with stable APIs and integrated service clients to connect applications to &lt;a href="https://aws.amazon.com/iot-core/" target="_blank" rel="noopener noreferrer"&gt;AWS IoT Core&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;What’s New&lt;/h2&gt; 
&lt;p&gt;The GA release now provides easy-to-configure service clients for three essential AWS IoT Core services:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html" target="_blank" rel="noopener noreferrer"&gt;AWS IoT Device Shadow&lt;/a&gt;: Synchronize and share data between devices, apps, and other cloud services.&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html" target="_blank" rel="noopener noreferrer"&gt;AWS IoT Jobs&lt;/a&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/iot-jobs.html" target="_blank" rel="noopener noreferrer"&gt;:&lt;/a&gt; Manage remote operations that can run on devices connected to AWS IoT Core.&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/iot-provision.html" target="_blank" rel="noopener noreferrer"&gt;Device provisioning&lt;/a&gt;: Automatically create the certificates and policies needed for secure communication, eliminating manual certificate management.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The SDK supports macOS, iOS, tvOS, and Linux, with X.509 certificate-based authentication and TLS 1.3 encryption on iOS and tvOS. For a detailed overview of platform and security capabilities, see &lt;a href="https://aws.amazon.com/blogs/developer/introducing-the-aws-iot-device-sdk-for-swift-developer-preview/" target="_blank" rel="noopenear noopener noreferrer"&gt;Introducing the AWS IoT Device SDK for Swift (Developer Preview)&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;p&gt;The SDK provides &lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/tree/main/Samples/ServiceClientSamples" target="_blank" rel="noopener noreferrer"&gt;service client samples&lt;/a&gt; (Device Shadow, Jobs, and Device provisioning) on the GitHub website. The following walkthrough demonstrates how to set up a Shadow client and retrieve a shadow state.&lt;/p&gt; 
&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;p&gt;Before you start with the service client, set up the required AWS IoT resources: For more information, see &lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html" target="_blank" rel="noopener noreferrer"&gt;What is AWS IoT?&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html" target="_blank" rel="noopener noreferrer"&gt;Create AWS IoT resources&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;After you complete these steps, you will have three items required for client configuration:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Your IoT endpoint&lt;/li&gt; 
 &lt;li&gt;Your X.509 certificate file&lt;/li&gt; 
 &lt;li&gt;Your associated private key file&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Use AWS IoT Shadow client&lt;/h3&gt; 
&lt;h4&gt;Step 1: Add the SDK dependency&lt;/h4&gt; 
&lt;p&gt;The IoT Shadow client is a product within the &lt;code&gt;aws-iot-device-sdk-swift&lt;/code&gt; package. Add the package as a dependency and reference the Shadow client in your target’s &lt;code&gt;Package.swift&lt;/code&gt; file:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-swift"&gt;let package = Package(
    name: "MyApp",
    dependencies: [
        .package(
            url: "https://github.com/aws/aws-iot-device-sdk-swift.git", 
            from: "1.0.0"
        ),
    ],
    targets: [
        .executableTarget(
            name: "MyApp",
            dependencies: [
                .product(name: "IotShadowClient", package: "aws-iot-device-sdk-swift"),
            ]
        )
    ]
)&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Step 2: Create an MQTT 5 client&lt;/h4&gt; 
&lt;p&gt;Before you create a Shadow client, create an MQTT 5 client. This example uses the endpoint and certificate files from the Prerequisites section.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-swift"&gt;// Create an Mqtt5ClientBuilder configured using a certificate and private key
let clientBuilder = try Mqtt5ClientBuilder.mtlsFromPath(
         endpoint: self.endpoint, 
         certPath: self.cert, 
         keyPath: self.key)

// Create the MQTT5 client using the Mqtt5ClientBuilder and start a connection session
let client = try builder.build()        
client.start()
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information about the certificates, see &lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/x509-client-certs.html"&gt;X.509 client certificates&lt;/a&gt;.&lt;/p&gt; 
&lt;h4&gt;Step 3: Create the Shadow client&lt;/h4&gt; 
&lt;p&gt;After you start the MQTT 5 client, configure the client options and create the Shadow client. These options to cap the client’s subscription usage and reserve capacity for other parts of your IoT application.&lt;/p&gt; 
&lt;p&gt;Configure the following options based on your application’s subscription needs:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;code&gt;&lt;strong&gt;maxRequestResponseSubscription&lt;/strong&gt;&lt;/code&gt;: Maximum number of concurrent subscriptions that request-response client uses. Each request usually uses 1-2 subscriptions until completion.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&lt;strong&gt;maxStreamingSubscription&lt;/strong&gt;&lt;/code&gt;: Maximum number of concurrent streaming operation subscriptions that the client will allow. Set based on the number of streaming operations you plan to use simultaneously.&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;&lt;strong&gt;operationTimeout&lt;/strong&gt;&lt;/code&gt;: Request timeout in seconds.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;The following example creates a Shadow client with values that work well for applications that use a single shadow with limited streaming operations. Adjust these values based on your application’s needs:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-swift"&gt;// Set up options for the MqttRequestResponseClient
let options = MqttRequestResponseClientOptions(
        maxRequestResponseSubscription: 3,
        maxStreamingSubscription: 2,
        operationTimeout: 5)
 
// Create a Shadow client using the MQTT5 client and the options created above
let shadowClient = try IotShadowClient(mqttClient: client, options: options)&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Step 4: Perform Shadow Operations&lt;/h4&gt; 
&lt;p&gt;With the Shadow client ready, you can perform operations such as retrieving, updating, or deleting a shadow state. The following example retrieves a named shadow state:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-swift"&gt;let request: GetShadowRequest = GetShadowRequest(thingName: inputThingName)
do {
       let response = try await shadowClient.getShadow(request: request)
} catch {
       // Log errors
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For more information, see the &lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/tree/main/Samples/ServiceClientSamples/ShadowSample"&gt;Shadow sample&lt;/a&gt; on the GitHub website. Additional service client samples are also available on GitHub:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/tree/main/Samples/ServiceClientSamples/JobsSample" target="_blank" rel="noopener noreferrer"&gt;JobsSandbox&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/blob/main/Samples/ServiceClientSamples/Provisioning/BasicProvisioningSample" target="_blank" rel="noopener noreferrer"&gt;Basic Fleet Provisioning&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/blob/main/Samples/ServiceClientSamples/Provisioning/CsrProvisioningSample" target="_blank" rel="noopener noreferrer"&gt;CSR-based Fleet Provisioning&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Known Limitations&lt;/h2&gt; 
&lt;p&gt;The SDK has the following known limitations:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;TLS 1.3 on macOS&lt;/strong&gt;: While TLS 1.3 is not currently supported on macOS, we are actively developing support and will add it in a future release. This limitation does not affect iOS, tvOS, or Linux platforms.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;HTTP Proxy Support&lt;/strong&gt;: HTTP proxy support is available on macOS and Linux only; it is not currently supported on iOS and tvOS.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For updates on these limitations, see &lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/discussions" target="_blank" rel="noopener noreferrer"&gt;GitHub Discussions.&lt;/a&gt;&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;In this post, we showed you how to get started with the AWS IoT Device SDK for Swift from adding the SDK dependency to performing shadow operations. The SDK also includes clients for Jobs and Device Provisioning. Use the Jobs client to manage remote device operations or the Device Provisioning client to automate certificate creation at scale.&lt;/p&gt; 
&lt;p&gt;For more information, see &lt;a href="https://docs.aws.amazon.com/iot/latest/developerguide/iot-gs.html" target="_blank" rel="noopener noreferrer"&gt;Getting started with AWS IoT Core tutorials&lt;/a&gt; and connect your first device to AWS IoT Core.&lt;/p&gt; 
&lt;p&gt;Let us know how you’re using the SDK in the comments. You can also:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Share ideas and ask questions in &lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/discussions" target="_blank" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;Report issues through &lt;a href="https://github.com/aws/aws-iot-device-sdk-swift/issues" target="_blank" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>AWS SDK for .NET V3 end-of-support announcement</title>
		<link>https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-end-of-support-announcement/</link>
					
		
		<dc:creator><![CDATA[Muhammad Othman]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 19:14:51 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for .NET]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<guid isPermaLink="false">7174ddefd2aec3ab1ccc5ab7121041f2a3be702c</guid>

					<description>As previously announced, version 3 of the AWS SDK for .NET entered maintenance mode on March 1, 2026. In alignment with our SDKs and Tools Maintenance Policy, AWS SDK for .NET V3 has now reached end-of-support as of June 1, 2026.&amp;nbsp; Starting June 1, 2026, there&amp;nbsp;are no plans for further updates or releases for V3, including security fixes. […]</description>
										<content:encoded>&lt;p&gt;&lt;span data-contrast="auto"&gt;As &lt;/span&gt;&lt;a href="https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/"&gt;&lt;span data-contrast="none"&gt;previously announced&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;, version 3 of the &lt;/span&gt;&lt;a href="https://aws.amazon.com/sdk-for-net/"&gt;&lt;span data-contrast="none"&gt;AWS SDK for .NET&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; entered maintenance mode on March 1, 2026. In alignment with our &lt;/span&gt;&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html"&gt;&lt;span data-contrast="none"&gt;SDKs and Tools Maintenance Policy&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;AWS SDK for .NET V3 has now reached end-of-support as of June 1, 2026&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;Starting June 1, 2026, there&amp;nbsp;are no plans for further updates or releases for V3, including security fixes. Previously published releases should continue to be available via &lt;/span&gt;&lt;a href="https://www.nuget.org/packages/AWSSDK.Core"&gt;&lt;span data-contrast="none"&gt;NuGet&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; and the source code will remain on &lt;/span&gt;&lt;a href="https://github.com/aws/aws-sdk-net"&gt;&lt;span data-contrast="none"&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;h2&gt;What this means for you&lt;/h2&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;If you are still using AWS SDK for .NET V3, your existing applications should continue to function. However, you should be aware of the following:&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;No new service support&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;: V3 will not receive updates for new AWS services or new features for existing services.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;No security patches&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;: V3 will no longer receive security fixes. If a vulnerability is discovered, it will only be addressed in V4.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="5" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;No bug fixes&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;: No further bug fixes will be released for V3.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Migrating to V4&lt;/h2&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;We strongly encourage all customers still on V3 to migrate to &lt;/span&gt;&lt;a href="https://aws.amazon.com/blogs/developer/general-availability-of-aws-sdk-for-net-v4-0/"&gt;&lt;span data-contrast="none"&gt;AWS SDK for .NET V4&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; as soon as possible. V4 includes performance&amp;nbsp;enhancements,&amp;nbsp;bug fixes,&amp;nbsp;and continued support for AWS services&amp;nbsp;and regions.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;To help with your migration:&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;span data-contrast="auto"&gt;Review the&amp;nbsp;&lt;/span&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html"&gt;&lt;span data-contrast="none"&gt;Migration Guide&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;&amp;nbsp;to understand the breaking changes.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;span data-contrast="auto"&gt;Update and test your applications&amp;nbsp;with V4 in a development environment&amp;nbsp;before updating production.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="4" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;hybridMultilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;span data-contrast="auto"&gt;If you encounter issues during migration, open an issue on our&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/aws/aws-sdk-net"&gt;&lt;span data-contrast="none"&gt;GitHub repository&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;AWS SDK for .NET V3 has reached end-of-support. We strongly recommend migrating to V4 to continue receiving security updates, bug fixes, and support for AWS services.&amp;nbsp;&lt;/span&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html"&gt;&lt;span data-contrast="none"&gt;Migration documentation&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;&amp;nbsp;is available to guide you through the update process.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;For any questions or issues that arise while updating to the V4 SDK, please utilize the GitHub repository’s&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/aws/aws-sdk-net/discussions"&gt;&lt;span data-contrast="none"&gt;discussion forums&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;&amp;nbsp;or open GitHub&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/aws/aws-sdk-net/issues"&gt;&lt;span data-contrast="none"&gt;issues&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;to reach out to us. If you find dependencies that are preventing you from updating to V4, please let us know to see if we can help.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>AWS Tools for PowerShell V4 end-of- support announcement</title>
		<link>https://aws.amazon.com/blogs/developer/aws-tools-for-powershell-v4-end-of-support-announcement/</link>
					
		
		<dc:creator><![CDATA[Muhammad Othman]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 19:14:48 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS Tools for PowerShell]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[PowerShell]]></category>
		<guid isPermaLink="false">bf16db5be93ba7800574ff9c64e5f2e4f2701f0f</guid>

					<description>As previously&amp;nbsp;announced, version 4 of the AWS Tools for PowerShell entered maintenance mode on March 1, 2026.&amp;nbsp;In accordance with&amp;nbsp;our SDKs and Tools Maintenance Policy, AWS Tools for PowerShell V4 has now reached end-of-support as of June 1, 2026.&amp;nbsp; Starting June 1, 2026, there&amp;nbsp;are no plans for further updates or releases for V4, including security fixes. Previously published releases should continue […]</description>
										<content:encoded>&lt;p&gt;&lt;span data-contrast="auto"&gt;As &lt;/span&gt;&lt;a href="https://aws.amazon.com/blogs/developer/aws-tools-for-powershell-v4-maintenance-mode-announcement/"&gt;&lt;span data-contrast="none"&gt;previously&amp;nbsp;announced&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;, version 4 of the &lt;/span&gt;&lt;a href="https://aws.amazon.com/powershell/"&gt;&lt;span data-contrast="none"&gt;AWS Tools for PowerShell&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; entered maintenance mode on March 1, 2026.&amp;nbsp;In accordance with&amp;nbsp;our &lt;/span&gt;&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html"&gt;&lt;span data-contrast="none"&gt;SDKs and Tools Maintenance Policy&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;, &lt;/span&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;AWS Tools for PowerShell V4 has now reached end-of-support as of June 1, 2026&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;Starting June 1, 2026, there&amp;nbsp;are no plans for further updates or releases for V4, including security fixes. Previously published releases should continue to be available&amp;nbsp;via the &lt;/span&gt;&lt;a href="https://www.powershellgallery.com/"&gt;&lt;span data-contrast="none"&gt;PowerShell Gallery&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; and the source code will remain on &lt;/span&gt;&lt;a href="https://github.com/aws/aws-tools-for-powershell"&gt;&lt;span data-contrast="none"&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;h2&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;What this means for you&lt;/span&gt;&lt;/b&gt;&lt;span data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;If you are still using AWS Tools for PowerShell V4, your existing scripts and automation should continue to function. However, you should be aware of the following:&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;No new service support&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;: V4 will not receive cmdlets for new AWS services or new features for existing services.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;No security patches&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;: V4 will no longer receive security fixes. If a vulnerability is discovered, it will only be addressed in V5.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="7" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;No bug fixes&lt;/span&gt;&lt;/b&gt;&lt;span data-contrast="auto"&gt;: No further bug fixes will be released for V4.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;Migrating to V5&lt;/span&gt;&lt;/b&gt;&lt;span data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;We strongly encourage all customers still on V4 to migrate to &lt;/span&gt;&lt;a href="https://aws.amazon.com/blogs/developer/aws-tools-for-powershell-v5-now-generally-available/"&gt;&lt;span data-contrast="none"&gt;AWS Tools for PowerShell V5&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; as soon as possible. V5 includes performance enhancements, bug fixes, and continued support for AWS services and regions.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;To help with your migration:&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="10" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;span data-contrast="auto"&gt;Review the &lt;/span&gt;&lt;a href="https://docs.aws.amazon.com/powershell/v5/userguide/migrating-v5.html"&gt;&lt;span data-contrast="none"&gt;Migration Guide&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; to understand the breaking changes. &lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="11" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;span data-contrast="auto"&gt;Update and test your scripts with V5 in a development environment before updating production. &lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;ul&gt; 
 &lt;li data-leveltext="" data-font="Symbol" data-listid="13" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;span data-contrast="auto"&gt;If you&amp;nbsp;encounter&amp;nbsp;issues during migration, open an issue on&amp;nbsp;our&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/aws/aws-tools-for-powershell"&gt;&lt;span data-contrast="none"&gt;GitHub repository&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;&lt;b&gt;&lt;span data-contrast="auto"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;span data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:200}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;AWS Tools for PowerShell V4 has reached end-of-support. We strongly recommend migrating to V5 to continue receiving security updates, bug fixes, and support for AWS services.&amp;nbsp;&lt;/span&gt;&lt;a href="https://docs.aws.amazon.com/powershell/v5/userguide/migrating-v5.html"&gt;&lt;span data-contrast="none"&gt;Migration documentation&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; is available to guide you through the update process.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt; 
&lt;p&gt;&lt;span data-contrast="auto"&gt;For any questions or issues that arise while updating to the V5, please utilize the GitHub repository’s &lt;/span&gt;&lt;a href="https://github.com/aws/aws-tools-for-powershell/discussions"&gt;&lt;span data-contrast="none"&gt;discussion forums&lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt; or open GitHub &lt;/span&gt;&lt;a href="https://github.com/aws/aws-tools-for-powershell/issues"&gt;&lt;span data-contrast="none"&gt;issues &lt;/span&gt;&lt;/a&gt;&lt;span data-contrast="auto"&gt;to reach out to us. If you find&amp;nbsp;dependencies that are preventing you from updating to V4, please let us know to see if we can help.&lt;/span&gt;&lt;span data-ccp-props="{}"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Introducing multipart download support for AWS Tools for PowerShell v5</title>
		<link>https://aws.amazon.com/blogs/developer/introducing-multipart-download-support-for-aws-tools-for-powershell-v5/</link>
					
		
		<dc:creator><![CDATA[Sanket Tangade]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 19:04:35 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS Tools for PowerShell]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[PowerShell]]></category>
		<guid isPermaLink="false">5426cd0555633d49a8b28a097b105a9b62dd5efd</guid>

					<description>The new multipart download support in AWS Tools for PowerShell v5&amp;nbsp;improves the performance of downloading large objects from Amazon Simple Storage Service (Amazon S3) compared to the single-stream downloads. The Read-S3Object and Copy-S3Object cmdlets now deliver faster download speeds through an opt-in switch parameter -UseMultipartDownload&amp;nbsp;for multipart downloads, reducing the need for complex code to manage […]</description>
										<content:encoded>&lt;p&gt;The new multipart download support in &lt;a href="https://docs.aws.amazon.com/powershell/latest/userguide/" target="_blank" rel="noopener noreferrer"&gt;AWS Tools for PowerShell v5&lt;/a&gt;&amp;nbsp;improves the performance of downloading large objects from &lt;a href="https://aws.amazon.com/s3/" target="_blank" rel="noopener noreferrer"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt; compared to the single-stream downloads. The &lt;code&gt;Read-S3Object&lt;/code&gt; and &lt;code&gt;Copy-S3Object&lt;/code&gt; cmdlets now deliver faster download speeds through an opt-in switch parameter &lt;code&gt;-UseMultipartDownload&lt;/code&gt;&amp;nbsp;for multipart downloads, reducing the need for complex code to manage concurrent connections, handle retries, and coordinate multiple download streams. It uses the&lt;a href="https://docs.aws.amazon.com/sdk-for-net/" target="_blank" rel="noopener noreferrer"&gt; AWS SDK for .NET v4&lt;/a&gt; S3 Transfer Manager under the hood to execute the downloads.&lt;/p&gt; 
&lt;p&gt;In this post, we’ll show you how to configure and use these new multipart download capabilities, including downloading single objects and directories, choosing between download strategies, customizing parallelism settings, and migrating your existing download methods to take advantage of these performance improvements.&lt;/p&gt; 
&lt;h2&gt;Parallel download using part numbers and byte-ranges&lt;/h2&gt; 
&lt;p&gt;For download operations, &lt;code&gt;Read-S3Object&lt;/code&gt; and &lt;code&gt;Copy-S3Object&lt;/code&gt; now support both &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance-guidelines.html" target="_blank" rel="noopener noreferrer"&gt;part number and byte-range&lt;/a&gt; fetches. Part number fetches download the object in parts, using the part number that Amazon S3 assigned to each object part during upload. Byte-range fetches download the object with byte ranges and work on objects, regardless of whether they were originally uploaded using &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html" target="_blank" rel="noopener noreferrer"&gt;multipart upload &lt;/a&gt;or not. The transfer manager splits your &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" target="_blank" rel="noopener noreferrer"&gt;GetObject&amp;nbsp;&lt;/a&gt;request into multiple smaller requests, each of which retrieves a specific portion of the object. The transfer manager executes your requests through concurrent connections to Amazon S3.&lt;/p&gt; 
&lt;h2&gt;Choosing between part number and byte-range strategies&lt;/h2&gt; 
&lt;p&gt;Choose between part number and byte-range downloads based on your object’s structure. Part number downloads (the default) work best for objects uploaded with standard multipart upload part sizes. If the object is a non-multipart object, choose byte-range downloads.&amp;nbsp;Range downloads facilitate greater parallelization when objects have large parts and work with S3 objects regardless of the upload method that was used.&lt;/p&gt; 
&lt;p&gt;Keep in mind that smaller range sizes result in more S3 requests. Each API call incurs a &lt;a href="https://aws.amazon.com/s3/pricing/" target="_blank" rel="noopener noreferrer"&gt;request cost&lt;/a&gt;&amp;nbsp;beyond the data transfer itself, so balance parallelism benefits against the number of requests for your use case.&lt;/p&gt; 
&lt;p&gt;Now that you understand the download strategies, let’s get started.&lt;/p&gt; 
&lt;h2&gt;Getting started&lt;/h2&gt; 
&lt;p&gt;To get started with multipart downloads in AWS Tools for PowerShell, follow these steps:&lt;/p&gt; 
&lt;h3&gt;Update your module&lt;/h3&gt; 
&lt;p&gt;Update AWS Tools modules to latest version. Available from version &lt;a href="https://www.powershellgallery.com/packages/AWS.Tools.S3/5.0.208" target="_blank" rel="noopener noreferrer"&gt;5.0.208&lt;/a&gt; and later.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-powershell"&gt;&lt;strong&gt; # Modular (recommended)&lt;/strong&gt;
PS&amp;gt; Update-Module AWS.Tools.S3

&lt;strong&gt;# Or monolithic&lt;/strong&gt;
PS&amp;gt; Update-Module AWSPowerShell.NetCore

&lt;strong&gt;# Or Windows PowerShell monolithic&lt;/strong&gt;
PS&amp;gt; Update-Module AWSPowerShell&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Download an object to file&lt;/h3&gt; 
&lt;p&gt;To download an object from an Amazon S3 bucket to a local file with multipart support, add the &lt;code&gt;-UseMultipartDownload&lt;/code&gt; switch to your &lt;code&gt;Read-S3Object&lt;/code&gt; command. You must provide the source bucket, the S3 object key, and the destination file path.&lt;/p&gt; 
&lt;div&gt; 
 &lt;pre&gt;&lt;code class="lang-powershell"&gt;&lt;strong&gt;# Download large file with multipart support (Part number strategy)&lt;/strong&gt;
PS&amp;gt; $response = Read-S3Object&amp;nbsp;-BucketName&amp;nbsp;amzn-s3-demo-bucket&amp;nbsp;-Key&amp;nbsp;"data/large-dataset.zip"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-File&amp;nbsp;"C:\downloads\large-dataset.zip"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-UseMultipartDownload
	
$response.ContentRange
$response.ETag
$response.ChecksumType
# And other 33 response object parameters.
&lt;/code&gt;&lt;code class="lang-powershell"&gt;
&lt;strong&gt;# Download using byte-range strategy (works with any S3 object)&lt;/strong&gt;
PS&amp;gt; Read-S3Object&amp;nbsp;-BucketName&amp;nbsp;amzn-s3-demo-bucket&amp;nbsp;-Key&amp;nbsp;"data/any-object.dat"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-File&amp;nbsp;"C:\downloads\any-object.dat"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-UseMultipartDownload&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-MultipartDownloadType&amp;nbsp;RANGE `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-PartSize&amp;nbsp;16MB&amp;nbsp;&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;You can customize the following options:&lt;/p&gt; 
&lt;div&gt; 
 &lt;pre&gt;&lt;code class="lang-powershell"&gt;&lt;strong&gt;# Custom concurrent connections (default is 10) (Linux based example)&lt;/strong&gt;
PS&amp;gt; Read-S3Object -BucketName amzn-s3-demo-bucket -Key "data/large-file.bin" `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-File "/home/user/downloads/large-file.bin" `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-UseMultipartDownload `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-MultipartDownloadType RANGE `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-PartSize 64MB `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-ConcurrentServiceRequest 20&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;Experiment with these values to find the best configuration for your use case. Factors like object size and available network bandwidth will influence which settings work best.&lt;/p&gt; 
&lt;h3&gt;Download a directory&lt;/h3&gt; 
&lt;p&gt;To download multiple objects from an S3 bucket prefix to a local directory, use the &lt;code&gt;-KeyPrefix&lt;/code&gt; and &lt;code&gt;-Folder&lt;/code&gt; parameters with &lt;code&gt;-UseMultipartDownload&lt;/code&gt;. The cmdlet automatically applies multipart download to each individual object in the directory.&lt;/p&gt; 
&lt;div&gt; 
 &lt;pre&gt;&lt;code class="lang-powershell"&gt;&lt;strong&gt;# Download entire directory with multipart support for large files&lt;/strong&gt;
PS&amp;gt; Read-S3Object&amp;nbsp;-BucketName&amp;nbsp;amzn-s3-demo-bucket&amp;nbsp;-KeyPrefix&amp;nbsp;"data/"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-Folder&amp;nbsp;"C:\downloads\data"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-UseMultipartDownload&amp;nbsp;`
&amp;nbsp; &amp;nbsp; -ConcurrentServiceRequest 10 `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-DownloadFilesConcurrently&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;The &lt;code&gt;-DownloadFilesConcurrently&lt;/code&gt; parameter facilitates file-level parallelism, downloading multiple files at the same time. When combined with &lt;code&gt;-UseMultipartDownload&lt;/code&gt;, each individual file also benefits from part-level parallelism, providing high throughput for directory downloads containing many large files.&lt;/p&gt; 
&lt;h3&gt;Using Copy-S3Object&lt;/h3&gt; 
&lt;p&gt;The same multipart download parameters are available on &lt;code&gt;Copy-S3Object&lt;/code&gt; for S3-to-local download operations.&lt;/p&gt; 
&lt;div&gt; 
 &lt;pre&gt;&lt;code class="lang-powershell"&gt;PS&amp;gt; $response = Copy-S3Object&amp;nbsp;-BucketName&amp;nbsp;-Key&amp;nbsp;"data/large-file.bin"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-LocalFile&amp;nbsp;"C:\downloads\large-file.bin"&amp;nbsp;`
&amp;nbsp;&amp;nbsp; &amp;nbsp;-UseMultipartDownload&amp;nbsp;`
&amp;nbsp; &amp;nbsp; -MultipartDownloadType&amp;nbsp;RANGE `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-PartSize&amp;nbsp;16MB
$response.ContentRange
$response.ETag
$response.ChecksumType
# And other 33 response object parameters.&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;Note: The multipart download parameters only apply to S3-to-local download operations in &lt;code&gt;Copy-S3Object&lt;/code&gt;. They are not available for S3-to-S3 copy operations.&lt;/p&gt; 
&lt;h2&gt;New parameters at a glance&lt;/h2&gt; 
&lt;table class="styled-table" border="1px" cellpadding="10px"&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Parameter&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Description&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;1&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;-UseMultipartDownload&lt;/code&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Opt-in switch for multipart parallel download&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;2&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;-MultipartDownloadType&lt;/code&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;PART&lt;/code&gt; (default) or &lt;code&gt;RANGE&lt;/code&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;3&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;-PartSize&lt;/code&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Part size for RANGE mode (e.g., &lt;code&gt;8MB&lt;/code&gt;, &lt;code&gt;64MB&lt;/code&gt;, &lt;code&gt;1GB&lt;/code&gt;). Default is 8 MB&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;4&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;-ConcurrentServiceRequest&lt;/code&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Maximum number of parallel HTTP connections. Default is 10&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;5&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;-DownloadFilesConcurrently&lt;/code&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;File-level parallelism for directory downloads&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;6&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;-FailurePolicy&lt;/code&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;code&gt;AbortOnFailure&lt;/code&gt; (default) or &lt;code&gt;ContinueOnFailure&lt;/code&gt; for directory downloads&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Migration path&lt;/h2&gt; 
&lt;p&gt;The new &lt;code&gt;-UseMultipartDownload&lt;/code&gt; parameter comes with both multipart performance as well as access to S3 response metadata. Here’s how to migrate your existing code:&lt;/p&gt; 
&lt;div&gt; 
 &lt;pre&gt;&lt;code class="lang-powershell"&gt;&lt;strong&gt;# Existing code (still works but returns legacy response object System.IO.FileInfo) &lt;/strong&gt;
PS&amp;gt; Read-S3Object -BucketName amzn-s3-demo-bucket -Key "data/large-dataset.zip" -File "C:\downloads\large-dataset.zip" &lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h4&gt;For directory downloads:&lt;/h4&gt; 
&lt;div&gt; 
 &lt;pre&gt;&lt;code class="lang-powershell"&gt;&lt;strong&gt;#&amp;nbsp;Existing code (still works but returns legacy response object System.IO.DirectoryInfo) &lt;/strong&gt;
PS&amp;gt; Read-S3Object -BucketName amzn-s3-demo-bucket -KeyPrefix "data/"&amp;nbsp;-Folder "C:\downloads\data"

&lt;strong&gt;#&amp;nbsp;Enhanced&amp;nbsp;version with multipart support (returns S3 response metadata) &lt;/strong&gt;
PS&amp;gt; Read-S3Object -BucketName amzn-s3-demo-bucket -KeyPrefix "data/" `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-Folder "C:\downloads\data" `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-UseMultipartDownload `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-ConcurrentServiceRequest 10 `
&amp;nbsp;&amp;nbsp; &amp;nbsp;-DownloadFilesConcurrently&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;The multipart download support in AWS Tools for PowerShell provides performance improvements for downloading large objects from Amazon S3. By using parallel byte-range or part-number fetches, you can reduce transfer times. This feature is fully opt-in and available in all three module variants: &lt;a href="https://www.powershellgallery.com/packages/AWS.Tools.S3/5.0.208" target="_blank" rel="noopener noreferrer"&gt;AWS.Tools.S3&lt;/a&gt;, &lt;a href="https://www.powershellgallery.com/packages/AWSPowerShell.NetCore/5.0.208" target="_blank" rel="noopener noreferrer"&gt;AWSPowerShell.NetCore&lt;/a&gt;, and &lt;a href="https://www.powershellgallery.com/packages/AWSPowerShell/5.0.208" target="_blank" rel="noopener noreferrer"&gt;AWSPowerShell&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Next steps&lt;/strong&gt;: Try implementing multipart downloads in your scripts and measure the performance improvements for your specific use cases.&lt;/p&gt; 
&lt;p&gt;To learn more about AWS Tools for PowerShell, visit the AWS Tools for PowerShell &lt;a href="https://docs.aws.amazon.com/powershell/v5/userguide/pstools-welcome.html" target="_blank" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. For questions or feedback about this feature, visit the &lt;a href="https://github.com/aws/aws-tools-for-powershell/issues" target="_blank" rel="noopener noreferrer"&gt;GitHub issues&lt;/a&gt; page. For more details on the underlying multipart download engine, see the AWS SDK for .NET &lt;a href="https://aws.amazon.com/blogs/developer/introducing-multipart-download-support-for-aws-sdk-for-net-transfer-manager/" target="_blank" rel="noopener noreferrer"&gt;blog post&lt;/a&gt;.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Announcing updated retry behavior for AWS SDKs and Tools</title>
		<link>https://aws.amazon.com/blogs/developer/announcing-updated-retry-behavior-for-aws-sdks-and-tools/</link>
					
		
		<dc:creator><![CDATA[Matthew Miller]]></dc:creator>
		<pubDate>Wed, 20 May 2026 18:42:23 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[SDK]]></category>
		<guid isPermaLink="false">12091d0c727209f33732c07f9f062b7e20001b99</guid>

					<description>When your application calls an AWS service and the request fails with a retryable error, the AWS SDK retries it automatically. The retry behavior controls how long the SDK waits between attempts and when it gives up. Most of this happens in the background, but it directly affects how your application experiences errors and latency. […]</description>
										<content:encoded>&lt;p&gt;When your application calls an AWS service and the request fails with a retryable error, the AWS SDK retries it automatically. The retry behavior controls how long the SDK waits between attempts and when it gives up. Most of this happens in the background, but it directly affects how your application experiences errors and latency.&lt;/p&gt; 
&lt;p&gt;Until today, retry defaults varied across SDKs. Some waited too long before retrying transient errors, and others would keep retrying instead of failing fast, even during sustained outages. The updated behavior addresses both issues with consistent defaults across all AWS SDKs.&lt;/p&gt; 
&lt;p&gt;You can opt in to the updated behavior starting today across AWS SDKs, the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/" target="_blank" rel="noopener noreferrer"&gt;AWS Command Line Interface (AWS CLI)&lt;/a&gt;, and &lt;a href="https://docs.aws.amazon.com/powershell/latest/userguide/" target="_blank" rel="noopener noreferrer"&gt;AWS Tools for PowerShell&lt;/a&gt;. These changes will become the default in November 2026.&lt;/p&gt; 
&lt;p&gt;This post covers what changed, how to tell if you’re affected, how to opt in, and how to revert.&lt;/p&gt; 
&lt;h2&gt;What changed&lt;/h2&gt; 
&lt;p&gt;This update changes how &lt;code&gt;standard&lt;/code&gt; and &lt;code&gt;adaptive&lt;/code&gt; (a rate-limiting mode built on &lt;code&gt;standard&lt;/code&gt;) retry modes handle failed requests. It also makes standard the default for SDKs that had previously defaulted to &lt;code&gt;legacy&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Most SDKs use the &lt;code&gt;standard&lt;/code&gt; retry mode by default. It includes a retry quota, exponential backoff with jitter, and a standard set of retryable errors. Some older SDKs still default to &lt;code&gt;legacy&lt;/code&gt; mode, which lacks a retry quota and behaves inconsistently across SDKs. For a full comparison, see &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html" target="_blank" rel="noopener noreferrer"&gt;Retry behavior&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Retry quota updates&lt;/h3&gt; 
&lt;p&gt;&lt;code&gt;standard&lt;/code&gt; mode has always included a retry quota: a token bucket that tracks how many retries your client is making. When failures are persistent, the budget depletes and the SDK stops retrying. At scale, this helps outages resolve faster (&lt;a href="https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/" target="_blank" rel="noopener noreferrer"&gt;retry traffic from many clients can delay recovery&lt;/a&gt;) and reduces your client-side latency by failing fast instead of waiting through retries that are unlikely to succeed.&lt;/p&gt; 
&lt;p&gt;If you were using &lt;code&gt;legacy&lt;/code&gt; mode, this is new to you. &lt;code&gt;legacy&lt;/code&gt; mode had no standardized retry quota, so the SDK would keep retrying up to the max attempt count regardless of how many requests were failing.&lt;/p&gt; 
&lt;p&gt;In the updated &lt;code&gt;standard&lt;/code&gt; mode, each transient error retry costs 14 tokens (up from 5 in the previous version of &lt;code&gt;standard&lt;/code&gt; mode). Retries after throttling responses cost 5 tokens. The higher cost for transient errors means the quota engages sooner during sustained outages, letting the service recover faster. For a deeper look at how the retry quota works, see &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html#retry-quota-token-bucket" target="_blank" rel="noopener noreferrer"&gt;Retry quota (token bucket)&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Faster retries for transient errors&lt;/h3&gt; 
&lt;p&gt;The first retry after a transient error is now much faster, about 25 ms on average for a brief HTTP 503 response, down from hundreds of milliseconds or more.&lt;/p&gt; 
&lt;p&gt;&lt;code&gt;standard&lt;/code&gt; mode now uses different backoff delays depending on the type of error:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Transient errors&lt;/strong&gt; (connection resets, DNS failures, HTTP 500/502/503/504): &lt;strong&gt;50 ms&lt;/strong&gt; base delay. These errors are typically short-lived, making them good candidates for immediate retry.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Throttling errors&lt;/strong&gt; (where the service asks you to slow down): &lt;strong&gt;1,000 ms&lt;/strong&gt; base delay. A longer delay gives the service time to recover capacity.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Previously, each SDK applied the same base delay regardless of error type, but that delay varied across SDKs, from 10 ms to 1,000 ms.&lt;/p&gt; 
&lt;h3&gt;Amazon DynamoDB tuning&lt;/h3&gt; 
&lt;p&gt;&lt;a href="https://aws.amazon.com/dynamodb/" target="_blank" rel="noopener noreferrer"&gt;Amazon DynamoDB&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html" target="_blank" rel="noopener noreferrer"&gt;Amazon DynamoDB Streams&lt;/a&gt; use a shorter base backoff delay (25 ms instead of 50 ms) to match their low-latency profile. These clients default to 4 max attempts. The additional attempt keeps the last retry’s maximum backoff comparable to other services. Previous defaults varied by SDK (up to 10 max attempts in some SDKs). For details, see &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html#dynamodb" target="_blank" rel="noopener noreferrer"&gt;DynamoDB&lt;/a&gt; in the retry behavior documentation.&lt;/p&gt; 
&lt;h3&gt;Long-polling operations&lt;/h3&gt; 
&lt;p&gt;Long-polling operations (such as the &lt;a href="https://aws.amazon.com/sqs/" target="_blank" rel="noopener noreferrer"&gt;Amazon SQS&lt;/a&gt; &lt;code&gt;ReceiveMessage&lt;/code&gt; operation) now apply a backoff delay before returning an error when the retry quota is depleted. Without this, a depleted quota returns the error immediately, which can cause polling loops to tighten, spiking CPU usage on the client and generating additional load on the service. For details, see &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html#long-polling-operations" target="_blank" rel="noopener noreferrer"&gt;Long-polling operations&lt;/a&gt;&amp;nbsp;documentation.&lt;/p&gt; 
&lt;h2&gt;Does this impact me?&lt;/h2&gt; 
&lt;p&gt;This update changes behavior within &lt;code&gt;standard&lt;/code&gt; and &lt;code&gt;adaptive&lt;/code&gt; retry modes. Whether you’re affected depends on your current configuration:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;No explicit retry configuration at all?&lt;/strong&gt; You will see all the changes after you opt in (or after the default rollout in November 2026). For SDKs that currently default to &lt;code&gt;legacy&lt;/code&gt; mode (Java, Python, Ruby, PHP, C++, and the AWS CLI), this also switches the default to &lt;code&gt;standard&lt;/code&gt;, which adds a retry quota.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Explicitly set retry mode to &lt;code&gt;standard&lt;/code&gt; or &lt;code&gt;adaptive&lt;/code&gt;?&lt;/strong&gt; You will see the new backoff timing, retry quota costs, and DynamoDB defaults. Your mode choice doesn’t change, but how these modes behave does.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Explicitly set &lt;code&gt;max_attempts&lt;/code&gt; or backoff settings?&lt;/strong&gt; Those specific values stay as you configured them. Other settings you didn’t override (such as retry quota costs and DynamoDB defaults) will still update to the new defaults.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Explicitly set retry mode to &lt;code&gt;legacy&lt;/code&gt;?&lt;/strong&gt; No changes. &lt;code&gt;legacy&lt;/code&gt; mode is unchanged.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Haven’t set &lt;code&gt;AWS_NEW_RETRIES_2026=true&lt;/code&gt;?&lt;/strong&gt; No changes until the default rollout in November 2026.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;How to opt in&lt;/h2&gt; 
&lt;p&gt;Set the following environment variable:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;export AWS_NEW_RETRIES_2026=true&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;The flag works across all AWS SDKs that have released support. See SDK availability and GitHub issues below for which SDKs support the flag today.&lt;/p&gt; 
&lt;p&gt;We recommend testing on a non-production workload first.&lt;/p&gt; 
&lt;h2&gt;Where you might notice a difference&lt;/h2&gt; 
&lt;p&gt;For most workloads, the update is invisible or an improvement. Transient errors recover faster and you don’t need to change any code.&lt;/p&gt; 
&lt;p&gt;A few things to watch for:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Max attempts may have decreased.&lt;/strong&gt; Some SDKs previously defaulted to more than 3 max attempts. If your workload relied on a high retry count to eventually succeed, you may see more errors surfaced to your application. You can override &lt;code&gt;max_attempts&lt;/code&gt; to restore your previous value.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Some SDKs gain a retry quota for the first time.&lt;/strong&gt; SDKs that previously defaulted to &lt;code&gt;legacy&lt;/code&gt; mode had no standardized retry quota. The SDK will retry up to the max attempt count regardless of how many requests were failing. With &lt;code&gt;standard&lt;/code&gt; mode, the SDK tracks a 500-token budget and stops retrying during sustained failures. Your application sees errors sooner during prolonged outages, but it also frees up threads and connections instead of waiting on retries that are unlikely to succeed.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;The retry quota activates sooner for transient errors.&lt;/strong&gt; The higher transient retry cost means the quota depletes at a lower failure rate during sustained transient failures, such as a wave of 500 responses.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For SDK-specific before and after values, see your SDK’s GitHub tracking issue in the table below.&lt;/p&gt; 
&lt;h2&gt;How to revert&lt;/h2&gt; 
&lt;p&gt;Remove or unset the opt-in environment variable:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;unset AWS_NEW_RETRIES_2026&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;After the default rollout in November 2026, the opt-in flag is ignored. To revert at that point, override individual settings such as &lt;code&gt;max_attempts&lt;/code&gt; or backoff configuration. See your SDK’s GitHub tracking issue for revert instructions specific to your SDK.&lt;/p&gt; 
&lt;p&gt;For SDKs that support &lt;code&gt;legacy&lt;/code&gt; mode (Java, Python, Ruby, PHP, C++, and the AWS CLI), you can also restore the previous behavior in a single setting:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;export AWS_RETRY_MODE=legacy&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h2&gt;SDK availability and GitHub issues&lt;/h2&gt; 
&lt;p&gt;Eight SDKs support the opt-in flag today. Six more are coming in the following weeks.&lt;/p&gt; 
&lt;table class="styled-table" border="1px" cellpadding="10px"&gt; 
 &lt;thead&gt; 
  &lt;tr&gt; 
   &lt;th style="padding: 10px;border: 1px solid #dddddd"&gt;SDK&lt;/th&gt; 
   &lt;th style="padding: 10px;border: 1px solid #dddddd"&gt;Opt-in available&lt;/th&gt; 
   &lt;th style="padding: 10px;border: 1px solid #dddddd"&gt;GitHub tracking issue&lt;/th&gt; 
  &lt;/tr&gt; 
 &lt;/thead&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Java 2.x&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-java-v2/discussions/6984" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Python (boto3)&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/boto/boto3/discussions/4789" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;.NET&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-net/issues/4411" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;PowerShell&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-tools-for-powershell/issues/418" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;JavaScript 3.x&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-js-v3/issues/8037" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;PHP&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-php/discussions/3285" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Kotlin&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-kotlin/discussions/1885" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Rust&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Available&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/awslabs/aws-sdk-rust/discussions/1431" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Swift&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Coming soon&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/awslabs/aws-sdk-swift/discussions/2166" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Ruby&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Coming soon&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-ruby/discussions/3390" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Go 2.x&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Coming soon&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-go-v2/issues/3416" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;C++&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Coming soon&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-sdk-cpp/issues/3832" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;AWS CLI&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Coming soon&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;a href="https://github.com/aws/aws-cli/discussions/10329" target="_blank" rel="noopener noreferrer"&gt;Tracking issue&lt;/a&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;p&gt;Each tracking issue includes: minimum SDK version, before-and-after defaults, code examples, and a feedback section.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;This update brings consistent, faster retry defaults across all AWS SDKs. You can opt in today by setting &lt;code&gt;AWS_NEW_RETRIES_2026=true&lt;/code&gt; and revert at any time if you need to. We encourage you to try it on a non-production workload first, then roll it out to production before the defaults change in November 2026. If you don’t opt in before then, the new behavior will apply automatically.&lt;/p&gt; 
&lt;h2&gt;Give us feedback&lt;/h2&gt; 
&lt;p&gt;If you run into unexpected behavior, or if the changes work well for you, comment on your SDK’s GitHub tracking issue. Your feedback during the opt-in window helps us make the default rollout better for everyone.&lt;/p&gt; 
&lt;h2&gt;Learn more&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html" target="_blank" rel="noopener noreferrer"&gt;Retry behavior&lt;/a&gt;: retry mode selection, settings, and configuration precedence.&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html#how-retries-work" target="_blank" rel="noopener noreferrer"&gt;How retries work&lt;/a&gt;: backoff formula, error classification, retry quota mechanics, and service-specific behavior.&lt;/li&gt; 
&lt;/ul&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Announcing AWS SDK for Swift’s Transfer Manager for Amazon S3</title>
		<link>https://aws.amazon.com/blogs/developer/announcing-the-general-availability-of-amazon-s3-transfer-manager-for-swift/</link>
					
		
		<dc:creator><![CDATA[Chan Yoo]]></dc:creator>
		<pubDate>Mon, 04 May 2026 21:45:13 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for Swift]]></category>
		<guid isPermaLink="false">60b07ce31dbdd4fc890eeed6dde935123b5fbc31</guid>

					<description>We are pleased to announce the general availability of the Amazon S3 Transfer Manager&amp;nbsp;for Swift – a high level file and directory transfer utility for the Amazon Simple Storage Service (Amazon S3) built with the AWS SDK for Swift. Using Transfer Manager’s simple API, you can perform accelerated uploads of local files and directories to […]</description>
										<content:encoded>&lt;p&gt;We are pleased to announce the general availability of the &lt;a href="https://github.com/aws/aws-sdk-swift-s3-transfer-manager" target="_blank" rel="noopener noreferrer"&gt;Amazon S3 Transfer Manager&amp;nbsp;for Swift&lt;/a&gt; – a high level file and directory transfer utility for the &lt;a href="https://aws.amazon.com/pm/serv-s3/?trk=7f874f1e-8322-484a-89b5-535f065224e5&amp;amp;sc_channel=ps&amp;amp;ef_id=CjwKCAjwtcHPBhADEiwAWo3sJiuD0on7HnBb9cuPtyQ0JC_42ZKgrFIiCPLWGLCixzzN0EF6Tk1ckBoC7IAQAvD_BwE:G:s&amp;amp;s_kwcid=AL!4422!3!798517304589!e!!g!!amazon%20s3!23606217092!193598648053&amp;amp;gad_campaignid=23606217092&amp;amp;gbraid=0AAAAADjHtp-YvUjJ33JaSogVqtxYdejlB&amp;amp;gclid=CjwKCAjwtcHPBhADEiwAWo3sJiuD0on7HnBb9cuPtyQ0JC_42ZKgrFIiCPLWGLCixzzN0EF6Tk1ckBoC7IAQAvD_BwE"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt; built with the &lt;a href="https://github.com/awslabs/aws-sdk-swift" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for Swift&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Using Transfer Manager’s simple API, you can perform accelerated uploads of local files and directories to Amazon S3 and accelerated downloads of objects and buckets&amp;nbsp;from Amazon S3 and benefit from enhanced throughput and reliability, which is achieved through concurrent transfers of a set of small parts from a single object. The Transfer Manager is built on top of the &lt;a href="https://github.com/awslabs/aws-sdk-swift" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for Swift&lt;/a&gt; and leverages Amazon S3 multipart upload and byte-range / part-number fetches for parallel transfers. You can also track the progress of transfers in real-time as well.&lt;/p&gt; 
&lt;h2&gt;Parallel upload via multipart upload&lt;/h2&gt; 
&lt;p&gt;For the upload operation, the Transfer Manager uses the Amazon S3 &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html" target="_blank" rel="noopener noreferrer"&gt;multipart upload API&lt;/a&gt;; it sends multiple &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html" target="_blank" rel="noopener noreferrer"&gt;UploadPart&lt;/a&gt;&amp;nbsp; requests concurrently behind the scenes to achieve high performance.&lt;/p&gt; 
&lt;h2&gt;Parallel download via byte-ranges or part numbers&lt;/h2&gt; 
&lt;p&gt;For the download operation, the Transfer Manager utilizes &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/range-get-olap.html" target="_blank" rel="noopener noreferrer"&gt;byte-range fetches&lt;/a&gt;&amp;nbsp;or part number fetches. Byte range fetches download the object with byte ranges and works on all objects, regardless of whether it was originally uploaded&amp;nbsp;using &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html" target="_blank" rel="noopener noreferrer"&gt;multipart upload&lt;/a&gt; or not. Part number fetches download the object in parts, using the part number assigned to each object part during upload. The transfer manager splits one &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html" target="_blank" rel="noopener noreferrer"&gt;GetObject&lt;/a&gt; request to multiple smaller requests, each of which retrieves a specific portion of the object. Those requests are also executed through concurrent connections to Amazon S3.&lt;/p&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;p&gt;To get started with Amazon S3 Transfer Manager for Swift, complete the following steps:&lt;/p&gt; 
&lt;h3&gt;Add the dependency to your Xcode project&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Open your project in Xcode and click on your &lt;code&gt;.xcodeproj&lt;/code&gt; file, located at the top of the file navigator on the left pane.&lt;/li&gt; 
 &lt;li&gt;Click the project name that appears on the left pane of the &lt;code&gt;.xcodeproj&lt;/code&gt; file window.&lt;/li&gt; 
 &lt;li&gt;Click on &lt;code&gt;Package Dependencies&lt;/code&gt; tab, and click &lt;code&gt;+&lt;/code&gt; button.&lt;/li&gt; 
 &lt;li&gt;In &lt;code&gt;Search or Enter Package URL&lt;/code&gt; search bar, enter &lt;code&gt;git@github.com:aws/aws-sdk-swift-s3-transfer-manager.git&lt;/code&gt;.&lt;/li&gt; 
 &lt;li&gt;Wait for package to load, and once it’s loaded, choose the target you want to add the &lt;code&gt;S3TransferManager&lt;/code&gt; module to.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h3&gt;Add the dependency to your Swift package&lt;/h3&gt; 
&lt;ol&gt; 
 &lt;li&gt;Add the below to your package definition:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-code"&gt;dependencies: [
&amp;nbsp; &amp;nbsp; .package(
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url: "https://github.com/aws/aws-sdk-swift-s3-transfer-manager.git",
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from: "&amp;lt;VERSION_STRING&amp;gt;"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
],&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;ol start="2"&gt; 
 &lt;li&gt;Add an&amp;nbsp;&lt;code&gt;S3TransferManager&lt;/code&gt; module dependency to the target that needs it. For example:&lt;/li&gt; 
&lt;/ol&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-code"&gt;targets: [
&amp;nbsp; &amp;nbsp; .target(
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: "YourTargetThatUsesS3TM",
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dependencies: [
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.product(
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: "S3TransferManager",
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;package: "aws-sdk-swift-s3-transfer-manager"
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
]&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h3&gt;Initialize the S3 Transfer Manager&lt;/h3&gt; 
&lt;p&gt;You can initialize an S3TM instance with all-default settings by simply doing this:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-javascript"&gt;// Creates and uses default S3TM config &amp;amp; S3 client.
let s3tm = try await S3TransferManager()&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;Or you can pass a configuration object to the initializer to customize S3TM, like this:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-javascript"&gt;// Create the custom S3 client config that you want S3TM to use.
let customS3ClientConfig = try S3Client.S3ClientConfig(
&amp;nbsp; &amp;nbsp; region: "us-west-2",
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;. . . custom S3 client configurations . . .
)

// Create the custom S3TM config with the S3 client config initialized above.
let s3tmConfig = try await S3TransferManagerConfig(
&amp;nbsp; &amp;nbsp; s3ClientConfig: customS3ClientConfig,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;targetPartSizeBytes: 10 * 1024 * 1024, // 10MB part size.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;multipartUploadThresholdBytes: 100 * 1024 * 1024, // 100MB threshold.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;multipartDownloadType: .part
)

// Finally, create the S3TM using the custom S3TM config.
let s3tm = S3TransferManager(config: s3tmConfig)&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;For more information about what each configuration does, please refer to &lt;a href="https://github.com/aws/aws-sdk-swift-s3-transfer-manager/blob/main/Sources/S3TransferManager/S3TransferManagerConfig.swift" target="_blank" rel="noopener noreferrer"&gt;the documentation comments on S3TransferManagerConfig&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Upload an object&lt;/h3&gt; 
&lt;p&gt;To upload a file to Amazon S3, you need to provide the input struct &lt;code&gt;UploadObjectInput&lt;/code&gt;, which contains a subset of &lt;code&gt;PutObjectInput&lt;/code&gt; struct properties and an array of transfer listeners. You must provide the destination bucket, the S3 object key to use, and the object body.&lt;/p&gt; 
&lt;p&gt;When object being uploaded is bigger than the threshold configured by &lt;code&gt;multipartUploadThresholdBytes&lt;/code&gt; (16MB default), S3TM breaks them down into parts, each with the part size configured by &lt;code&gt;targetPartSizeBytes&lt;/code&gt; (8MB default), and uploads them concurrently using S3’s &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpu-process" target="_blank" rel="noopener noreferrer"&gt;multipart upload feature&lt;/a&gt;.&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-javascript"&gt;// Construct UploadObjectInput.
let uploadObjectInput = UploadObjectInput(
&amp;nbsp;&amp;nbsp; &amp;nbsp;body: ByteStream.stream(
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FileStream(fileHandle: try FileHandle(forReadingFrom: URL(string: "file-to-upload.txt")!))
&amp;nbsp;&amp;nbsp; &amp;nbsp;),
&amp;nbsp;&amp;nbsp; &amp;nbsp;bucket: "destination-bucket",
&amp;nbsp;&amp;nbsp; &amp;nbsp;key: "some-key"
)

// Call .uploadObject and save the returned task.
let uploadObjectTask = try s3tm.uploadObject(input: uploadObjectInput)
let uploadObjectOutput = try await uploadObjectTask.value&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h3&gt;Download an object&lt;/h3&gt; 
&lt;p&gt;To download an object from Amazon S3, you need to provide the input struct &lt;code&gt;DownloadObjectInput&lt;/code&gt;, which contains the download destination, a subset of &lt;code&gt;GetObjectInput&lt;/code&gt; struct properties, and an array of transfer listeners. The download destination is an instance of &lt;a href="https://developer.apple.com/documentation/foundation/outputstream" target="_blank" rel="noopener noreferrer"&gt;Swift’s Foundation.OutputStream&lt;/a&gt;. You must provide the download destination, the source bucket, and the S3 object key of the object to download.&lt;/p&gt; 
&lt;p&gt;When object being downloaded is bigger than the size of a single part configured by &lt;code&gt;targetPartSizeBytes&lt;/code&gt; &amp;nbsp;(8MB default), S3TM downloads the object in parts concurrently using either part numbers or byte ranges as configured by &lt;code&gt;multipartDownloadType&lt;/code&gt; (&lt;code&gt;.part&lt;/code&gt; default).&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-javascript"&gt;// Construct DownloadObjectInput.
let downloadObjectInput = DownloadObjectInput(
&amp;nbsp;&amp;nbsp; &amp;nbsp;outputStream: OutputStream(toFileAtPath: "destination-file.txt", append: true)!,
&amp;nbsp;&amp;nbsp; &amp;nbsp;bucket: "source-bucket",
&amp;nbsp;&amp;nbsp; &amp;nbsp;key: "s3-object.txt"
)

// Call .downloadObject and save the returned task.
let downloadObjectTask = try s3tm.downloadObject(input: downloadObjectInput)
let downloadObjectOutput = try await downloadObjectTask.value&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;h2&gt;&amp;nbsp;Conclusion&lt;/h2&gt; 
&lt;p&gt;To learn more about how to use the Amazon S3 Transfer Manager for Swift including how to upload a directory, download a bucket, and track transfer progress, visit our &lt;a href="https://github.com/aws/aws-sdk-swift-s3-transfer-manager" target="_blank" rel="noopener noreferrer"&gt;README.md&lt;/a&gt;&amp;nbsp;on GitHub. Try out the new Transfer Manager today and let us know what you think via the &lt;a href="https://github.com/aws/aws-sdk-swift-s3-transfer-manager/issues" target="_blank" rel="noopener noreferrer"&gt;GitHub issues page&lt;/a&gt;!&lt;/p&gt; 
&lt;hr style="width: 80%"&gt; 
&lt;h2&gt;About the authors&lt;/h2&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Create minimal reproductions for AWS SDK JavaScript v3 with create-aws-sdk-repro</title>
		<link>https://aws.amazon.com/blogs/developer/create-minimal-reproductions-for-aws-sdk-javascript-v3-with-create-aws-sdk-repro/</link>
					
		
		<dc:creator><![CDATA[John Lwin]]></dc:creator>
		<pubDate>Thu, 23 Apr 2026 18:37:18 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for JavaScript in Node.js]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">e4c05217967ff09941b388bf552d781d74350cad</guid>

					<description>We’re excited to announce create-aws-sdk-repro, an open source tool that generates ready-to-run AWS SDK for JavaScript v3 projects. You answer a few prompts, pick a service, an operation, environment, and the tool generates a project with everything wired up. With AWS credentials configured, it’s ready to run. In this post, we walk through how the […]</description>
										<content:encoded>&lt;p&gt;We’re excited to announce &lt;a href="https://github.com/awslabs/create-aws-sdk-repro" target="_blank" rel="noopener noreferrer"&gt;create-aws-sdk-repro&lt;/a&gt;, an open source tool that generates ready-to-run &lt;a href="https://aws.amazon.com/sdk-for-javascript/" target="_blank" rel="noopener"&gt;AWS SDK for JavaScript&lt;/a&gt; v3 projects.&lt;/p&gt; 
&lt;p&gt;You answer a few prompts, pick a service, an operation, environment, and the tool generates a project with everything wired up. With AWS credentials configured, it’s ready to run. In this post, we walk through how the tool works, what it generates, and how to use it.&lt;/p&gt; 
&lt;h2&gt;Use cases&lt;/h2&gt; 
&lt;h3&gt;Getting started with a new service&lt;/h3&gt; 
&lt;p&gt;Instead of piecing together documentation and examples, generate a working project for any AWS service in seconds. The correct imports, credential handling, and error handling are already in place.&lt;/p&gt; 
&lt;h3&gt;Testing SDK behavior&lt;/h3&gt; 
&lt;p&gt;Quickly spin up isolated projects to test specific SDK operations without affecting your main codebase.&lt;/p&gt; 
&lt;h3&gt;Troubleshooting SDK issues&lt;/h3&gt; 
&lt;p&gt;If you run into an SDK issue, generate a minimal repro with your service and operation, run it, and share the output in your GitHub issue. A clean project without framework dependencies makes it easier to isolate the problem and get to a resolution faster.&lt;/p&gt; 
&lt;h2&gt;Walkthrough&lt;/h2&gt; 
&lt;p&gt;In this walkthrough, you will generate a Node.js project that calls the Amazon S3 ListBuckets operation in the us-west-2 AWS Region. Each step shows which option to select so you can follow along.&lt;/p&gt; 
&lt;h3&gt;Prerequisites&lt;/h3&gt; 
&lt;ul&gt; 
 &lt;li&gt;Install Node.js version 20 or later. See &lt;a href="https://nodejs.org/en/download" target="_blank" rel="noopener noreferrer"&gt;Node.js downloads&lt;/a&gt; for instructions.&lt;/li&gt; 
 &lt;li&gt;For Node.js projects, configure AWS credentials by running aws configure. For more information, see Configuring the &lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/configuring-the-jssdk.html" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for JavaScript&lt;/a&gt;.&lt;/li&gt; 
 &lt;li&gt;For Browser and React Native projects, set up an Amazon Cognito identity pools. The tool generates a &lt;code&gt;COGNITO_SETUP.md&lt;/code&gt; guide with step-by-step instructions. For more information, see &lt;a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html" target="_blank" rel="noopener noreferrer"&gt;Amazon Cognito identity pools&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h5&gt;Step 1: Run the CLI&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;$ npm create @aws-sdk/repro&lt;/code&gt;&lt;/pre&gt; 
&lt;h5&gt;Step 2: Select your environment&lt;/h5&gt; 
&lt;p&gt;The CLI prompts for the JavaScript environment:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;? Select JavaScript environment: › - Use arrow-keys. Return to submit.
❯   Node.js
    Browser
    React Native&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Node.js uses the default &lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html" target="_blank" rel="noopener noreferrer"&gt;AWS credentials chain&lt;/a&gt;. Browser generates a Vite-based project with &lt;a href="https://aws.amazon.com/cognito/" target="_blank" rel="noopener noreferrer"&gt;Amazon Cognito&lt;/a&gt; identity pools for browser-safe credentials. React Native creates a full native project with required polyfills.&lt;/p&gt; 
&lt;h5&gt;Step 3: Enter a project name&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;? Enter project name: aws-sdk-repro-a1b2c3d4&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The tool suggests a default name with the prefix &lt;code&gt;aws-sdk-repro-&lt;/code&gt; followed by a random identifier for uniqueness. You can enter a custom name. The name must be non-empty and cannot contain the characters &lt;code&gt;/ \ : * ? " &amp;lt; &amp;gt; |&lt;/code&gt;&amp;nbsp;or path traversal sequences (&lt;code&gt;..&lt;/code&gt;). For React Native projects, the name is further sanitized to alphanumeric characters only. For this walkthrough, press Enter to use the default.&lt;/p&gt; 
&lt;h5&gt;Step 4: Select an AWS service&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;? Select or search for AWS service: s3&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The tool provides autocomplete across &lt;code&gt;@aws-sdk/client-*&lt;/code&gt;&amp;nbsp;packages and matches anywhere in the client name. For example, typing ‘s3’ or ‘dynamo’ filters the list to matching packages. It also suggests corrections for typos. For a full list of supported services, see the &lt;a href="https://github.com/aws/aws-sdk-js-v3/tree/main/clients" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for JavaScript v3 client packages&lt;/a&gt;.&lt;/p&gt; 
&lt;h5&gt;Step 5: Wait for operation discovery&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;Fetching available operations for S3...
  Installing @aws-sdk/client-s3...
  Found 107 operations
  Client: S3Client&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The tool temporarily installs the SDK package in a temporary directory and scans it for available command classes (e.g., ListBucketsCommand, PutObjectCommand).&lt;/p&gt; 
&lt;h5&gt;Step 6: Select an operation&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;? Select or search for operation (kebab-case): list-buckets&lt;/code&gt;&lt;/pre&gt; 
&lt;h5&gt;Step 7: Select a Region&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;? Select or enter AWS region: us-west-2 - US West (Oregon)&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Regions across commercial, GovCloud, and China partitions are available with autocomplete. GovCloud and China Regions require separate AWS accounts with specific access. For more information, see &lt;a href="https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html" target="_blank" rel="noopener noreferrer"&gt;Managing AWS Regions&lt;/a&gt;.&lt;/p&gt; 
&lt;h5&gt;Step 8: Review the generated project&lt;/h5&gt; 
&lt;p&gt;The tool creates a project directory with the following files:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-js"&gt;// &lt;em&gt;index.js&lt;/em&gt;
import { S3Client, ListBucketsCommand } from '@aws-sdk/client-s3';

try {
  const client = new S3Client({ region: 'us-west-2' });
  const input = {}; // Add your input parameters here
  const command = new ListBucketsCommand(input);
  const response = await client.send(command);
  console.log('Success:', response);
} catch (error) {
  console.error('Error:', error);
}&lt;/code&gt;&lt;/pre&gt; 
&lt;pre&gt;&lt;code class="lang-json"&gt;// &lt;em&gt;package.json&lt;/em&gt;
{
  "name": "aws-sdk-repro-a1b2c3d4",
  "version": "1.0.0",
  "type": "module",
  "dependencies": {
    "@aws-sdk/client-s3": "latest"
  },
  "scripts": {
    "start": "node index.js"
  }
}&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The generated code imports the correct client class (&lt;code&gt;S3Client&lt;/code&gt;) and command (&lt;code&gt;ListBucketsCommand&lt;/code&gt;) directly from the SDK package. It uses the default credentials chain, so it works with &lt;code&gt;aws configure&lt;/code&gt; or environment variables. Error handling is included, and the input object is empty and ready for you to add request parameters.&lt;/p&gt; 
&lt;h5&gt;Step 9: Run the generated project&lt;/h5&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;cd aws-sdk-repro-a1b2c3d4
npm install
npm start&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;For operations like &lt;code&gt;ListBuckets&lt;/code&gt;, &lt;code&gt;DescribeInstances&lt;/code&gt;, or &lt;code&gt;ListTables&lt;/code&gt;, the empty input object works without additional parameters. For operations that require parameters, add them to the input object in &lt;code&gt;index.js&lt;/code&gt;. IDE autocomplete will show available fields since the types are already imported.&lt;/p&gt; 
&lt;p&gt;The walkthrough above shows a Node.js project. For Browser, the tool generates an &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;index.js&lt;/code&gt; with Cognito credentials, a Vite config, and a &lt;code&gt;COGNITO_SETUP.md&lt;/code&gt; guide. For React Native, it scaffolds a full native project with &lt;code&gt;App.js&lt;/code&gt;, required polyfills, and Cognito setup. Both include step-by-step instructions for configuring a Cognito identity pools.&lt;/p&gt; 
&lt;h2&gt;Clean up&lt;/h2&gt; 
&lt;p&gt;The generated projects are standalone directories on your local machine. To clean up:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;rm -rf aws-sdk-repro-a1b2c3d4&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you created a Cognito identity pools for Browser or React Native testing, delete the Cognito identity pools and any associated IAM roles that are no longer needed. There are no ongoing AWS costs from the tool itself. Standard API pricing applies only when you run the generated project and make API calls.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;create-aws-sdk-repro automates the setup for creating a minimal SDK project. Pick a service, operation, Region, and environment (Node.js, Browser, or React Native) – the tool handles the rest: correct client imports, credentials configuration, error handling, and a project that runs immediately. It works across Node.js, Browser (with Amazon Cognito), and React Native, covering the most common environments where developers use the AWS SDK for JavaScript v3.&lt;/p&gt; 
&lt;p&gt; Whether you’re getting started with a new AWS service, testing SDK behavior in isolation, or troubleshooting an issue, the tool gives you a clean project without the setup overhead. Less time on configuration, more time on the actual work.&lt;/p&gt; 
&lt;p&gt;For more on the AWS SDK for JavaScript v3, see our &lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/"&gt;Developer Guide&lt;/a&gt; and the &lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/"&gt;API Reference&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;If you’re working with browser credentials, the &lt;a href="https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html"&gt;Amazon Cognito identity pools documentation&lt;/a&gt; covers setup in detail.&lt;/p&gt; 
&lt;p&gt;Your feedback is greatly appreciated. You can engage with the AWS SDK for JavaScript team directly by opening a discussion or issue on our &lt;a href="https://github.com/awslabs/create-aws-sdk-repro" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt; 
&lt;hr style="width: 80%"&gt; 
&lt;h2&gt;About the authors&lt;/h2&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Smithy Java client framework is now generally available</title>
		<link>https://aws.amazon.com/blogs/developer/smithy-java-client-framework-is-now-generally-available/</link>
					
		
		<dc:creator><![CDATA[Manuel Sugawara]]></dc:creator>
		<pubDate>Mon, 06 Apr 2026 17:41:04 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[smithy]]></category>
		<guid isPermaLink="false">e3088a36806335b9ee66f405fb7d47ecdfe10dbc</guid>

					<description>Smithy Java client code generation is now generally available. You can use it to build type-safe, protocol-agnostic Java clients directly from Smithy models. With Smithy Java, serialization, protocol handling, and request/response lifecycles are all generated automatically from your model. This removes the need to write or maintain any of this code by hand. In this […]</description>
										<content:encoded>&lt;p&gt;&lt;a href="https://github.com/smithy-lang/smithy-java" target="_blank" rel="noopener"&gt;Smithy Java&lt;/a&gt; client code generation is now generally available. You can use it to build type-safe, protocol-agnostic Java clients directly from Smithy models. With Smithy Java, serialization, protocol handling, and request/response lifecycles are all generated automatically from your model. This removes the need to write or maintain any of this code by hand.&lt;/p&gt; 
&lt;p&gt;In this post, you will learn what Smithy Java client generation is, how it works, what makes it different, and how you can use it. Modern service development is built on strong contracts and automation. &lt;a href="https://smithy.io/" target="_blank" rel="noopener"&gt;Smithy&lt;/a&gt; provides a model-driven approach to defining services and generating code from those definitions. It produces clients, services, and documentation from a single source of truth that stays aligned with your API as it evolves. Smithy Java client code generation enforces protocol correctness and removes serialization boilerplate, so you can focus on building features instead of hand-writing requests and responses.&lt;/p&gt; 
&lt;h2&gt;How it works&lt;/h2&gt; 
&lt;p&gt;At a high level, Smithy Java client code generation transforms Smithy models into strongly typed Java clients.&lt;/p&gt; 
&lt;h3&gt;Model-driven development&lt;/h3&gt; 
&lt;p&gt;At the core of the workflow is modeling services using Smithy. You define services, operations, and data shapes in a declarative format that captures API structure, constraints, and protocol bindings. These models act as the canonical definition of the API surface. For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-smithy"&gt;namespace com.example

use aws.api#service
use smithy.protocols#rpcv2Cbor

@title("Coffee Shop Service")
@rpcv2Cbor
@service(sdkId: "CoffeeShop")
service CoffeeShop {
&amp;nbsp;&amp;nbsp;&amp;nbsp; version: "2024-08-23"
&amp;nbsp;&amp;nbsp;&amp;nbsp; operations: [
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMenu
&amp;nbsp;&amp;nbsp;&amp;nbsp; ]
}

@readonly
operation GetMenu {
&amp;nbsp;&amp;nbsp;&amp;nbsp; output := {
        items: CoffeeItems
    }
} 
...
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Smithy Java consumes the models and produces Java client code. The generated output includes typed operations, serializers, deserializers, and protocol handling.&lt;/p&gt; 
&lt;p&gt;For more information about writing Smithy models, see &lt;a href="https://smithy.io/2.0/quickstart.html" target="_blank" rel="noopener"&gt;Smithy’s quick start documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Generated clients&lt;/h3&gt; 
&lt;p&gt;The generated clients support a range of features that are typical for client-service communication, including request/response handling, serialization, protocol negotiation, retries, error mapping, and custom interceptors. You only need to define them in the model, and Smithy Java writes the code for you.&lt;/p&gt; 
&lt;p&gt;The following is an example of a generated Java client:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-java"&gt;var client = CoffeeShopClient.builder()
&amp;nbsp;&amp;nbsp;&amp;nbsp; .endpointProvider(EndpointResolver.staticEndpoint("http://localhost:8888"))
&amp;nbsp;&amp;nbsp;&amp;nbsp; .build();

var menu = client.getMenu();&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can regenerate clients after API changes to the model, keeping them up to date without writing any manual code.&lt;/p&gt; 
&lt;p&gt;For more information about how to start generating Java clients from Smithy models, see our &lt;a href="https://smithy.io/2.0/languages/java/quickstart.html" target="_blank" rel="noopener"&gt;quick start guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Key capabilities&lt;/h2&gt; 
&lt;h3&gt;Protocol flexibility&lt;/h3&gt; 
&lt;p&gt;Smithy Java generated clients are protocol-agnostic. The framework includes built-in support for HTTP transport, AWS protocols (including &lt;a href="https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html" target="_blank" rel="noopener"&gt;AWS JSON 1.0&lt;/a&gt;/&lt;a href="https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html" target="_blank" rel="noopener"&gt;1.1&lt;/a&gt;, &lt;a href="https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html" target="_blank" rel="noopener"&gt;restJson1&lt;/a&gt;, &lt;a href="https://smithy.io/2.0/aws/protocols/aws-restxml-protocol.html" target="_blank" rel="noopener"&gt;restXml&lt;/a&gt; and &lt;a href="https://smithy.io/2.0/aws/protocols/aws-query-protocol.html" target="_blank" rel="noopener"&gt;Query&lt;/a&gt;), and &lt;a href="https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html" target="_blank" rel="noopener"&gt;Smithy RPCv2 CBOR&lt;/a&gt;. You can swap protocols at runtime without rebuilding the client, enabling gradual protocol migrations and multi-protocol support with no code changes.&lt;/p&gt; 
&lt;h3&gt;Dynamic client&lt;/h3&gt; 
&lt;p&gt;Not every use case requires code generation at build time. Smithy Java includes a dynamic client that loads Smithy models at runtime and can interact with any service API without a codegen step. This is particularly useful for building tools, service aggregators, or systems that must interact with unknown services at build time, all while keeping the deployment footprint small.&lt;/p&gt; 
&lt;p&gt;The following is an example of calling the Coffee Shop service using the DynamicClient :&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-java"&gt;var model = Model.assembler().addImport("model.smithy").assemble().unwrap();
var serviceId = ShapeId.from("com.example#CoffeeShop");
var client = DynamicClient.builder().model(model).serviceId(serviceId).build();
var result = client.call("GetMenu");&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Shape code generation independent of services&lt;/h3&gt; 
&lt;p&gt;Smithy Java can generate type-safe Java classes from Smithy shapes without any service context. This extends Smithy’s model-first approach beyond service calls into the data and logic layers of your system, enabling code reuse and consistency across projects that share common types.&lt;/p&gt; 
&lt;h3&gt;Built on Java virtual threads&lt;/h3&gt; 
&lt;p&gt;Smithy Java is built from the ground up around &lt;a href="https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html" target="_blank" rel="noopener"&gt;Java 21’s virtual threads&lt;/a&gt;. Instead of exposing complex async APIs with callbacks or reactive streams, it provides a blocking-style interface that is straightforward to read, write, and debug, without sacrificing performance. Users can concentrate on their business logic while letting Smithy Java and the JVM handle task scheduling, synchronization, and structured error handling.&lt;/p&gt; 
&lt;p&gt;The following example demonstrates using &lt;a href="https://aws.amazon.com/transcribe/" target="_blank" rel="noopener"&gt;Amazon Transcribe&lt;/a&gt; with Smithy’s Java event streams blocking API. To send an event, Smithy clients use a &lt;code&gt;EventStreamWriter&amp;lt;T&amp;gt;&lt;/code&gt; with a &lt;code&gt;write(T event)&lt;/code&gt; method, and to receive an event the client uses &lt;code&gt;EventStreamReader&lt;/code&gt; with a &lt;code&gt;T read()&lt;/code&gt; method. For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-java"&gt;// Create an Amazon Transcribe client
var client = TranscribeClient.builder().build();
var audioStream = EventStream.&amp;lt;AudioStream&amp;gt;newWriter();

// Create a stream transcription request
var request = StartStreamTranscriptionInput.builder().audioStream(audioStream).build();

// Create a VT to send the audio that we want to transcribe
Thread.startVirtualThread(() -&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; try (var audioStreamWriter = audioStream.asWriter()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var chunk : iterableAudioChunks()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var event = AudioEvent.builder().audioChunk(chunk).build()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; audioStreamWriter.write(AudioStream.builder().audioEvent(event).build());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
});

// Send the request to Amazon Transcribe
var response = client.startStreamTranscription(request);

// Create a VT to read the transcription from the audio.
Thread.startVirtualThread(() -&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; // The reader
&amp;nbsp;&amp;nbsp;&amp;nbsp; try (var results = response.getTranscriptResultStream().asReader()) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The reader implements Iterable
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var event : results) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (event) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case TranscriptResultStream.TranscriptEventMember transcript -&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var transcriptText = getTranscript(transcript);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (transcriptText != null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; appendAudioTranscript(transcriptText);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default -&amp;gt; throw new IllegalStateException("Unexpected event " + event);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
});&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;In this post, I explained what Smithy Java client generation is and how it works. With this general availability release, Smithy Java’s public APIs are now stable; we commit to backwards compatibility, making it ready for use in production systems. To get started with Smithy Java client code generation, use our &lt;a href="https://smithy.io/2.0/languages/java/quickstart.html" target="_blank" rel="noopener"&gt;quick start guide&lt;/a&gt; and &lt;a href="https://smithy.io/2.0/languages/java/index.html" target="_blank" rel="noopener"&gt;documentation&lt;/a&gt;. If you want to send us feedback, ask a question, or discuss, you can reach us through &lt;a href="https://github.com/smithy-lang/smithy-java/issues" target="_blank" rel="noopener"&gt;GitHub issues&lt;/a&gt; and &lt;a href="https://github.com/smithy-lang/smithy-java/discussions" target="_blank" rel="noopener"&gt;GitHub discussions&lt;/a&gt;.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h2&gt;About the author&lt;/h2&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Smithy Kotlin client code generation now generally available</title>
		<link>https://aws.amazon.com/blogs/developer/smithy-kotlin-client-code-generation-now-generally-available/</link>
					
		
		<dc:creator><![CDATA[Omar Perez]]></dc:creator>
		<pubDate>Thu, 02 Apr 2026 15:24:42 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[smithy]]></category>
		<guid isPermaLink="false">ed10045367cdd2883286784b20e72a07634d9aa8</guid>

					<description>Smithy Kotlin&amp;nbsp;client code generation is now generally available. With Smithy Kotlin, you can keep client libraries in sync with evolving service APIs. By using client code generation, you can reduce repetitive work and instead, automatically create type-safe Kotlin clients from your service models. In this post, you will learn what Smithy Kotlin client generation is, how it works, and how you can use it.</description>
										<content:encoded>&lt;p&gt;&lt;a href="https://github.com/smithy-lang/smithy-kotlin" target="_blank" rel="noopener noreferrer"&gt;Smithy Kotlin&lt;/a&gt;&amp;nbsp;client code generation is now generally available. With Smithy Kotlin, you can keep client libraries in sync with evolving service APIs. By using client code generation, you can reduce repetitive work and instead, automatically create type-safe Kotlin clients from your service models. In this post, you will learn what Smithy Kotlin client generation is, how it works, and how you can use it.&lt;/p&gt; 
&lt;p&gt;Modern service development increasingly relies on strong contracts, automation, and consistency. &lt;a href="https://smithy.io/" target="_blank" rel="noopener noreferrer"&gt;Smithy&lt;/a&gt;&amp;nbsp;provides a model-driven approach to defining services and enables code generation from those definitions, helping you to produce reliable clients from a single source of truth.&lt;/p&gt; 
&lt;h2&gt;How it works&lt;/h2&gt; 
&lt;p&gt;At a high level, Smithy Kotlin client code generation transforms Smithy service models into strongly typed Kotlin clients. This process bridges the gap between API design and implementation, producing code that handles serialization, protocol details, and request/response lifecycles automatically.&lt;/p&gt; 
&lt;h3&gt;Model-driven development&lt;/h3&gt; 
&lt;p&gt;At the core of the workflow is modeling services using Smithy. You can define services, operations, and data shapes in a declarative format that captures structure, constraints, and protocol bindings. These models specify the canonical definition of the API surface. For example:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-php"&gt;namespace com.example

use aws.api#service
use smithy.protocols#rpcv2Cbor

@title("Coffee Shop Service")
@rpcv2Cbor
@service(sdkId: "CoffeeShop")
service CoffeeShop {
&amp;nbsp;&amp;nbsp; &amp;nbsp;version: "2024-08-23"
&amp;nbsp;&amp;nbsp; &amp;nbsp;operations: [
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GetMenu
&amp;nbsp;&amp;nbsp; &amp;nbsp;]
}

@http(method: "GET", uri: "/menu")
@readonly
operation GetMenu {
&amp;nbsp;&amp;nbsp; &amp;nbsp;output := {
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;items: CoffeeItems
&amp;nbsp;&amp;nbsp; &amp;nbsp;}
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;Smithy Kotlin consumes the models and produces Kotlin client code. The generated output includes typed operations, serializers, and deserializers, maintaining alignment between the model and client implementation.&lt;/p&gt; 
&lt;p&gt;For more information about writing Smithy models, see &lt;a href="https://smithy.io/2.0/quickstart.html" target="_blank" rel="noopener noreferrer"&gt;Smithy’s quick start documentation&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Clients&lt;/h3&gt; 
&lt;p&gt;The generated clients support a range of features typical for service communication, including request/response handling, serialization, protocols, and error mapping. You only need to define them in the model and Smithy Kotlin writes the code for you. Because Smithy Kotlin targets Kotlin and generated clients run on the Java Virtual Machine (JVM), they integrate naturally with existing language tools. You can incorporate them into modern build systems, use concurrency features, and combine them with established libraries and frameworks already used in Kotlin. An example of a generated Kotlin client:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-php"&gt;CoffeeShopClient {
 &amp;nbsp; &amp;nbsp;endpointProvider = CoffeeShopEndpointProvider {
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;endpointUrl = Url.parse("http://localhost:8888")
 &amp;nbsp; &amp;nbsp;}
}.use { client -&amp;gt;
&amp;nbsp; &amp;nbsp; val menu =&amp;nbsp;client.getMenu()
}&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;For more information about how to start generating Kotlin clients from Smithy models, see the&amp;nbsp;&lt;a href="https://smithy.io/2.0/languages/kotlin/client/generating-clients.html" target="_blank" rel="noopener noreferrer"&gt;client generation guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;What does general availability mean?&lt;/h2&gt; 
&lt;p&gt;Smithy Kotlin has been in development and available in developer preview for a few years. This milestone reflects production readiness, stability, and broader confidence in adopting the generated clients as part of standard development workflows.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;In this blog post, we covered what Smithy Kotlin client generation is, how it works, and how you can use it. To get started with Smithy Kotlin client code generation see the&amp;nbsp;&lt;a href="https://github.com/smithy-lang/smithy-examples/tree/main/smithy-kotlin-examples/quickstart-kotlin" target="_blank" rel="noopener noreferrer"&gt;quick start example&lt;/a&gt; and &lt;a href="https://smithy.io/2.0/languages/kotlin/index.html" target="_blank" rel="noopener noreferrer"&gt;documentation page&lt;/a&gt;. If you’d like to share feedback, ask a question, or discuss, you can reach us&lt;a href="https://github.com/smithy-lang/smithy-kotlin/issues" target="_blank" rel="noopener noreferrer"&gt;&amp;nbsp;through GitHub issues&lt;/a&gt;&amp;nbsp;and &lt;a href="https://github.com/smithy-lang/smithy-kotlin/discussions" target="_blank" rel="noopener noreferrer"&gt;GitHub discussions&lt;/a&gt;.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h2&gt;About the author&lt;/h2&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Upgrading AWS CLI From v1 to v2 Using the Migration Tool</title>
		<link>https://aws.amazon.com/blogs/developer/upgrading-aws-cli-from-v1-to-v2-using-the-migration-tool/</link>
					
		
		<dc:creator><![CDATA[Ahmed Moustafa]]></dc:creator>
		<pubDate>Fri, 27 Mar 2026 22:53:53 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS Command Line Interface]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Technical How-to]]></category>
		<guid isPermaLink="false">d6b77276aae18d8b3f6d5f96afe597563841bdbb</guid>

					<description>Upgrading from AWS Command Line Interface (AWS CLI) v1 to AWS CLI v2 brings valuable improvements, but requires attention to several changes that may affect your existing workflows, such as failing commands, or misconfiguration. The AWS CLI v1-to-v2 Migration Tool helps you identify and resolve issues before upgrading, making transition easier. It analyzes bash scripts […]</description>
										<content:encoded>&lt;p&gt;Upgrading from &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-welcome.html" target="_blank" rel="noopener"&gt;AWS Command Line Interface (AWS CLI) v1 &lt;/a&gt;to &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" target="_blank" rel="noopener"&gt;AWS CLI v2&lt;/a&gt; brings valuable improvements, but requires attention to several changes that may affect your existing workflows, such as failing commands, or misconfiguration.&lt;/p&gt; 
&lt;p&gt;The AWS CLI v1-to-v2 Migration Tool helps you identify and resolve issues before upgrading, making transition easier. It analyzes bash scripts containing AWS CLI v1 commands where behavior differs in AWS CLI v2. The tool will either suggest a change to a command or guide you to resolve a potential risk. It can also automatically create an updated version of the script with implemented changes. Where applicable, the migration tool will change the commands in a way that preserves AWS CLI version 1 behavior.&lt;/p&gt; 
&lt;p&gt;The AWS CLI v1-to-v2 Migration Tool is a standalone tool compatible with &lt;i&gt;any&lt;/i&gt;&amp;nbsp;version of AWS CLI v1, and does not require executing AWS CLI commands.&amp;nbsp;Compared to Upgrade Debug Mode, an alternative solution built into AWS CLI version &lt;code&gt;1.44.0&lt;/code&gt; or later, the Migration Tool offers broader compatibility and works independently of your CLI installation. For a thorough comparison between the Upgrade Debug Mode and the AWS CLI v1-to-v2 Migration Tool see &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html#cliv2-migration-choosing-migration-tool" target="_blank" rel="noopener"&gt;Choosing Between Upgrade Debug Mode and AWS CLI v1-to-v2 Migration Tool&lt;/a&gt;&lt;b&gt; &lt;/b&gt;in our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;Migration guide for the AWS CLI version 2&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;In this post, we’ll walk you through using&amp;nbsp;AWS CLI v1-to-v2 Migration Tool to identify potential breaking changes, resolve compatibility issues, and safely transition your scripts to v2.&lt;/p&gt; 
&lt;h2&gt;Prerequisites&lt;/h2&gt; 
&lt;p&gt;Before you begin, you’ll need Python version 3.9 or later, and pip installed on your machine. See the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html#migration-tool-prerequisites" target="_blank" rel="noopener"&gt;Prerequisites&lt;/a&gt; in &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html" target="_blank" rel="noopener"&gt;Using AWS CLI v1-to-v2 Migration Tool to upgrade AWS CLI version 1 to AWS CLI version 2&lt;/a&gt;&amp;nbsp;for instructions to install these prerequisites.&lt;/p&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;p&gt;You’ll start by installing the AWS CLI v1-to-v2 Migration Tool. Then, you’ll use this tool to analyze bash scripts for AWS CLI v1 commands that may need to be updated before upgrading to AWS CLI v2.&amp;nbsp;Then, you’ll review the&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;AWS CLI v2 breaking changes list&lt;/a&gt;&amp;nbsp;in the&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;Migration guide for the AWS CLI version 2&lt;/a&gt;&amp;nbsp;to manually verify whether your workflows may be broken by upgrading, and safely upgrade to AWS CLI v2.&lt;/p&gt; 
&lt;h3&gt;Step 1: Install the&amp;nbsp;AWS CLI v1-to-v2 Migration Tool&lt;/h3&gt; 
&lt;p&gt;See &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html#migration-tool-installation" target="_blank" rel="noopener"&gt;Installation&lt;/a&gt; in &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html" target="_blank" rel="noopener"&gt;Using AWS CLI v1-to-v2 Migration Tool to upgrade AWS CLI version 1 to AWS CLI version 2&lt;/a&gt; for instructions to install the AWS CLI v1-to-v2 Migration Tool.&lt;/p&gt; 
&lt;h3&gt;Step 2: Lint a bash script using interactive mode&lt;/h3&gt; 
&lt;p&gt;Next, you’ll run the migration tool in interactive mode. Interactive mode walks you through each flagged command one at a time. For each detection, it will suggest a change to make the command have the same behavior in AWS CLI v2.&lt;/p&gt; 
&lt;p&gt;For this blog post, we’ll use&amp;nbsp;the following example bash script, which uses AWS CLI v1 to upload an AWS CloudFormation template to Amazon Simple Storage Service (Amazon S3), copy the template to a backup Amazon S3 bucket, and create a CloudFormation stack from the template.&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;#!/bin/bash
set -e

TEMPLATE="$1"
BUCKET="$2"
BACKUP="$3"
STACK_NAME="$4"

if [ -z "$TEMPLATE" ] || [ -z "$BUCKET" ] || [ -z "$BACKUP" ] || [ -z "$STACK_NAME" ]; then
&amp;nbsp;&amp;nbsp; &amp;nbsp;echo "Usage: $0&amp;nbsp;&amp;lt;template-file&amp;gt; &amp;lt;bucket&amp;gt; &amp;lt;backup-bucket&amp;gt; &amp;lt;stack-name&amp;gt;"
&amp;nbsp;&amp;nbsp; &amp;nbsp;exit 1
fi

TMPKEY="cloudformation/$(basename "$TEMPLATE")"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_KEY="cloudformation/$TIMESTAMP-$(basename "$TEMPLATE")"

# Upload template
aws s3 cp $TEMPLATE s3://$BUCKET/$TMPKEY

# Copy template to backup bucket
aws s3 cp s3://$BUCKET/$TMPKEY&amp;nbsp;s3://$BACKUP/$BACKUP_KEY

# Create a stack from the template
aws cloudformation create-stack \
&amp;nbsp;&amp;nbsp;--stack-name "$STACK_NAME"&amp;nbsp;\
&amp;nbsp;&amp;nbsp;--template-body "https://s3.amazonaws.com/$BUCKET/$TMPKEY"

echo "Stack creation initiated. Stack ID: $(
&amp;nbsp;&amp;nbsp;aws cloudformation describe-stacks \
&amp;nbsp;&amp;nbsp; &amp;nbsp;--stack-name "$STACK_NAME" \
&amp;nbsp;&amp;nbsp; &amp;nbsp;--query 'Stacks[0].StackId' \
&amp;nbsp;&amp;nbsp; &amp;nbsp;--output text \
&amp;nbsp; &amp;nbsp; --cli-input-json file://describe_stacks_input.json
)"&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;You will use the command below to use the migration tool to analyze the bash script &lt;code&gt;upload_s3_files.sh&lt;/code&gt;, suggest fixes, and write the modified script to the path &lt;code&gt;upload_s3_files_v2.sh&lt;/code&gt; in interactive mode. For the sake of demonstration, this blog post does not include every finding that gets detected in the example script:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;$ migrate-aws-cli --script upload_s3_files.sh&amp;nbsp;--output upload_s3_files_v2.sh \
&amp;nbsp;&amp;nbsp;--interactive
&amp;nbsp;&amp;nbsp;
19 19│ aws s3 cp $TEMPLATE s3://$BUCKET/$TMPKEY
20 20│ 
21 21│ # Copy template to backup bucket
22 &amp;nbsp; │-aws s3 cp s3://$BUCKET/$TMPKEY s3://$BACKUP/$BACKUP_KEY
&amp;nbsp;&amp;nbsp; 22│+aws s3 cp s3://$BUCKET/$TMPKEY s3://$BACKUP/$BACKUP_KEY --copy-props none
23 23│ 
24 24│ # Create a stack from the template
25 25│ aws cloudformation create-stack \

script.sh:22 [s3-copy] In AWS CLI v2, object properties will be copied from the 
source in multipart copies between S3 buckets. If a copy is or becomes multipart 
after upgrading to AWS CLI v2, extra API calls will be made. See 
&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-s3-copy-metadata." rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-s3-copy-metadata.&lt;/a&gt;

Apply this fix? [y] yes, [n] no, [a] accept all of type, [r] reject all of type, 
[u] update all, [s] save and exit, [q] quit:&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;In the preceding finding, the associated breaking change is &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-s3-copy-metadata" target="_blank" rel="noopener"&gt;Improved Amazon S3 handling of file properties and tags for multipart copies&lt;/a&gt;. The suggested fix, given in a form similar to a Git diff, is to add the &lt;code&gt;--copy-props none&lt;/code&gt;&amp;nbsp;flag to the command. Adding the suggested flag will preserve AWS CLI v1 behavior in AWS CLI v2.&lt;/p&gt; 
&lt;p&gt;The following output snippet shows another finding:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;16 16│ BACKUP_KEY="cloudformation/$TIMESTAMP-$(basename "$TEMPLATE")"
17 17│ 
18 18│ # Upload template
19 &amp;nbsp; │-aws s3 cp $TEMPLATE s3://$BUCKET/$TMPKEY
&amp;nbsp;&amp;nbsp; 19│+aws s3 cp $TEMPLATE s3://$BUCKET/$TMPKEY&amp;nbsp;--cli-binary-format raw-in-base64-out
20 20│ 
21 21│ # Copy template to backup bucket
22 22│ aws s3 cp "s3://$BUCKET/$TMPKEY" "s3://$BACKUP/$BACKUP_KEY"

examples/upload_s3_files.sh:19 [binary-params-base64] In AWS CLI v2, an input 
parameter typed as binary large object (BLOB) expects the input to be base64-encoded. 
If using a BLOB-type input parameter, retain v1 behavior after upgrading to AWS CLI 
v2&amp;nbsp;by adding `--cli-binary-format raw-in-base64-out`. See 
&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam." rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam.&lt;/a&gt;

Apply this fix? [y] yes, [n] no, [a] accept all of type, [r] reject all of type, 
[u] update all, [s] save and exit, [q] quit:&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;In the preceding detection, the associated breaking change is that&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam" target="_blank" rel="noopener"&gt;Binary parameters are passed as base64-encoded strings by default&lt;/a&gt;. The suggested fix, is to add the &lt;code&gt;--cli-binary-format raw-in-base64-out&lt;/code&gt;&amp;nbsp;flag to the command. Adding the suggested flag will preserve AWS CLI v1 behavior in AWS CLI v2.&lt;/p&gt; 
&lt;p&gt;Note that in this particular case, we are not using a binary-type parameter in the &lt;code&gt;aws s3 cp&lt;/code&gt;&amp;nbsp;command.&amp;nbsp;This highlights a core behavior of the migration tool: by design, it errs on the side of caution when detecting potential issues, flagging changes that might be breaking even when uncertain, provided the suggested fix won’t alter the code’s behavior.&lt;/p&gt; 
&lt;p&gt;The following output snippet shows another finding:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;27 27│ &amp;nbsp;--template-body "https://s3.amazonaws.com/$BUCKET/$TEMPLATE_KEY" --cli-binary-format raw-in-base64-out --no-cli-pager
28 28│
29 29│echo "Stack creation initiated. Stack ID: $(
30 30│ &amp;nbsp;aws cloudformation describe-stacks \
31 31│ &amp;nbsp; &amp;nbsp;--stack-name "$STACK_NAME" \
32 32│ &amp;nbsp; &amp;nbsp;--query 'Stacks[0].StackId' \
33 33│ &amp;nbsp; &amp;nbsp;--output text \
34 34│ &amp;nbsp; &amp;nbsp;--cli-input-json file://describe_stacks_input.json --cli-binary-format raw-in-base64-out --no-cli-pager
35 35│)"

examples/upload_s3_files.sh:30 [MANUAL REVIEW REQUIRED] [cli-input-json] In AWS CLI 
v2, specifying pagination parameters via `--cli-input-json` turns off automatic 
pagination. If pagination-related parameters are present in the input JSON specified 
with `--cli-input-json`, remove the pagination parameters from the input JSON to 
retain v1 behavior. See 
&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-skeleton-paging." rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-skeleton-paging.&lt;/a&gt;

[n] next, [s] save, [q] quit:&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;In the preceding detection, the detected breaking change is&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-skeleton-paging" target="_blank" rel="noopener"&gt;AWS CLI version 2 is more consistent with paging parameters&lt;/a&gt;.&amp;nbsp;The migration tool cannot automatically modify the script in this case, so the detection is flagged with&amp;nbsp;&lt;code&gt;[MANUAL REVIEW REQUIRED]&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;For detections that require manual fixes, such as the example, you’ll enter &lt;code&gt;n&lt;/code&gt; and manually address the finding after the migration tool finishes executing.&lt;/p&gt; 
&lt;p&gt;After all detections are displayed, a summary is printed, including the number of issues found and the path to the modified script:&lt;/p&gt; 
&lt;div class="hide-language"&gt; 
 &lt;pre&gt;&lt;code class="lang-bash"&gt;Found 10 issue(s). 9 fixed. 1 require(s) manual review.
Changes written to: upload_s3_files_v2.sh&lt;/code&gt;&lt;/pre&gt; 
&lt;/div&gt; 
&lt;p&gt;To resolve the detections that were flagged for manual review, follow the guidance in the suggested actions.&lt;/p&gt; 
&lt;h3&gt;Step 3: Upgrade to AWS CLI v2&lt;/h3&gt; 
&lt;p&gt;Customers are responsible for safely migrating their scripts; using the migration tool does not guarantee that all commands will have the same behavior in AWS CLI v2.&amp;nbsp;To complete a manual review, reference the&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;breaking changes list&lt;/a&gt;&amp;nbsp;in the&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;AWS CLI v2 Migration Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;After going through and applying any required changes identified in the previous steps, you are now ready to upgrade to AWS CLI v2 following the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" target="_blank" rel="noopener"&gt;installation guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h3&gt;Step 4: Uninstall migration tool if no longer needed&lt;/h3&gt; 
&lt;p&gt;After migration, you can uninstall the migration tool and remove original scripts if no longer needed.&lt;/p&gt; 
&lt;h2&gt;Important Considerations&lt;/h2&gt; 
&lt;p&gt;The AWS CLI v1-to-v2 Migration Tool uses static analysis to identify most compatibility considerations in your scripts. However, some scenarios—such as parameters stored in variables or determined at runtime—fall outside the tool’s detection scope and require manual review.&lt;/p&gt; 
&lt;p&gt;For more details on the limitations of the AWS CLI v1-to-v2 Migration Tool, see&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html#migration-tool-limitations" target="_blank" rel="noopener"&gt;Limitations&lt;/a&gt; in &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html" target="_blank" rel="noopener"&gt;Using AWS CLI v1-to-v2 Migration Tool to upgrade AWS CLI version 1 to AWS CLI version 2&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;We strongly recommend customers understand our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;breaking changes list&lt;/a&gt; published in our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;AWS CLI v2 Migration Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;In this blog post, we showed you how to get started with the new AWS CLI v1-to-v2 Migration Tool to assist your upgrade from AWS CLI v1 to AWS CLI v2. To learn more, visit &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-migration-tool.html" target="_blank" rel="noopener"&gt;Using AWS CLI v1-to-v2 Migration Tool to upgrade AWS CLI version 1 to AWS CLI version 2&lt;/a&gt;. We would love your feedback!&amp;nbsp;You can also open a discussion or issue on &lt;a href="https://github.com/aws/aws-cli/issues/new?template=migration-tool.yml" target="_blank" rel="noopener"&gt;GitHub&lt;/a&gt;. Thank you for using the AWS CLI!&lt;/p&gt; 
&lt;p&gt;Have you encountered challenges migrating from AWS CLI v1 to AWS CLI v2? Share your experience in the comments below.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Transfer Manager Directory Support for AWS SDK for Ruby</title>
		<link>https://aws.amazon.com/blogs/developer/transfer-manager-directory-support-for-aws-sdk-for-ruby/</link>
					
		
		<dc:creator><![CDATA[Juli Tera]]></dc:creator>
		<pubDate>Thu, 19 Mar 2026 14:39:01 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for Ruby]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[Programing Language]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[aws-sdk-ruby]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[S3]]></category>
		<guid isPermaLink="false">3104e1d9e1abaf185fccd247465d4f339610df22</guid>

					<description>In this post, we show you how to upload and download directories using Transfer Manager, customize transfer with filtering options and handle results effectively.</description>
										<content:encoded>&lt;p&gt;Managing bulk file transfer to &lt;a href="https://aws.amazon.com/s3/" target="_blank" rel="noopener noreferrer"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt; can be complex when transferring directories containing multiple files and subdirectories. &lt;a href="https://aws.amazon.com/sdk-for-ruby/" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for Ruby&lt;/a&gt; Transfer Manager (&lt;code&gt;aws-sdk-s3&lt;/code&gt; version 1.215) now supports directory upload and download. This feature can help streamline bulk transfers by providing multipart handling and parallelism options.&lt;/p&gt; 
&lt;p&gt;Previously, uploading directories to Amazon S3 required manual iteration and handling. You also had to manage multipart uploads for large files and implement parallelism for performance. With directory support in Transfer Manager, you can handle this with a single method call that automates the process. In this post, we show you how to upload and download directories using Transfer Manager, customize transfer with filtering options and handle results effectively.&lt;/p&gt; 
&lt;h2&gt;Getting started&lt;/h2&gt; 
&lt;p&gt;This support requires &lt;code&gt;aws-sdk-s3&lt;/code&gt; version&amp;nbsp;1.215 or higher. Add &lt;code&gt;aws-sdk-s3&lt;/code&gt;&amp;nbsp;to your Gemfile:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;gem 'aws-sdk-s3', '&amp;gt;= 1.215'&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Initialize the Transfer Manager&lt;/h3&gt; 
&lt;p&gt;To initialize a Transfer Manager with a default S3 client:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;require 'aws-sdk-s3' 
tm = Aws::S3::TransferManager.new&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Or you could create a custom S3 client to pass to the Transfer Manager.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;client = Aws::S3::Client.new(region: 'us-east-1')
tm = Aws::S3::TransferManager.new(client: client)&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Upload a directory&lt;/h3&gt; 
&lt;p&gt;Upload a local directory to an S3 bucket by providing a source path and bucket name:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;tm.upload_directory('/path/to/directory', bucket: 'my-bucket')&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;By default, only files in the specified directory are uploaded. To include subdirectories, set&amp;nbsp;&lt;code&gt;recursive: true&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;tm.upload_directory('/path/to/directory', bucket: 'my-bucket', recursive: true)&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Download a directory&lt;/h3&gt; 
&lt;p&gt;Download objects from an S3 bucket to a local directory by providing a destination path and bucket name:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;tm.download_directory('/local/path', bucket: 'my-bucket')&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To download only objects with a specific prefix, set &lt;code&gt;s3_prefix&lt;/code&gt;. The full object key is preserved in the local path. For example, given &lt;code&gt;s3_prefix: 'photos/'&lt;/code&gt;:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Object key: &lt;code&gt;photos/vacation/beach.jpg&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Resolved local path: &lt;code&gt;/local/path/photos/vacation/beach.jpg&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;tm.download_directory('/local/path', bucket: 'my-bucket', s3_prefix: 'photos/2026/')&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Filtering contents&lt;/h3&gt; 
&lt;p&gt;You can also filter transfers by using &lt;code&gt;filter_callback&lt;/code&gt;:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;# Upload only .txt files 
filter = proc { |_path, name| name.end_with?('.txt') } 
tm.upload_directory('/path/to/directory', bucket: 'my-bucket', filter_callback: filter) 

# Download only .jpg files 
filter = proc { |obj| obj.key.end_with?('.jpg') } 
tm.download_directory('/local/path', bucket: 'my-bucket', filter_callback: filter)&lt;/code&gt;&lt;/pre&gt; 
&lt;h3&gt;Handling results&lt;/h3&gt; 
&lt;p&gt;On success, both operations return a hash containing completed and failed transfer details:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;result = tm.upload_directory('/path/to/directory', bucket: 'my-bucket') 
# =&amp;gt; { completed_uploads: 7, failed_uploads: 0 }&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;By default, an error raises an exception, which stops the transfer but does not clean up completed transfers. You can set &lt;code&gt;ignore_failure: true&lt;/code&gt;&amp;nbsp;to continue transferring remaining files and see what errors occurred in the results hash.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-ruby"&gt;result = tm.upload_directory(
  '/path/to/directory', 
  bucket: 'my-bucket', 
  ignore_failure: true
)
# =&amp;gt; { completed_uploads: 5, failed_uploads: 2, errors: [...] }&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;Directory upload and download support in the AWS SDK for Ruby Transfer Manager can help streamline bulk S3 transfers with built-in parallelism and multipart handling.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Key takeaways:&lt;/strong&gt;&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Use &lt;a href="https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/TransferManager.html#upload_directory-instance_method" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;upload_directory&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/TransferManager.html#download_directory-instance_method" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;download_directory&lt;/code&gt;&lt;/a&gt; for bulk transfers with a single method call&lt;/li&gt; 
 &lt;li&gt;Customize behavior with options like &lt;code&gt;recursive&lt;/code&gt;, &lt;code&gt;s3_prefix&lt;/code&gt;, and &lt;code&gt;filter_callback&lt;/code&gt;&lt;/li&gt; 
 &lt;li&gt;Handle errors gracefully with &lt;code&gt;ignore_failure&lt;/code&gt; and inspect results for details&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;These are only a few of the available options. See the &lt;a href="https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/TransferManager.html" target="_blank" rel="noopener noreferrer"&gt;API documentation&lt;/a&gt; for a full list.&lt;/p&gt; 
&lt;p&gt;&lt;strong&gt;Next steps:&lt;/strong&gt;&amp;nbsp;Try implementing directory transfers in your applications and explore other Transfer Manager features like &lt;a href="https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/TransferManager.html#upload_file-instance_method" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;upload_file&lt;/code&gt;&lt;/a&gt; and&amp;nbsp;&lt;a href="https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/TransferManager.html#download_file-instance_method" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;download_file&lt;/code&gt;&lt;/a&gt; for single-object transfers.&lt;/p&gt; 
&lt;p&gt;Share your questions, comments, and issues with us on &lt;a href="https://github.com/aws/aws-sdk-ruby" target="_blank" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt; 
&lt;hr&gt; 
&lt;h2&gt;About the author&lt;/h2&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Upgrade AWS CLI from v1 to v2 using upgrade debug mode</title>
		<link>https://aws.amazon.com/blogs/developer/upgrade-aws-cli-from-v1-to-v2-using-upgrade-debug-mode/</link>
					
		
		<dc:creator><![CDATA[Ahmed Moustafa]]></dc:creator>
		<pubDate>Tue, 10 Mar 2026 15:00:04 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS CLI]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<guid isPermaLink="false">7cf8b669e184d3d596423c097dd22d90e68427ef</guid>

					<description>Upgrading from 
&lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-welcome.html"&gt;AWS Command Line Interface (AWS CLI) v1&lt;/a&gt; to 
&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"&gt;AWS CLI v2&lt;/a&gt; can be challenging and time-consuming due to changes introduced in AWS CLI v2 that can potentially break your existing workflows. If you don’t properly address breaking changes in your scripts or workflows, then executing these workflows after upgrading to AWS CLI v2 may result in unintended consequences, such as failing commands or misconfiguring resources in your AWS account.</description>
										<content:encoded>&lt;p&gt;Upgrading from &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-welcome.html" target="_blank" rel="noopener"&gt;AWS Command Line Interface (AWS CLI) v1&lt;/a&gt; to &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" target="_blank" rel="noopener"&gt;AWS CLI v2&lt;/a&gt; can be challenging and time-consuming due to changes introduced in AWS CLI v2 that can potentially break your existing workflows. If you don’t properly address breaking changes in your scripts or workflows, then executing these workflows after upgrading to AWS CLI v2 may result in unintended consequences, such as failing commands or misconfiguring resources in your AWS account.&lt;/p&gt; 
&lt;p&gt;AWS CLI v1’s upgrade debug mode helps you identify and resolve these issues before upgrading, for a safer and seamless transition. This mode detects usage of features in AWS CLI v1 that have been updated with breaking changes in AWS CLI v2, and outputs a warning for each detection.&lt;/p&gt; 
&lt;p&gt;In this post, we’ll walk you through using AWS CLI v1’s upgrade debug mode to identify potential breaking changes, resolve compatibility issues, and safely transition your workflows to v2.&lt;/p&gt; 
&lt;h2&gt;Getting Started&lt;/h2&gt; 
&lt;p&gt;You’ll start by verifying you have the correct version of AWS CLI v1 to use upgrade debug mode, then you’ll use this mode to test commands in AWS CLI v1 for usage of features that were updated with breaking changes in AWS CLI v2. Then, you’ll review the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;AWS CLI v2 breaking changes list&lt;/a&gt; in the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;Migration guide for the AWS CLI version 2&lt;/a&gt; to manually verify whether your workflows may be broken by upgrading. Finally, you’ll follow guidance to mitigate breaking your workflows and safely upgrade to AWS CLI v2.&lt;/p&gt; 
&lt;h3&gt;AWS CLI v1&lt;/h3&gt; 
&lt;p&gt;The following steps walk you through using upgrade debug mode to identify potential breaking changes in your existing AWS CLI v1 usage, resolve compatibility issues, and safely transition to AWS CLI v2.&lt;/p&gt; 
&lt;h4&gt;Step 1: Verify you are using AWS CLI v1 version 1.44.0 or higher.&lt;/h4&gt; 
&lt;p&gt;We released the upgrade debug mode feature to the AWS CLI in version 1.44.0.&lt;/p&gt; 
&lt;p&gt;Using AWS CLI v1, run &lt;code&gt;aws --version&lt;/code&gt;, and verify that the AWS CLI version is 1.44.0 or higher.&lt;/p&gt; 
&lt;p&gt;If the version is older than 1.44.0, see our &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html" target="_blank" rel="noopener"&gt;Developer Guide&lt;/a&gt; for instructions to update to a later version.&lt;/p&gt; 
&lt;h4&gt;Step 2: Test your AWS CLI v1 usage with AWS CLI upgrade debug mode&lt;/h4&gt; 
&lt;p&gt;Set the &lt;code&gt;AWS_CLI_UPGRADE_DEBUG_MODE&lt;/code&gt; environment variable to &lt;code&gt;true&lt;/code&gt; to detect usage of features broken in AWS CLI v2. Alternatively, you can enable this functionality at the command-level using the &lt;code&gt;--v2-debug&lt;/code&gt; command line option. If you are upgrading the AWS CLI in existing scripts or workflows to use v2, we recommend testing each AWS CLI command used with this functionality enabled before upgrading them to use AWS CLI v2.&lt;/p&gt; 
&lt;p&gt;We recommend performing this step in the same environment that you will upgrade to use AWS CLI v2, since the execution environment determines whether commands will experience breaking changes.&lt;/p&gt; 
&lt;p&gt;For example, suppose you have a script that executes the AWS CLI command below:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;aws secretsmanager update-secret --secret-id SECRET-NAME \
  --secret-binary file://BINARY-SECRET.json
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Execute the command with the &lt;code&gt;AWS_CLI_UPGRADE_DEBUG_MODE&lt;/code&gt; set to true—or with the &lt;code&gt;--v2-debug&lt;/code&gt; flag—and check the output for the text “AWS CLI v2 UPGRADE WARNING”. Example output with the environment variable configured is shown below:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;$ aws secretsmanager update-secret --secret-id SECRET-NAME \
  --secret-binary file://BINARY-SECRET.json

AWS CLI v2 UPGRADE WARNING: When specifying a blob-type parameter, AWS CLI v2 will 
assume the parameter value is base64-encoded. This is different from v1 behavior, 
where the AWS CLI will automatically encode the value to base64. To retain v1 
behavior in AWS CLI v2, set the `cli_binary_format` configuration variable to 
`raw-in-base64-out`. See 
&lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam." rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam.&lt;/a&gt;

{
    "ARN": "ARN",
    "Name": "SECRET-NAME",
    "VersionId": "VERSION-ID"
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Step 3: Use the warnings to prepare for AWS CLI v2&lt;/h4&gt; 
&lt;p&gt;If breaking changes were detected in step 2, the warnings provide guidance for preparing for the AWS CLI v2 upgrade. Some breaking changes can be mitigated prior to upgrading to AWS CLI v2 by modifying the command or execution environment; the warnings identified in step 2 include links to our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;AWS CLI v2 breaking changes list&lt;/a&gt; that details options to mitigate the breakage.&lt;/p&gt; 
&lt;p&gt;In the previous example, the warning explains that AWS CLI v2 will assume that the contents of &lt;code&gt;BINARY-SECRET.json&lt;/code&gt; will be encoded in base64.&lt;/p&gt; 
&lt;p&gt;Following the instructions in the warning, you’ll configure the &lt;code&gt;cli_binary_format&lt;/code&gt; variable to &lt;code&gt;raw-in-base64-out&lt;/code&gt; in the &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html" target="_blank" rel="noopener"&gt;configuration file&lt;/a&gt;. Even though &lt;code&gt;cli_binary_format&lt;/code&gt; is not a valid configuration setting in AWS CLI v1, it prepares your environment for AWS CLI v2 by configuring AWS CLI v2 to retain the same behavior as AWS CLI v1.&lt;/p&gt; 
&lt;p&gt;You’ll configure &lt;code&gt;cli_binary_format&lt;/code&gt; according to the instructions using the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;aws configure set cli_binary_format raw-in-base64-out
&lt;/code&gt;&lt;/pre&gt; 
&lt;h4&gt;Step 4: Verify resolution of warnings&lt;/h4&gt; 
&lt;p&gt;For breaking changes mitigated in step 3, you’ll re-run the command to verify the warning is no longer printed.&lt;/p&gt; 
&lt;p&gt;Proceeding with the example, you configured the &lt;code&gt;cli_binary_format&lt;/code&gt; variable to &lt;code&gt;raw-in-base64-out&lt;/code&gt; in step 3. You’ll now re-run the command to verify the mitigation warning is resolved:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;aws secretsmanager update-secret --secret-id SECRET-NAME \
    --secret-binary file://BINARY-SECRET.json 
{
    "ARN": "ARN",
    "Name": "SECRET-NAME",
    "VersionId": "VERSION-ID"
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The warning is no longer printed, signaling that this command is now compatible with AWS CLI v2.&lt;/p&gt; 
&lt;p&gt;If you used the &lt;code&gt;--v2-debug&lt;/code&gt; argument instead of the &lt;code&gt;AWS_CLI_UPGRADE_DEBUG_MODE&lt;/code&gt; environment variable in step 2, remember to remove the flag from the command before upgrading to version 2.&lt;/p&gt; 
&lt;h4&gt;Step 5: Manually review for breaking changes&lt;/h4&gt; 
&lt;p&gt;After using upgrade debug mode to automatically detect usage of features that were updated with breaking changes, you will now manually review your AWS CLI usage by reviewing our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;breaking changes list&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;AWS CLI v2 Migration Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h4&gt;Step 6: Upgrade to AWS CLI v2&lt;/h4&gt; 
&lt;p&gt;After preparing for the breaking changes identified in the previous steps, you will now upgrade to AWS CLI v2 following the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html" target="_blank" rel="noopener"&gt;installation guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Limitations&lt;/h2&gt; 
&lt;p&gt;The upgrade debug mode feature does not currently support every breaking change introduced with AWS CLI v2, and has false positive cases where it issues a warning even if no breaking changes are actually present.&lt;/p&gt; 
&lt;p&gt;Additionally, some of the detection depends on API responses, as well as the execution environment running the AWS CLI. For this reason, we recommend running this feature against an AWS account and execution environment that reflect your production workflows as close as possible.&lt;/p&gt; 
&lt;p&gt;For more details on the limitations of upgrade debug mode, see &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-upgrade-debug-mode.html" target="_blank" rel="noopener"&gt;Using upgrade debug mode to upgrade AWS CLI version 1 to AWS CLI version 2&lt;/a&gt; in &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;Migration guide for the AWS CLI version 2&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;We strongly recommend customers understand our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html" target="_blank" rel="noopener"&gt;breaking changes list&lt;/a&gt; published in our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;AWS CLI v2 Migration Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The only breaking change not supported by the upgrade debug mode is that &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-return-codes" target="_blank" rel="noopener"&gt;AWS CLI version 2 provides more consistent return codes across commands&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;In this blog post, we showed you how to get started with the new upgrade debug mode. If you’re interested in using this feature to assist your upgrade from AWS CLI v1 to AWS CLI v2, try out upgrade debug mode. To learn more, visit &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-upgrade-debug-mode.html" target="_blank" rel="noopener"&gt;Using upgrade debug mode to upgrade AWS CLI version 1 to AWS CLI version 2&lt;/a&gt; in our &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html" target="_blank" rel="noopener"&gt;AWS CLI v2 Migration Guide&lt;/a&gt;. We would love your feedback! You can reach out to us by creating a &lt;a href="https://github.com/aws/aws-cli/issues/new/choose" target="_blank" rel="noopener"&gt;GitHub Issue&lt;/a&gt;.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>AWS SDK for .NET V3 Maintenance Mode Announcement</title>
		<link>https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/</link>
					
		
		<dc:creator><![CDATA[Muhammad Othman]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 19:35:48 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for .NET]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[.NET]]></category>
		<guid isPermaLink="false">5c2a8526dc1e5d73c7463cbd874d882ce5baf4e8</guid>

					<description>In alignment with our 
&lt;a href="https://aws.amazon.com/blogs/developer/general-availability-of-aws-sdk-for-net-v4-0/" target="_blank" rel="noopener noreferrer"&gt;V4.0 GA announcement&lt;/a&gt; and 
&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html" target="_blank" rel="noopener noreferrer"&gt;SDKs and Tools Maintenance Policy&lt;/a&gt;, version 3 of the 
&lt;a href="https://aws.amazon.com/sdk-for-net/" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for .NET&lt;/a&gt; will enter maintenance mode on March 1, 2026, and reach end-of-support on June 1, 2026. Starting March 1, 2026 we will stop adding regular updates to V3 and will only provide security updates until end-of-support begins.</description>
										<content:encoded>&lt;p&gt;In alignment with our &lt;a href="https://aws.amazon.com/blogs/developer/general-availability-of-aws-sdk-for-net-v4-0/" target="_blank" rel="noopener noreferrer"&gt;V4.0 GA announcement&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html" target="_blank" rel="noopener noreferrer"&gt;SDKs and Tools Maintenance Policy&lt;/a&gt;, version 3 of the &lt;a href="https://aws.amazon.com/sdk-for-net/" target="_blank" rel="noopener noreferrer"&gt;AWS SDK for .NET&lt;/a&gt; will enter maintenance mode on March 1, 2026, and reach end-of-support on June 1, 2026. Starting March 1, 2026 we will stop adding regular updates to V3 and will only provide security updates until end-of-support begins.&lt;/p&gt; 
&lt;h2&gt;Support Timeline&lt;/h2&gt; 
&lt;p&gt;When we announced the general availability of AWS SDK for .NET V4 on April 28, 2025, we committed to a support timeline tied to the &lt;a href="https://aws.amazon.com/powershell/" target="_blank" rel="noopener noreferrer"&gt;AWS Tools for PowerShell&lt;/a&gt;, which depends on the SDK. With AWS Tools for PowerShell V5 reaching &lt;a href="https://aws.amazon.com/blogs/developer/aws-tools-for-powershell-v5-now-generally-available/" target="_blank" rel="noopener noreferrer"&gt;general availability in August 2025&lt;/a&gt;, the 6-month support window for V3 began. For more details on the original support commitment, see the&amp;nbsp;&lt;a href="https://aws.amazon.com/blogs/developer/general-availability-of-aws-sdk-for-net-v4-0/" target="_blank" rel="noopener noreferrer"&gt;V4.0 GA announcement&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The following table outlines the level of support for each phase of the SDK lifecycle.&lt;/p&gt; 
&lt;table class="styled-table" border="1px" cellpadding="10px"&gt; 
 &lt;tbody&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;strong&gt;SDK Lifecycle Phase&lt;/strong&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;strong&gt;Start Date&lt;/strong&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;strong&gt;End Date&lt;/strong&gt;&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;&lt;strong&gt;Support Level&lt;/strong&gt;&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;General Availability&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;July&amp;nbsp;28,&amp;nbsp;2015&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;February 28, 2026&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;During this phase, the SDK is fully supported. AWS will provide regular SDK releases that include support for new services, API updates for existing services, as well as bug and security fixes.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;Maintenance Mode&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;March 1, 2026&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;May 31, 2026&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;During the maintenance mode, AWS will limit SDK releases to address critical bug fixes and security issues only. AWS SDK for .NET v3.x will not receive API updates for new or existing services or be updated to support new regions.&lt;/td&gt; 
  &lt;/tr&gt; 
  &lt;tr&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;End-of-Support&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;June 1, 2026&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;N/A&lt;/td&gt; 
   &lt;td style="padding: 10px;border: 1px solid #dddddd"&gt;AWS SDK for .NET v3.x will no longer receive updates or releases. Previously published releases will continue to be available via public package managers and the code will remain on GitHub.&lt;/td&gt; 
  &lt;/tr&gt; 
 &lt;/tbody&gt; 
&lt;/table&gt; 
&lt;h2&gt;Next Steps&lt;/h2&gt; 
&lt;p&gt;We encourage the AWS SDK for .NET community to begin planning your migration to V4 as soon as possible:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Review the &lt;a href="https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html" target="_blank" rel="noopener noreferrer"&gt;Migration Guide&lt;/a&gt; to understand the breaking changes.&lt;/li&gt; 
 &lt;li&gt;Test your applications with V4 in a development environment.&lt;/li&gt; 
 &lt;li&gt;Update your code to accommodate the changes.&lt;/li&gt; 
 &lt;li&gt;Provide feedback through our &lt;a href="https://github.com/aws/aws-sdk-net" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;With the maintenance mode transition now in effect and end of support on June 1st, 2026, we recommend prioritizing your migration planning to ensure a smooth transition. &lt;a href="https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html" target="_blank" rel="noopener noreferrer"&gt;Migration documentation&lt;/a&gt; is available to guide you through the update process.&lt;/p&gt; 
&lt;p&gt;For questions or issues that arise while updating to the V4 SDK, please use the GitHub repository’s &lt;a href="https://github.com/aws/aws-sdk-net/discussions" target="_blank" rel="noopener noreferrer"&gt;discussion forums&lt;/a&gt; or open GitHub &lt;a href="https://github.com/aws/aws-sdk-net/issues" target="_blank" rel="noopener noreferrer"&gt;issues &lt;/a&gt;to reach out to us. If you find dependencies that are preventing you from updating to V4, please let us know to see if we can help.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
	</channel>
</rss>