<?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>Wed, 26 Aug 2026 18:14:37 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Get started with the Agent Toolkit for AWS in the AWS CLI</title>
		<link>https://aws.amazon.com/blogs/developer/get-started-with-the-agent-toolkit-for-aws-in-the-aws-cli/</link>
					
		
		<dc:creator><![CDATA[Andrew Asseily]]></dc:creator>
		<pubDate>Wed, 26 Aug 2026 18:14:37 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[AWS CLI]]></category>
		<category><![CDATA[Developer Tools]]></category>
		<category><![CDATA[aws-cli]]></category>
		<guid isPermaLink="false">8659e9718f6694de31169ac6a7fc6e53e9e2d30f</guid>

					<description>AI coding agents such as Kiro, Claude Code, Codex, Cursor, and others play an increasingly important role in developer workflows. They write code, fix bugs, scaffold projects, and build infrastructure. By default, these agents have general knowledge of AWS. The Agent Toolkit for AWS gives them specialized, up-to-date expertise, so they’re more likely to pick […]</description>
										<content:encoded>&lt;p&gt;AI coding agents such as &lt;a href="https://kiro.dev/"&gt;Kiro&lt;/a&gt;, &lt;a href="https://code.claude.com/docs/en/overview"&gt;Claude Code&lt;/a&gt;, &lt;a href="https://chatgpt.com/codex/"&gt;Codex&lt;/a&gt;, &lt;a href="https://cursor.com/"&gt;Cursor&lt;/a&gt;, and others play an increasingly important role in developer workflows. They write code, fix bugs, scaffold projects, and build infrastructure. By default, these agents have general knowledge of AWS. The Agent Toolkit for AWS gives them specialized, up-to-date expertise, so they’re more likely to pick the right services for the task, use modern APIs, and follow security best practices.&lt;/p&gt; 
&lt;p&gt;With one command in the &lt;a href="https://aws.amazon.com/cli/"&gt;AWS Command Line Interface (AWS CLI)&lt;/a&gt;, your coding agent gets curated AWS expertise.&lt;/p&gt; 
&lt;p&gt;In this post I walk through what’s in the toolkit, how to install it, and how to manage skills as your work evolves.&lt;/p&gt; 
&lt;h2&gt;What’s in the Agent Toolkit for AWS?&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/skills.html#what-is-a-skill"&gt;AWS skills&lt;/a&gt; – A curated catalog of Markdown files that teach your agent how AWS works. The skills cover a wide range of AWS services and common developer workflows. Each skill is curated and maintained by AWS service teams and updated as services evolve.&lt;/li&gt; 
 &lt;li&gt;&lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/mcp-server.html"&gt;The AWS MCP Server&lt;/a&gt; – A secure, auditable connection your agent can use to reach thousands of AWS APIs through the &lt;a href="https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt;. With the AWS MCP Server, your agent can list resources, search documentation, and call AWS APIs using your existing &lt;a href="https://aws.amazon.com/iam/"&gt;AWS Identity and Access Management (IAM)&lt;/a&gt; credentials.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;These components give your agent the context to write better AWS code, take safer actions, and reach for the right service the first time. The catalog keeps growing as more AWS service teams contribute skills.&lt;/p&gt; 
&lt;h2&gt;Prerequisites&lt;/h2&gt; 
&lt;ul&gt; 
 &lt;li&gt;AWS CLI version 2.35.0 or newer. See the &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html"&gt;AWS CLI v2 install guide&lt;/a&gt; to install or upgrade.&lt;/li&gt; 
 &lt;li&gt;One or more supported AI coding agents installed locally. Kiro, Claude Code, Codex, Cursor, and other popular AI coding agents are supported. You can run &lt;code&gt;aws configure agent-toolkit&lt;/code&gt; to display the supported agents and detect which are present on your machine.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Set up the Agent Toolkit&lt;/h2&gt; 
&lt;p&gt;To start the interactive setup, use the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;aws configure agent-toolkit&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The wizard detects the supported AI coding agents on your machine, and you choose which ones to set up. For each agent you select, it installs a default set of AWS skills and configures the AWS MCP Server connection. You can add, update, or remove skills afterward with the &lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/aws-cli.html#aws-cli-managing-skills"&gt;aws agent-toolkit commands&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;The entire process typically takes a few seconds. The next time you open a chat session, your agent has AWS expertise loaded.&lt;/p&gt; 
&lt;p&gt;In a non-interactive environment, such as continuous integration or a development container, use the &lt;code&gt;--yes&lt;/code&gt; option to accept defaults without prompts:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;aws configure agent-toolkit --yes&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To explore the other available options, run &lt;code&gt;aws configure agent-toolkit help&lt;/code&gt;, or see the AWS CLI section of the &lt;a href="https://docs.aws.amazon.com/agent-toolkit/latest/userguide/aws-cli.html"&gt;Agent Toolkit for AWS User Guide&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;Extend as your project grows&lt;/h2&gt; 
&lt;p&gt;You can add, update, and remove skills at any time to match what you’re building. The skills installed by default cover common workflows, but as your project grows, you may need additional skills. Consider a serverless document-processing application that stores uploaded files in &lt;a href="https://aws.amazon.com/pm/serv-s3"&gt;Amazon Simple Storage Service (Amazon S3)&lt;/a&gt;. The application requires semantic search over the uploaded files, implemented with &lt;a href="https://aws.amazon.com/s3/features/vectors/"&gt;Amazon S3 Vectors&lt;/a&gt;, a recently released capability. Because the capability is new, the agent might lack current guidance for it. Complete the following steps to install the relevant skill so the agent has up-to-date guidance before it generates code.&lt;/p&gt; 
&lt;p&gt;Check what’s installed:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;aws agent-toolkit list-installed-skills&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The default install doesn’t include a vectors skill. Search for one and add it:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;aws agent-toolkit search-skills --search-query vectors
aws agent-toolkit add-skill --skill-name storing-and-querying-vectors&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;&lt;code&gt;search-skills&lt;/code&gt; matches against skill names and descriptions across the full catalog. &lt;code&gt;add-skill&lt;/code&gt; downloads the skill and installs it to each detected agent. Use &lt;code&gt;--agent&lt;/code&gt; to target a specific one.&lt;/p&gt; 
&lt;p&gt;As the toolkit and its skills evolve, you can keep them current or remove them:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="lang-bash"&gt;aws agent-toolkit update-skill aws-cdk
aws agent-toolkit remove-skill aws-cdk&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;In this post, I showed how to use the Agent Toolkit for AWS to give your AI coding agent AWS expertise and context with a single AWS CLI command. The toolkit installs a curated set of skills, configures the AWS MCP Server for the agents you select, and gives you simple commands to search, install, update, and remove skills as your needs evolve. The result is an agent that writes better AWS code, follows the latest best practices, and gets the answer right the first time more often.&lt;br&gt; To get started, install or upgrade the AWS CLI to version 2.35.0 or newer, then run &lt;code&gt;aws configure agent-toolkit&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;Try it today and tell us what you think. Open an issue or feature request on the &lt;a href="https://github.com/aws/aws-cli"&gt;AWS CLI GitHub repository&lt;/a&gt;&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Announcing response streaming for .NET on AWS Lambda</title>
		<link>https://aws.amazon.com/blogs/developer/announcing-response-streaming-for-net-on-aws-lambda/</link>
					
		
		<dc:creator><![CDATA[Norm Johanson]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 20:08:43 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[AWS SDK for .NET]]></category>
		<guid isPermaLink="false">ada2ec9254c731dbf70ae7a5df12a5bed4f71b36</guid>

					<description>Today, we are announcing support for AWS Lambda response streaming for .NET Lambda functions. With response streaming, functions can be more responsive by sending data back to the caller incrementally as it becomes available, rather than buffering the entire response in memory before returning it. Why response streaming? With the traditional Lambda invocation model, the […]</description>
										<content:encoded>&lt;p&gt;Today, we are announcing support for AWS Lambda &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html" target="_blank" rel="noopener"&gt;response streaming&lt;/a&gt; for .NET Lambda functions. With response streaming, functions can be more responsive by sending data back to the caller incrementally as it becomes available, rather than buffering the entire response in memory before returning it.&lt;/p&gt; 
&lt;h2&gt;Why response streaming?&lt;/h2&gt; 
&lt;p&gt;With the traditional Lambda invocation model, the function computes the entire response, serializes it, and returns it all at once. For workloads that produce large responses or generate output over time, this means the caller waits for the full response before seeing any data.&lt;/p&gt; 
&lt;p&gt;Response streaming changes this. Your function can start sending bytes to the caller immediately. This is useful for:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;LLM/AI responses&lt;/strong&gt; — stream tokens from a model as they are generated&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Large data exports&lt;/strong&gt; — send CSV or JSON lines without buffering the full dataset&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Larger responses&lt;/strong&gt; — streaming raises the max response size from 6 MB to 200 MB (or 10 MB when used with &lt;a href="https://aws.amazon.com/api-gateway/" target="_blank" rel="noopener"&gt;Amazon API Gateway&lt;/a&gt;).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Getting started with response streaming&lt;/h2&gt; 
&lt;p&gt;Response streaming is available for .NET 8 and later. To use it, your Lambda function calls &lt;code&gt;LambdaResponseStreamFactory.CreateStream()&lt;/code&gt; to get a writable .NET &lt;code&gt;System.IO.Stream&lt;/code&gt;. All output is written to this stream. If an invocation of the Lambda function creates a response stream, the handler’s return value is ignored.&lt;/p&gt; 
&lt;p&gt;Here is a simple example that streams “Hello” messages:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;using Amazon.Lambda.Core;
using Amazon.Lambda.Core.ResponseStreaming;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace StreamingHello;

public class Function
{
    public async Task FunctionHandler(string input, ILambdaContext context)
    {
        using var responseStream = LambdaResponseStreamFactory.CreateStream();
        using var writer = new StreamWriter(responseStream);

        for (var i = 1; i &amp;lt;= 100; i++)
        {
            await writer.WriteLineAsync($"Hello {input} - {i}");
            if (i % 10 == 0)
            {
                await writer.FlushAsync();
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;To invoke the function, use the Lambda &lt;a href="https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html" target="_blank" rel="noopener"&gt;InvokeWithResponseStream&lt;/a&gt; API from the &lt;code&gt;AWSSDK.Lambda&lt;/code&gt; package. The following example shows how to call this API and handle the streamed response:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var client = new AmazonLambdaClient();

var request = new InvokeWithResponseStreamRequest
{
    FunctionName = "StreamingHello",
    Payload = new MemoryStream(UTF8Encoding.UTF8.GetBytes("\"World\""))
};

var response = await client.InvokeWithResponseStreamAsync(request);

await foreach (var streamEvent in response.EventStream)
{
    switch (streamEvent)
    {
        case InvokeResponseStreamUpdate payloadChunk:
            {
                var text = Encoding.UTF8.GetString(payloadChunk.Payload.ToArray());
                Console.Write(text);
                break;
            }

        case InvokeWithResponseStreamCompleteEvent complete:
            {
                if (complete.ErrorCode != null)
                {
                    Console.WriteLine($"Error Code: {complete.ErrorCode}");
                }

                if (complete.ErrorDetails != null)
                {
                    Console.WriteLine($"Error Details: {complete.ErrorDetails}");
                }

                if (complete.LogResult != null)
                {
                    var logs = Encoding.UTF8.GetString(
                        Convert.FromBase64String(complete.LogResult));

                    Console.WriteLine("Logs:");
                    Console.WriteLine(logs);
                }

                break;
            }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;You can also test the Lambda function using the .NET tool &lt;a href="https://www.nuget.org/packages/Amazon.Lambda.Tools" target="_blank" rel="noopener"&gt;Amazon.Lambda.Tools&lt;/a&gt; with the &lt;code&gt;invoke-function&lt;/code&gt; command and the new &lt;code&gt;--invoke-mode Stream&lt;/code&gt; switch. The following command demonstrates invoking the &lt;code&gt;StreamingHello&lt;/code&gt; function and receiving its streamed output:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;&amp;gt; dotnet lambda invoke-function StreamingHello --invoke-mode Stream --payload "World"
Amazon Lambda Tools for .NET Core applications (7.0.0)
Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet

Payload:
Hello World - 1
Hello World - 2
Hello World - 3
Hello World - 4

...

Hello World - 97
Hello World - 98
Hello World - 99
Hello World - 100


Log Tail:
START RequestId: 3f162d6c-62b0-4e01-a041-9a850b6bd35f Version: $LATEST
END RequestId: 3f162d6c-62b0-4e01-a041-9a850b6bd35f
REPORT RequestId: 3f162d6c-62b0-4e01-a041-9a850b6bd35f  Duration: 33.50 ms      Billed Duration: 34 ms  Memory Size: 512 MB     Max Memory Used: 79 MB
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Streaming an LLM response with Microsoft.Extensions.AI&lt;/h2&gt; 
&lt;p&gt;A natural fit for response streaming is AI workloads where a model generates tokens over time. Using the &lt;a href="https://www.nuget.org/packages/Microsoft.Extensions.AI" target="_blank" rel="noopener"&gt;Microsoft.Extensions.AI&lt;/a&gt; framework with the &lt;a href="https://www.nuget.org/packages/AWSSDK.Extensions.Bedrock.MEAI" target="_blank" rel="noopener"&gt;AWSSDK.Extensions.Bedrock.MEAI&lt;/a&gt; provider, you can stream an &lt;a href="https://aws.amazon.com/bedrock" target="_blank" rel="noopener"&gt;Amazon Bedrock&lt;/a&gt; model’s response directly to the caller. The following example demonstrates how to do this:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;public class Function
{
    IChatClient _chatClient;

    public Function()
    {
        var bedrockClient = new AmazonBedrockRuntimeClient();
        _chatClient = bedrockClient.AsIChatClient(Environment.GetEnvironmentVariable("MODEL_ID"));
    }

    public async Task FunctionHandler(string prompt, ILambdaContext context)
    {
        using var responseStream = LambdaResponseStreamFactory.CreateStream();
        using var writer = new StreamWriter(responseStream);

        await foreach (var update in _chatClient.GetStreamingResponseAsync(prompt))
        {
            if (update.Text is { Length: &amp;gt; 0 })
            {
                await writer.WriteAsync(update.Text);
                await writer.FlushAsync();
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The caller starts receiving the model’s response as soon as the first tokens are generated. For conversational AI use cases, this makes the experience feel much more responsive.&lt;/p&gt; 
&lt;h2&gt;Response streaming with API Gateway REST API&lt;/h2&gt; 
&lt;p&gt;Lambda response streaming works with the API Gateway REST API. When streaming through API Gateway, the response needs a prelude containing the HTTP status code and headers. Use &lt;code&gt;LambdaResponseStreamFactory.CreateHttpStream&lt;/code&gt; to create a stream with a prelude.&lt;/p&gt; 
&lt;p&gt;The following example downloads an object from &lt;a href="https://aws.amazon.com/pm/serv-s3/" target="_blank" rel="noopener"&gt;Amazon S3&lt;/a&gt; and streams it directly to the caller through API Gateway without buffering the entire object in memory:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;public async Task Get(APIGatewayProxyRequest request, ILambdaContext context)
{        
    string? key;
    if (!request.PathParameters.TryGetValue("s3Key", out key))
    {
        var prelude = new Amazon.Lambda.Core.ResponseStreaming.HttpResponseStreamPrelude
        {
            StatusCode = HttpStatusCode.BadRequest,
            Headers = new Dictionary&amp;lt;string, string&amp;gt;
            {
                ["Content-Type"] = "text/plain",
            }
        };

        using var responseStream = LambdaResponseStreamFactory.CreateHttpStream(prelude);
        using var writer = new StreamWriter(responseStream);
        await writer.WriteAsync("Missing 's3Key' path parameter");
    }
    else
    {
        try
        {
            var getResponse = await _s3Client.GetObjectAsync(_bucketName, key);

            var prelude = new Amazon.Lambda.Core.ResponseStreaming.HttpResponseStreamPrelude
            {
                StatusCode = HttpStatusCode.OK,
                Headers = new Dictionary&amp;lt;string, string&amp;gt;
                {
                    ["Content-Type"] = getResponse.Headers.ContentType,
                    ["Content-Disposition"] = $"attachment; filename=\"{key}\""
                }
            };

            using var responseStream = LambdaResponseStreamFactory.CreateHttpStream(prelude);
            await getResponse.ResponseStream.CopyToAsync(responseStream);
        }
        catch (AmazonS3Exception ex) when (ex.StatusCode == HttpStatusCode.NotFound)
        {
            var prelude = new HttpResponseStreamPrelude
            {
                StatusCode = HttpStatusCode.NotFound,
                Headers = new Dictionary&amp;lt;string, string&amp;gt;
                {
                    ["Content-Type"] = "text/plain"
                }
            };

            using var responseStream = LambdaResponseStreamFactory.CreateHttpStream(prelude);
            using var writer = new StreamWriter(responseStream);
            await writer.WriteAsync($"Object '{key}' not found");
        }
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;As the S3 &lt;code&gt;GetObject&lt;/code&gt; response is read, the bytes flow directly into the Lambda response stream and out to the caller. This avoids loading the full object into memory, which is particularly useful for files up to the 10 MB API Gateway limit.&lt;/p&gt; 
&lt;p&gt;The API Gateway integration needs to be configured for streaming. In your &lt;a href="https://aws.amazon.com/cloudformation/" target="_blank" rel="noopener"&gt;AWS CloudFormation&lt;/a&gt; or &lt;a href="https://aws.amazon.com/serverless/sam/" target="_blank" rel="noopener"&gt;AWS SAM&lt;/a&gt; template, the integration URI must use the &lt;code&gt;/response-streaming-invocations&lt;/code&gt; path and set &lt;code&gt;responseTransferMode&lt;/code&gt; to &lt;code&gt;STREAM&lt;/code&gt;. The following template snippet shows the required integration configuration:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-javascript"&gt;"DefinitionBody": {
  "openapi": "3.0.1",
  "info": { "title": "My Streaming API", "version": "1.0" },
  "paths": {
    "/{proxy+}": {
      "x-amazon-apigateway-any-method": {
        "x-amazon-apigateway-integration": {
          "type": "aws_proxy",
          "httpMethod": "POST",
          "payloadFormatVersion": "1.0",
          "uri": {
            "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2021-11-15/functions/${StreamingFunction.Arn}/response-streaming-invocations"
          },
          "responseTransferMode": "STREAM",
          "timeoutInMillis": 29000
        }
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Response streaming with ASP.NET Core&lt;/h2&gt; 
&lt;p&gt;If you are using the &lt;a href="https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.AspNetCoreServer.Hosting" target="_blank" rel="noopener"&gt;Amazon.Lambda.AspNetCoreServer.Hosting&lt;/a&gt; package to run ASP.NET Core on Lambda, you can enable response streaming by setting &lt;code&gt;EnableResponseStreaming&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in the hosting options. The following example shows how to configure and use response streaming in an ASP.NET Core Lambda app&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAWSLambdaHosting(LambdaEventSource.RestApi, options =&amp;gt;
{
    options.EnableResponseStreaming = true;
});

var app = builder.Build();

app.MapGet("/", () =&amp;gt; "Hello from streaming Lambda");

app.MapGet("/stream", async (HttpContext context) =&amp;gt;
{
    context.Response.ContentType = "text/plain";
    var stream = context.Response.BodyWriter.AsStream();
    using var writer = new StreamWriter(stream, leaveOpen: true);

    for (var i = 1; i &amp;lt;= 100; i++)
    {
        await writer.WriteLineAsync($"Line {i}");
        if (i % 10 == 0)
        {
            await writer.FlushAsync();
        }
    }
});

app.Run();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;With &lt;code&gt;EnableResponseStreaming&lt;/code&gt; set to &lt;code&gt;true&lt;/code&gt;, the hosting layer builds the HTTP prelude from the ASP.NET Core response (status code, headers, cookies) and streams the body through the Lambda response stream. Standard ASP.NET Core endpoint returns like &lt;code&gt;Results.Json(...)&lt;/code&gt; and &lt;code&gt;Results.Text(...)&lt;/code&gt; work without changes.&lt;/p&gt; 
&lt;p&gt;The API Gateway integration needs to be configured for streaming. In your CloudFormation or SAM template, the integration URI must use the &lt;code&gt;/response-streaming-invocations&lt;/code&gt; path and set &lt;code&gt;responseTransferMode&lt;/code&gt; to &lt;code&gt;STREAM&lt;/code&gt;. The following SAM template demonstrates the full configuration for an ASP.NET Core streaming function:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-javascript"&gt;{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Resources": {
    "StreamingApi": {
      "Type": "AWS::Serverless::Api",
      "Properties": {
        "StageName": "prod",
        "DefinitionBody": {
          "openapi": "3.0.1",
          "info": { "title": "ASP.NET Core Streaming", "version": "1.0" },
          "paths": {
            "/": {
              "x-amazon-apigateway-any-method": {
                "x-amazon-apigateway-integration": {
                  "type": "aws_proxy",
                  "httpMethod": "POST",
                  "payloadFormatVersion": "1.0",
                  "uri": {
                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2021-11-15/functions/${AspNetCoreFunction.Arn}/response-streaming-invocations"
                  },
                  "responseTransferMode": "STREAM",
                  "timeoutInMillis": 29000
                }
              }
            },
            "/{proxy+}": {
              "x-amazon-apigateway-any-method": {
                "x-amazon-apigateway-integration": {
                  "type": "aws_proxy",
                  "httpMethod": "POST",
                  "payloadFormatVersion": "1.0",
                  "uri": {
                    "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2021-11-15/functions/${AspNetCoreFunction.Arn}/response-streaming-invocations"
                  },
                  "responseTransferMode": "STREAM",
                  "timeoutInMillis": 29000
                }
              }
            }
          }
        }
      }
    },
    "AspNetCoreFunction": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
        "Handler": "MyStreamingApp",
        "Runtime": "dotnet10",
        "CodeUri": "",
        "MemorySize": 512,
        "Timeout": 30,
        "Policies": ["AWSLambda_FullAccess"]
      }
    },
    "ApiPermission": {
      "Type": "AWS::Lambda::Permission",
      "Properties": {
        "Action": "lambda:InvokeFunction",
        "FunctionName": { "Ref": "AspNetCoreFunction" },
        "Principal": "apigateway.amazonaws.com",
        "SourceArn": {
          "Fn::Sub": "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${StreamingApi}/*/*/*"
        }
      }
    }
  },
  "Outputs": {
    "ApiURL": {
      "Value": {
        "Fn::Sub": "https://${StreamingApi}.execute-api.${AWS::Region}.amazonaws.com/prod/"
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;Response streaming opens up new patterns for .NET Lambda functions, particularly for AI workloads and large data transfers. To get started, update to the latest versions of &lt;code&gt;Amazon.Lambda.Core&lt;/code&gt; and &lt;code&gt;Amazon.Lambda.RuntimeSupport&lt;/code&gt;.&lt;/p&gt; 
&lt;p&gt;For feedback on .NET Lambda response streaming, open a GitHub issue or discussion on our &lt;a href="https://github.com/aws/aws-lambda-dotnet" target="_blank" rel="noopener"&gt;aws/aws-lambda-dotnet&lt;/a&gt; repository.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>Building and Deploying .NET AI Agents with Amazon Bedrock AgentCore</title>
		<link>https://aws.amazon.com/blogs/developer/building-and-deploying-net-ai-agents-with-amazon-bedrock-agentcore/</link>
					
		
		<dc:creator><![CDATA[Philippe El Asmar]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 16:56:46 +0000</pubDate>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Amazon Bedrock AgentCore]]></category>
		<category><![CDATA[Announcements]]></category>
		<category><![CDATA[AWS SDK for .NET]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[aws-sdk-for-net]]></category>
		<guid isPermaLink="false">3a7a44c9b8fb54baec020c8e628e23dd70a5c69b</guid>

					<description>Amazon Bedrock AgentCore is a managed service for running AI agents in production. You bring your agent code packaged as a container, and Bedrock AgentCore handles the operational concerns: scaling, session routing, health checking, and providing managed capabilities like conversation memory. AWS.AgentCore.Hosting is the .NET library that connects your agent code to this service. It […]</description>
										<content:encoded>&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/"&gt;Amazon Bedrock AgentCore&lt;/a&gt; is a managed service for running AI agents in production. You bring your agent code packaged as a container, and Bedrock AgentCore handles the operational concerns: scaling, session routing, health checking, and providing managed capabilities like conversation memory.&lt;/p&gt; 
&lt;p&gt;&lt;a href="https://www.nuget.org/packages/AWS.AgentCore.Hosting"&gt;AWS.AgentCore.Hosting&lt;/a&gt; is the .NET library that connects your agent code to this service. It implements the HTTP communication, streaming responses, session management, and memory integration so you can focus on your agent’s logic rather than the infrastructure. Built on &lt;a href="https://learn.microsoft.com/en-us/agent-framework/overview/"&gt;Microsoft Agent Framework&lt;/a&gt;, the library gives you access to the .NET AI ecosystem, such as tool calling, middleware, multi-agent workflows, and the &lt;a href="https://modelcontextprotocol.io"&gt;Model Context Protocol (MCP)&lt;/a&gt;, with a zero-friction path to production on AWS.&lt;/p&gt; 
&lt;p&gt;In this post, I’ll walk through building a customer support agent that can look up order status, remember what the customer already asked about, stream responses in real time, and deploy to production. Each section builds on the same agent and shows how to solve each piece of the problem.&lt;/p&gt; 
&lt;h2&gt;What is a .NET Bedrock AgentCore application?&lt;/h2&gt; 
&lt;p&gt;The following diagram shows how the pieces fit together at runtime:&lt;/p&gt; 
&lt;p&gt;&lt;img loading="lazy" class="alignnone" src="https://d2908q01vomqb2.cloudfront.net/0716d9708d321ffb6a00818614779e779925365c/2026/08/04/dotnet-agentcore-architecture.png" alt="The diagram shows the AgentCore Runtime, a managed service that runs your .NET container (an arm64 image). Inside the container, an ASP.NET Core host contains two layers: the AWS.AgentCore.Hosting library, which provides the endpoints, streaming, memory, and dependency injection; and your agent logic, which holds your tools, prompts, and middleware. The AgentCore Runtime handles scaling, session routing, health checks, and memory. It invokes the container in response to calls from a client application (your UI), and your agent logic calls out to an Amazon Bedrock model (or any model provider accessed through IChatClient)." width="1835" height="914"&gt;Your container hosts an &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/"&gt;ASP.NET Core&lt;/a&gt; application that includes AWS.AgentCore.Hosting as a dependency, which handles the HTTP communication the AgentCore Runtime expects. Your agent logic runs inside that host and calls out to &lt;a href="https://aws.amazon.com/bedrock/"&gt;Amazon Bedrock&lt;/a&gt;, or any other model provider, through the standard &lt;a href="https://learn.microsoft.com/en-us/dotnet/ai/ichatclient"&gt;&lt;code&gt;IChatClient&lt;/code&gt;&lt;/a&gt; interface.&lt;/p&gt; 
&lt;h2&gt;Write your agent handler&lt;/h2&gt; 
&lt;p&gt;AWS.AgentCore.Hosting provides two developer experiences:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Source generator experience.&lt;/strong&gt; This approach abstracts away the ASP.NET Core part of the application. Use it when you want to focus solely on your agent’s logic.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Extension method experience.&lt;/strong&gt; This approach provides extension methods to configure the application for Bedrock AgentCore. Use it when you want more control over the ASP.NET Core part of the application.&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Source generator&lt;/h3&gt; 
&lt;p&gt;After you annotate your classes, the source generator produces a &lt;code&gt;Program.cs&lt;/code&gt; for you. The generated code creates a &lt;code&gt;WebApplication&lt;/code&gt;, calls your &lt;code&gt;ConfigureServices&lt;/code&gt; method, maps your handler to the AgentCore Runtime endpoint, and starts the host. You don’t need to write routing or hosting boilerplate. The following example shows a complete agent that uses the source generator:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;using AWS.AgentCore.Hosting;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

[AgentCoreStartup]
public class Startup
{
    public void ConfigureServices(WebApplicationBuilder builder)
    {
        builder.AddAgentCore(options =&amp;gt;
        {
            options.ModelId = "global.anthropic.claude-sonnet-4-7";
            options.AgentOptions = new ChatClientAgentOptions
            {
                ChatOptions = new()
                {
                    Tools = [AIFunctionFactory.Create(GetOrderStatus)]
                }
            };
        });
    }

    [Description("Looks up the current status of a customer order.")]
    public static string GetOrderStatus([Description("The order ID.")] string orderId)
        =&amp;gt; $"Order {orderId} shipped on July 3 and is expected to arrive tomorrow.";
}

public class Agent(AIAgent agent)
{
    [AgentCoreHandler]
    public async Task&amp;lt;string&amp;gt; HandleInvocation(
        PromptRequest request, AgentCoreRuntimeContext context, CancellationToken ct)
    {
        var session = await agent.CreateSessionAsync(cancellationToken: ct);
        var response = await agent.RunAsync(
            request.Prompt ?? "Hello!", session: session, cancellationToken: ct);
        return response.ToString();
    }
}

public record PromptRequest(string? Prompt);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;A few rules to understand about this model:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Discovery is by attribute, not naming convention.&lt;/strong&gt; The source generator scans for &lt;code&gt;[AgentCoreStartup]&lt;/code&gt; and &lt;code&gt;[AgentCoreHandler]&lt;/code&gt; at compile time. You can name your classes anything you want.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;One handler per project.&lt;/strong&gt; The generator expects exactly one method marked with &lt;code&gt;[AgentCoreHandler]&lt;/code&gt;. This is the single entry point the AgentCore Runtime invokes.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;The handler supports DI parameter binding.&lt;/strong&gt; Just like the extension method experience shown below, you can inject any registered service directly in the handler’s parameter list. &lt;code&gt;AIAgent&lt;/code&gt; in the example above is constructor-injected because &lt;code&gt;AddAgentCore()&lt;/code&gt; automatically registers it (along with &lt;code&gt;IChatClient&lt;/code&gt;, &lt;code&gt;AgentCoreRuntimeContext&lt;/code&gt;, and the memory provider if configured).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Return type determines the response mode.&lt;/strong&gt; Return &lt;code&gt;string&lt;/code&gt; or &lt;code&gt;Task&amp;lt;string&amp;gt;&lt;/code&gt; for a standard response. Return &lt;code&gt;IAsyncEnumerable&amp;lt;string&amp;gt;&lt;/code&gt; for streaming (covered in the Stream responses section below).&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h3&gt;Extension methods&lt;/h3&gt; 
&lt;p&gt;If you prefer the &lt;a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis"&gt;Minimal API&lt;/a&gt; pattern or want more control over the ASP.NET Core application, use the extension method experience:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var builder = WebApplication.CreateBuilder(args);

builder.AddAgentCore(options =&amp;gt;
{
    options.ModelId = "global.anthropic.claude-sonnet-4-7";
    options.AgentOptions = new ChatClientAgentOptions
    {
        ChatOptions = new()
        {
            Tools = [AIFunctionFactory.Create(GetOrderStatus)]
        }
    };
});

[Description("Looks up the current status of a customer order.")]
static string GetOrderStatus([Description("The order ID.")] string orderId)
        =&amp;gt; $"Order {orderId} shipped on July 3 and is expected to arrive tomorrow.";

var app = builder.Build();

app.MapAgentCore&amp;lt;PromptRequest&amp;gt;(async (PromptRequest request, AIAgent agent, CancellationToken ct) =&amp;gt;
{
    var session = await agent.CreateSessionAsync(cancellationToken: ct);
    var response = await agent.RunAsync(request.Prompt ?? "Hello!", session: session, cancellationToken: ct);
    return response.ToString();
});

app.Run();

public record PromptRequest(string? Prompt);
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Both the preceding example and the source generator example produce an agent that listens on port &lt;code&gt;8080&lt;/code&gt;, accepts JSON at &lt;code&gt;/invocations&lt;/code&gt;, and sends responses back to the AgentCore Runtime.&lt;/p&gt; 
&lt;h2&gt;Select different models&lt;/h2&gt; 
&lt;p&gt;The &lt;code&gt;AddAgentCore()&lt;/code&gt; method supports three ways to provide the &lt;code&gt;IChatClient&lt;/code&gt; from &lt;a href="https://www.nuget.org/packages/Microsoft.Extensions.AI"&gt;Microsoft.Extensions.AI&lt;/a&gt;. The precedence order is:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;code&gt;options.ChatClient&lt;/code&gt; (if provided)&lt;/li&gt; 
 &lt;li&gt;&lt;code&gt;options.ModelId&lt;/code&gt; (if provided)&lt;/li&gt; 
 &lt;li&gt;the &lt;code&gt;IChatClient&lt;/code&gt; already registered in DI (if provided)&lt;/li&gt; 
&lt;/ol&gt; 
&lt;p&gt;If several &lt;code&gt;IChatClient&lt;/code&gt; instances are registered in DI, the most recently registered one is used, following standard dependency injection resolution. If none of the three are provided, &lt;code&gt;AddAgentCore()&lt;/code&gt; throws an exception at startup so you get a clear error immediately rather than a null reference on first invocation.&lt;/p&gt; 
&lt;p&gt;The following example shows each of the three options:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;// Option 1: Bedrock model ID (registers IAmazonBedrockRuntime automatically)
builder.AddAgentCore(options =&amp;gt; { options.ModelId = "global.anthropic.claude-sonnet-4-7"; });

// Option 2: Explicit IChatClient (OpenAI, Anthropic, Ollama, etc.)
builder.AddAgentCore(options =&amp;gt; { options.ChatClient = myOpenAIClient; });

// Option 3: Pre-register in DI (useful for custom pipelines)
builder.Services.AddSingleton&amp;lt;IChatClient&amp;gt;(myClient);
builder.AddAgentCore();
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Resolve services with automatic DI&lt;/h2&gt; 
&lt;p&gt;The handler supports dependency injection directly in its parameter list. The runtime resolves services from the container at invocation time:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;app.MapAgentCore&amp;lt;PromptRequest&amp;gt;(async (
    PromptRequest request,
    AIAgent agent,
    AgentCoreRuntimeContext context,
    ILogger&amp;lt;Program&amp;gt; logger,
    IChatClient chatClient,
    CancellationToken ct) =&amp;gt;
{
    logger.LogInformation("SessionId={SessionId}, RequestId={RequestId}",
        context.SessionId, context.RequestId);

    var session = await agent.CreateSessionAsync(cancellationToken: ct);
    return (await agent.RunAsync(request.Prompt!, session: session, cancellationToken: ct)).ToString();
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The &lt;code&gt;AgentCoreRuntimeContext&lt;/code&gt; provides session and request metadata passed by the AgentCore Runtime, plus any custom headers configured on the runtime endpoint.&lt;/p&gt; 
&lt;h2&gt;Stream responses&lt;/h2&gt; 
&lt;p&gt;When a customer asks a detailed question like “what’s the return policy for my order?”, they shouldn’t have to wait while the model generates a full response. Return &lt;code&gt;IAsyncEnumerable&amp;lt;string&amp;gt;&lt;/code&gt; to stream tokens as they’re produced:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;app.MapAgentCore&amp;lt;PromptRequest&amp;gt;((PromptRequest request, AIAgent agent, CancellationToken ct) =&amp;gt;
{
    return StreamResponse(ct);

    async IAsyncEnumerable&amp;lt;string&amp;gt; StreamResponse([EnumeratorCancellation] CancellationToken ct = default)
    {
        var session = await agent.CreateSessionAsync(cancellationToken: ct);
        await foreach (var update in agent.RunStreamingAsync(
            request.Prompt ?? "Hello!", session: session, cancellationToken: ct))
        {
            if (!string.IsNullOrEmpty(update.Text))
                yield return update.Text;
        }
    }
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Add conversation memory&lt;/h2&gt; 
&lt;p&gt;When a customer asks “where’s my order?” and then follows up with “can you change the shipping address?”, they expect the agent to remember which order they’re talking about. You can add conversation context to your agent with &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html"&gt;AgentCore Memory&lt;/a&gt;, a managed service that stores and retrieves conversation history per session, so your agent maintains context across invocations and container restarts without you managing any storage infrastructure.&lt;/p&gt; 
&lt;p&gt;You provision a Memory resource through the AWS console, CLI, or CDK (see the &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html"&gt;AgentCore Memory documentation&lt;/a&gt;), which gives you a Memory ID. Pass that ID to your agent configuration:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;builder.AddAgentCore(options =&amp;gt;
{
    options.MemoryId = "my-memory-id";
    options.ModelId = "global.anthropic.claude-sonnet-4-7";
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;With this single setting, the library automatically loads conversation history at the start of each invocation and saves new messages after the agent responds. Your agent code doesn’t need to handle history loading or storage.&lt;/p&gt; 
&lt;p&gt;The key to how this works is the &lt;code&gt;SessionId&lt;/code&gt; on &lt;code&gt;AgentCoreRuntimeContext&lt;/code&gt;. Each invocation from the AgentCore Runtime carries a session ID, set by the caller through the invoke API. The library combines that session ID with the Memory ID you configured to load and store history in the AgentCore Memory service. Two different users calling the same agent get separate sessions with separate histories. On the first invocation for a new session, the AgentCore Memory service returns empty history and the agent starts fresh.&lt;/p&gt; 
&lt;p&gt;If you deploy using &lt;code&gt;dotnet aws deploy&lt;/code&gt; or with AWS’s &lt;a href="https://learn.microsoft.com/en-us/dotnet/aspire/"&gt;Aspire&lt;/a&gt; integrations, the memory can also be provisioned for you as part of the deployment.&lt;/p&gt; 
&lt;h2&gt;Add logging and guardrails with middleware&lt;/h2&gt; 
&lt;p&gt;To get visibility into how your agent is performing, such as logging invocations, tracking latency, or adding guardrails, you can add middleware to the Microsoft Agent Framework pipeline:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;builder.AddAgentCore(options =&amp;gt;
{
    options.ModelId = "global.anthropic.claude-sonnet-4-7";
    options.ConfigureAgent = agent =&amp;gt; agent
        .AsBuilder()
        .Use((innerAgent, services) =&amp;gt;
        {
            var logger = services.GetRequiredService&amp;lt;ILogger&amp;lt;Program&amp;gt;&amp;gt;();
            return innerAgent.AsBuilder()
                .Use(async (messages, session, runOptions, next, ct) =&amp;gt;
                {
                    logger.LogInformation("Agent invoked. Message count: {Count}", messages.Count());
                    await next(messages, session, runOptions, ct);
                    logger.LogInformation("Agent completed.");
                })
                .Build();
        })
        .Build();
});
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Middleware intercepts every agent invocation, letting you add logging, guardrails, caching, or custom pre/post-processing without modifying your agent’s core logic.&lt;/p&gt; 
&lt;h2&gt;Aspire integration&lt;/h2&gt; 
&lt;p&gt;With the agent logic in place, you need a way to run and test it alongside the frontend that customers will actually use. The &lt;a href="https://www.nuget.org/packages/Aspire.Hosting.AWS/"&gt;Aspire.Hosting.AWS&lt;/a&gt; package provides &lt;code&gt;AddAgentCoreRuntime&amp;lt;T&amp;gt;()&lt;/code&gt; for both local development and deployment to AWS.&lt;/p&gt; 
&lt;h3&gt;Local development&lt;/h3&gt; 
&lt;p&gt;During local development, &lt;code&gt;AddAgentCoreRuntime&amp;lt;T&amp;gt;()&lt;/code&gt; runs the agent and its supporting services in-process so you can exercise the full experience on your machine:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;var builder = DistributedApplication.CreateBuilder(args);

var agent = builder.AddAgentCoreRuntime&amp;lt;Projects.MyAgent&amp;gt;("my-agent")
    .WithAgentCoreStreaming()
    .WithAgentCoreMemory();

builder.AddProject&amp;lt;Projects.Frontend&amp;gt;("frontend")
    .WithReference(agent);

builder.Build().Run();
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The preceding example starts three embedded in-process servers, with no Docker or separate processes required:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;&lt;strong&gt;Runtime emulator&lt;/strong&gt;: mimics the AgentCore Runtime locally and invokes your agent&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Chat UI&lt;/strong&gt;: provides a web interface for testing your agent interactively&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Memory emulator&lt;/strong&gt;: provides an in-memory implementation of the AgentCore Memory APIs&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Projects that call &lt;code&gt;WithReference(agent)&lt;/code&gt; have their AgentCore SDK calls automatically routed to the local emulator. No additional configuration is required. Your agent handler is invoked the same way in local development and in production.&lt;/p&gt; 
&lt;h3&gt;Deploying with Aspire&lt;/h3&gt; 
&lt;p&gt;Recently AWS released &lt;a href="https://github.com/aws/integrations-on-dotnet-aspire-for-aws/issues/163"&gt;preview support for deployment with Aspire&lt;/a&gt;, presented at &lt;a href="https://youtu.be/0G2S76Kimh4?t=462"&gt;Aspire Conf 2026&lt;/a&gt;. The deployment support was extended to include Bedrock AgentCore, building off of the local development workflow described in the preceding section. An advantage of the Aspire deployment is that it enables deployment of multiple connected projects as a single action.&lt;/p&gt; 
&lt;p&gt;When you run the &lt;code&gt;aspire deploy&lt;/code&gt; CLI command with the &lt;a href="#local-development"&gt;Aspire sample from the preceding section&lt;/a&gt;, Aspire takes care of:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Provisioning AgentCore Memory&lt;/li&gt; 
 &lt;li&gt;Deploying the “my-agent” app to Bedrock AgentCore, with the AgentCore Memory links set up so the agent automatically uses the provisioned memory&lt;/li&gt; 
 &lt;li&gt;Deploying the “frontend” to &lt;a href="https://aws.amazon.com/ecs/"&gt;Amazon Elastic Container Service (Amazon ECS)&lt;/a&gt; and providing the deployed application with the agent’s ARN through the environment variable &lt;code&gt;AWS:Resources:&amp;lt;aspire-resource-name&amp;gt;:AgentRuntimeArn&lt;/code&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;You can customize the deployment to Bedrock AgentCore with the &lt;code&gt;PublishAsAgentCoreRuntime&lt;/code&gt; extension method. The following example shows how to customize the request header allowlist:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;builder.AddAgentCoreRuntime&amp;lt;Projects.AgentCore_StreamingAgent&amp;gt;("my-agent")
    .PublishAsAgentCoreRuntime(new Aspire.Hosting.AWS.Deployment.PublishAgentCoreRuntimeConfig
    {
        ConstructCfnRuntimeCallback = (construct, props) =&amp;gt;
        {
            props.RequestHeaderConfiguration = new CfnRuntime.RequestHeaderConfigurationProperty
            {
                RequestHeaderAllowlist = new string[] { "X-Custom-Header" }
            };
        }
    })
    .WithAgentCoreStreaming()
    .WithAgentCoreMemory();
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Testing package&lt;/h2&gt; 
&lt;p&gt;The &lt;a href="https://www.nuget.org/packages/AWS.AgentCore.Testing/"&gt;AWS.AgentCore.Testing&lt;/a&gt; package provides the same emulator infrastructure that powers the Aspire integration, available as standalone servers for your integration tests. The runtime emulator bridges your test code and your agent, forwarding requests to your agent the same way the AgentCore Runtime does in production.&lt;/p&gt; 
&lt;p&gt;The following example shows how the pieces fit together in an integration test:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-markdown"&gt;public class AgentIntegrationTest : IAsyncLifetime
{
    private WebApplication _agentApp;
    private WebApplication _runtimeEmulator;

    public async Task InitializeAsync()
    {
        // 1. Start your agent
        var builder = WebApplication.CreateBuilder();
        builder.AddAgentCore(options =&amp;gt; { options.ModelId = "global.anthropic.claude-sonnet-4-7"; });
        _agentApp = builder.Build();
        _agentApp.MapAgentCore&amp;lt;PromptRequest&amp;gt;(async (PromptRequest req, AIAgent agent, CancellationToken ct) =&amp;gt;
        {
            var session = await agent.CreateSessionAsync(cancellationToken: ct);
            return (await agent.RunAsync(req.Prompt!, session: session, cancellationToken: ct)).ToString();
        });
        await _agentApp.StartAsync();

        // 2. Start the runtime emulator pointing at the agent
        var agentUrl = _agentApp.Urls.First();
        _runtimeEmulator = RuntimeEmulatorServer.Create(agentUrl, port: 0);
        await _runtimeEmulator.StartAsync();
    }

    [Fact]
    public async Task Agent_RespondsToPrompt()
    {
        // 3. Invoke through the emulator, same path as production
        var runtimeUrl = _runtimeEmulator.Urls.First();
        using var client = new HttpClient();
        var response = await client.PostAsJsonAsync($"{runtimeUrl}/invoke",
            new { prompt = "What is 2+2? Reply with just the number." });

        var body = await response.Content.ReadAsStringAsync();
        Assert.Contains("4", body);
    }

    public async Task DisposeAsync()
    {
        await _runtimeEmulator.StopAsync();
        await _agentApp.StopAsync();
    }
}
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The preceding example lets you verify your agent’s behavior end-to-end without deploying to AWS.&lt;/p&gt; 
&lt;h2&gt;Native AOT support&lt;/h2&gt; 
&lt;p&gt;For minimal cold start times, deploy your agent as a &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/"&gt;Native AOT&lt;/a&gt; binary. Dependency injection parameter binding relies on reflection to resolve parameters at runtime, which isn’t available under Native AOT. For Native AOT, use the overload of &lt;code&gt;MapAgentCore&lt;/code&gt; with a fixed handler signature, &lt;code&gt;(TRequest, AgentCoreRuntimeContext, IServiceProvider, CancellationToken)&lt;/code&gt;, instead of the flexible DI parameter binding from earlier sections. Your code can resolve services manually from &lt;code&gt;IServiceProvider&lt;/code&gt;, and you pass a &lt;code&gt;JsonSerializerContext&lt;/code&gt; so requests can be deserialized without reflection (Native AOT requires source-generated JSON serialization):&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-csharp"&gt;app.MapAgentCore&amp;lt;PromptRequest&amp;gt;(
    async (request, context, services, ct) =&amp;gt;
    {
        var agent = services.GetRequiredService&amp;lt;AIAgent&amp;gt;();
        var session = await agent.CreateSessionAsync(cancellationToken: ct);
        var response = await agent.RunAsync(
            request.Prompt ?? "Hello!", session: session, cancellationToken: ct);
        return response.ToString();
    },
    AppJsonContext.Default);

[JsonSerializable(typeof(PromptRequest))]
internal partial class AppJsonContext : JsonSerializerContext { }
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;If you prefer dependency injection similar to the &lt;a href="#source-generator"&gt;source generator experience&lt;/a&gt;, the source generator annotations (&lt;code&gt;[AgentCoreStartup]&lt;/code&gt;, &lt;code&gt;[AgentCoreHandler]&lt;/code&gt;) are Native AOT-compatible and handle the binding for you at compile time.&lt;/p&gt; 
&lt;h2&gt;Deploying to AWS&lt;/h2&gt; 
&lt;p&gt;Once your agent handles orders, streams responses, remembers context, and passes your integration tests, it’s ready for production. The &lt;a href="https://www.nuget.org/packages/AWS.Deploy.Tools"&gt;AWS .NET deployment tool&lt;/a&gt; detects projects referencing &lt;code&gt;AWS.AgentCore.Hosting&lt;/code&gt; and recommends deploying to Amazon Bedrock AgentCore Runtime:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-bash"&gt;dotnet aws deploy
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;The tool then recommends the Bedrock AgentCore Runtime deployment option:&lt;/p&gt; 
&lt;pre&gt;&lt;code&gt;Recommended Deployment Option
-----------------------------
1: ASP.NET Core App to Amazon Bedrock AgentCore Runtime (Experimental)
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;This deployment option handles:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Building an &lt;code&gt;arm64&lt;/code&gt; container image and pushing to &lt;a href="https://aws.amazon.com/ecr/"&gt;Amazon Elastic Container Registry (Amazon ECR)&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Provisioning the AgentCore Runtime&lt;/li&gt; 
 &lt;li&gt;Optionally creating an AgentCore Memory resource&lt;/li&gt; 
 &lt;li&gt;Configuring &lt;a href="https://aws.amazon.com/vpc/"&gt;Amazon Virtual Private Cloud (Amazon VPC)&lt;/a&gt; networking and security groups for agents that need to access private resources&lt;/li&gt; 
 &lt;li&gt;Displaying the runtime ARN after deployment&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Next steps&lt;/h2&gt; 
&lt;p&gt;Now that you’ve built, tested, and deployed a customer support agent, you can explore the samples and documentation to go further:&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Try the &lt;a href="https://github.com/aws/aws-dotnet-ai/tree/main/sampleapps"&gt;sample apps&lt;/a&gt; covering annotations, streaming, Native AOT, and Aspire integration&lt;/li&gt; 
 &lt;li&gt;Set up local development with &lt;a href="https://github.com/aws/integrations-on-dotnet-aspire-for-aws"&gt;Aspire.Hosting.AWS&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Deploy with &lt;code&gt;dotnet aws deploy&lt;/code&gt; or integrate with your CI/CD pipeline&lt;/li&gt; 
 &lt;li&gt;Read the &lt;a href="https://github.com/aws/aws-dotnet-ai/blob/main/src/AWS.AgentCore.Hosting/README.md"&gt;full documentation&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;File issues or contribute at &lt;a href="https://github.com/aws/aws-dotnet-ai"&gt;github.com/aws/aws-dotnet-ai&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt;</content:encoded>
					
					
			
		
		
			</item>
		<item>
		<title>AWS Tools Installer V2 is Now Generally Available</title>
		<link>https://aws.amazon.com/blogs/developer/aws-tools-installer-v2-is-now-generally-available/</link>
					
		
		<dc:creator><![CDATA[Jonathan Nunn]]></dc:creator>
		<pubDate>Wed, 05 Aug 2026 00:01:47 +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">f21bbc09fb1add298ee4be736e586234f111e1d1</guid>

					<description>If you’ve been managing multiple AWS Tools for PowerShell modules individually, you know how time-consuming installations and updates can be. In this post, we announce the general availability of AWS Tools Installer V2. It minimizes installation time by downloading a single zip file and extracting modules in parallel. In February 2026, we announced the preview […]</description>
										<content:encoded>&lt;p&gt;If you’ve been managing multiple &lt;a href="https://docs.aws.amazon.com/powershell/"&gt;AWS Tools for PowerShell&lt;/a&gt; modules individually, you know how time-consuming installations and updates can be. In this post, we announce the general availability of AWS Tools Installer V2. It minimizes installation time by downloading a single zip file and extracting modules in parallel.&lt;/p&gt; 
&lt;p&gt;In February 2026, we &lt;a href="https://aws.amazon.com/blogs/developer/aws-tools-installer-v2-preview/"&gt;announced the preview of AWS Tools Installer V2&lt;/a&gt;.&lt;/p&gt; 
&lt;h2&gt;V2 improvements&lt;/h2&gt; 
&lt;p&gt;AWS Tools Installer V2 downloads a single zip file from &lt;a href="https://aws.amazon.com/cloudfront/"&gt;Amazon CloudFront&lt;/a&gt; and extracts modules in parallel. This eliminates the need to install hundreds of individually packaged modules.&lt;/p&gt; 
&lt;p&gt;Installer V2 installs modules by default, so commands are available for immediate use. This also helps avoid module import conflicts that can occur when modules are not all on the same version.&lt;/p&gt; 
&lt;p&gt;The following example shows how to install all AWS Tools for PowerShell modules by running &lt;code&gt;Install-AWSToolsModule&lt;/code&gt;. To reduce the risk of breaking changes, add the &lt;code&gt;-Version&lt;/code&gt; parameter. It limits updates to minor versions of V5 of AWS Tools for PowerShell.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Install-AWSToolsModule -Version 5.*
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;AWS Tools Installer V2 also introduces the self-update commands &lt;code&gt;Install-AWSToolsInstaller&lt;/code&gt; and &lt;code&gt;Uninstall-AWSToolsInstaller&lt;/code&gt; so you can update the installer module directly without manual steps.&lt;/p&gt; 
&lt;p&gt;The following example installs the latest minor version updates for AWS Tools Installer V2. Staying on minor versions helps you maintain a stable environment.&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Install-AWSToolsInstaller -Version 2.*
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Bugs fixed&lt;/h2&gt; 
&lt;p&gt;V2 resolves two key issues:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;Previously, latest modules were not installed on systems with discontinued modules. V2 now successfully updates modules that are not discontinued.&lt;/li&gt; 
 &lt;li&gt;During the daily release window, installations sometimes failed because some modules were still being published. V2 avoids this by installing only the module versions that have completed publishing.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;h2&gt;New features&lt;/h2&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;Support for Offline Installation:&lt;/strong&gt; The new &lt;code&gt;-SourceZipPath&lt;/code&gt; parameter allows installation from locally staged files in offline or air-gapped environments.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Support for Prerelease Installation:&lt;/strong&gt; A new parameter called &lt;code&gt;-Prerelease&lt;/code&gt; allows installation of preview builds of AWS Tools for PowerShell and AWS Tools Installer.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Installer Update Notifications:&lt;/strong&gt; When you import AWS Tools Installer, it displays a message notifying you if a new version is available.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Support for Standard Module Removal:&lt;/strong&gt; AWS Tools Installer now adds metadata so you can remove modules using standard PowerShell commands (&lt;code&gt;Uninstall-Module&lt;/code&gt; and &lt;code&gt;Uninstall-PSResource&lt;/code&gt;).&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Removal of Legacy Modules:&lt;/strong&gt; AWS Tools Installer V2 supports uninstalling the legacy &lt;code&gt;AWSPowerShell&lt;/code&gt; and &lt;code&gt;AWSPowerShell.NetCore&lt;/code&gt; modules from the paths listed in the &lt;code&gt;PSModulePath&lt;/code&gt; environment variable.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Uninstall-AWSToolsModule -CleanUpLegacyScope 'CurrentUser'
Install-AWSToolsModule -CleanUpLegacyScope 'CurrentUser'
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Breaking changes&lt;/h2&gt; 
&lt;p&gt;You must plan for the following potential issues when upgrading:&lt;/p&gt; 
&lt;ol&gt; 
 &lt;li&gt;&lt;strong&gt;New download endpoint:&lt;/strong&gt; AWS Tools Installer V2 uses following endpoint to download zip files: &lt;code&gt;https://sdk-for-net.amazonwebservices.com/ps/&lt;/code&gt;. You might need to update your firewall rules to allow access to this endpoint.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Proxy parameters ignored:&lt;/strong&gt; The &lt;code&gt;-Proxy&lt;/code&gt; and &lt;code&gt;-ProxyCredential&lt;/code&gt; parameters are now ignored and have no effect. They are still accepted for backward compatibility. To configure proxy settings for your environment, see the &lt;a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables"&gt;PowerShell environment variables documentation&lt;/a&gt;. On Windows PowerShell 5.1, downloads use your system proxy settings.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Force parameter behavior change:&lt;/strong&gt; The &lt;code&gt;-Force&lt;/code&gt; parameter is now deprecated and ignored for &lt;code&gt;Uninstall-AWSToolsModule&lt;/code&gt;. When running &lt;code&gt;Install-AWSToolsModule -Force&lt;/code&gt;, the existing module is overwritten even if the name and version match. To skip interactive confirmation prompts, add &lt;code&gt;-Confirm:$false&lt;/code&gt; to the command.&lt;/li&gt; 
 &lt;li&gt;&lt;strong&gt;Ignored parameters:&lt;/strong&gt; The &lt;code&gt;-SkipUpdate&lt;/code&gt;, &lt;code&gt;-SkipPublisherCheck&lt;/code&gt;, and &lt;code&gt;-AllowClobber&lt;/code&gt; parameters are accepted for backward compatibility but no longer have any effect. If your scripts relied on &lt;code&gt;-SkipUpdate&lt;/code&gt; to prevent updates, installed modules will now be updated.&lt;/li&gt; 
&lt;/ol&gt; 
&lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The original V1 command behavior is preserved in these additional commands: &lt;code&gt;Install-AWSToolsModuleV1&lt;/code&gt;, &lt;code&gt;Uninstall-AWSToolsModuleV1&lt;/code&gt;, and &lt;code&gt;Update-AWSToolsModuleV1&lt;/code&gt;. You can define an alias for each command to map legacy scripts back to the original functionality after upgrading to V2. For example:&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Set-Alias -Name Install-AWSToolsModule -Value Install-AWSToolsModuleV1
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Getting started&lt;/h2&gt; 
&lt;p&gt;For prerequisites and full setup details, see &lt;a href="https://docs.aws.amazon.com/powershell/v5/userguide/pstools-getting-set-up.html"&gt;Installing the AWS Tools for PowerShell&lt;/a&gt;.&lt;/p&gt; 
&lt;p&gt;Install the latest version of AWS Tools Installer V2 from the &lt;a href="https://www.powershellgallery.com/"&gt;PowerShell Gallery (PSGallery)&lt;/a&gt; by running the following command:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Install-Module -Name AWS.Tools.Installer -MinimumVersion 2.0.0 -MaximumVersion 2.9.999 -Repository PSGallery
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;View help documentation&lt;/h2&gt; 
&lt;p&gt;Once installed, run the following command to list the available AWS Tools Installer commands:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-Command -Module AWS.Tools.Installer
&lt;/code&gt;&lt;/pre&gt; 
&lt;p&gt;Run &lt;code&gt;Get-Help&lt;/code&gt; to view documentation for any AWS Tools Installer command. For example:&lt;/p&gt; 
&lt;pre&gt;&lt;code class="language-powershell"&gt;Get-Help Install-AWSToolsModule -Full
&lt;/code&gt;&lt;/pre&gt; 
&lt;h2&gt;Conclusion&lt;/h2&gt; 
&lt;p&gt;AWS Tools Installer V2 is now generally available with faster installation, parallel extraction, and improved reliability. To get started, install V2 from PSGallery using the commands in this post.&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt;Learn more on the &lt;a href="https://aws.amazon.com/powershell/"&gt;AWS Tools for PowerShell product page&lt;/a&gt;&lt;/li&gt; 
 &lt;li&gt;Read the &lt;a href="https://docs.aws.amazon.com/powershell/"&gt;AWS Tools for PowerShell documentation&lt;/a&gt;&lt;/li&gt; 
&lt;/ul&gt; 
&lt;h2&gt;Provide feedback&lt;/h2&gt; 
&lt;p&gt;We’re looking forward to hearing what you think about the new version of AWS Tools Installer. Please share any feedback you have at the &lt;a href="https://github.com/aws/aws-tools-for-powershell/issues"&gt;AWS Tools for PowerShell GitHub repository&lt;/a&gt;.&lt;/p&gt;</content:encoded>
					
					
			
		
		
			</item>
		<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>
	</channel>
</rss>