<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Soushi Hiruta</title>
    <description>The latest articles on DEV Community by Soushi Hiruta (@shiruta).</description>
    <link>https://dev.to/shiruta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2925401%2Fc6857081-3e71-482d-88c0-3a1ee4143676.jpg</url>
      <title>DEV Community: Soushi Hiruta</title>
      <link>https://dev.to/shiruta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shiruta"/>
    <language>en</language>
    <item>
      <title>ECR can create automaticaly when image pushed</title>
      <dc:creator>Soushi Hiruta</dc:creator>
      <pubDate>Sun, 21 Dec 2025 21:51:42 +0000</pubDate>
      <link>https://dev.to/shiruta/ecr-can-create-automaticaly-when-image-pushed-38f</link>
      <guid>https://dev.to/shiruta/ecr-can-create-automaticaly-when-image-pushed-38f</guid>
      <description>&lt;p&gt;ECR can create automaticaly when image pushed&lt;/p&gt;

&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2025/12/amazon-ecr-creating-repositories-on-push/" rel="noopener noreferrer"&gt;https://aws.amazon.com/about-aws/whats-new/2025/12/amazon-ecr-creating-repositories-on-push/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository Create Template
&lt;/h2&gt;

&lt;p&gt;Frist need to create Repository Create template.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuziqnnbb7n45pr4oqp5q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuziqnnbb7n45pr4oqp5q.png" alt=" " width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Specific Prefix ECR Automaticaly create or You can create any repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8f30hpreog1uwckzxrml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8f30hpreog1uwckzxrml.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whether to overwrite image tags or not can be set at the template creation stage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F319nhn1kuprh9164741g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F319nhn1kuprh9164741g.png" alt=" " width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker buildx build -t test-auto-create --platform=linux/amd64 .

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com

docker tag 3413614e55cd xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test-auto-create:latest

docker push xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test-auto-create:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I verified this by running the &lt;code&gt;aws ecr describe-repositories&lt;/code&gt; command before and after. You should be able to see that the ECR is created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3a4,17
&amp;gt;             "repositoryArn": "arn:aws:ecr:us-west-2:xxxxxxxxxxxx:repository/test-auto-create",
&amp;gt;             "registryId": "xxxxxxxxxxxx",
&amp;gt;             "repositoryName": "test-auto-create",
&amp;gt;             "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/test-auto-create",
&amp;gt;             "createdAt": "2025-12-21T12:39:57.362000+09:00",
&amp;gt;             "imageTagMutability": "IMMUTABLE",
&amp;gt;             "imageScanningConfiguration": {
&amp;gt;                 "scanOnPush": false
&amp;gt;             },
&amp;gt;             "encryptionConfiguration": {
&amp;gt;                 "encryptionType": "AES256"
&amp;gt;             }
&amp;gt;         },
&amp;gt;         {
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;ECR is also automatically created in the pull-through cache, which should make it easier to create pull cache repositories from ECR public or Docker Hub.&lt;/p&gt;

</description>
      <category>community</category>
      <category>aws</category>
      <category>ecr</category>
    </item>
    <item>
      <title>We want to achieve this configuration using only an Egress-only internet gateway with IPv6</title>
      <dc:creator>Soushi Hiruta</dc:creator>
      <pubDate>Sun, 14 Dec 2025 09:44:56 +0000</pubDate>
      <link>https://dev.to/shiruta/we-want-to-achieve-this-configuration-using-only-an-egress-only-internet-gateway-with-ipv6-3f87</link>
      <guid>https://dev.to/shiruta/we-want-to-achieve-this-configuration-using-only-an-egress-only-internet-gateway-with-ipv6-3f87</guid>
      <description>&lt;p&gt;When communicating externally from an IPv4 environment, it is generally considered standard to do so via a NAT Gateway. Since NAT Gateways incur charges based on traffic volume, we want to utilize IPv6 wherever possible.&lt;/p&gt;

&lt;p&gt;Even Interface-type VPCEndpoints can add up to significant costs over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Created with VPCv2 constructs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;import * as cdk from 'aws-cdk-lib';&lt;/span&gt;
&lt;span class="s"&gt;import { Construct } from 'constructs';&lt;/span&gt;
&lt;span class="s"&gt;import { SubnetType, CfnEIP, CfnSubnet } from 'aws-cdk-lib/aws-ec2';&lt;/span&gt;
&lt;span class="s"&gt;import  * as aws_ec2 from '@aws-cdk/aws-ec2-alpha';&lt;/span&gt;
&lt;span class="s"&gt;import { IpAddressType } from 'aws-cdk-lib/aws-elasticloadbalancingv2';&lt;/span&gt;
&lt;span class="s"&gt;import { AvailabilityZoneRebalancing } from 'aws-cdk-lib/aws-ecs';&lt;/span&gt;


&lt;span class="s"&gt;export class VPCSubnet extends Construct {&lt;/span&gt;
    &lt;span class="s"&gt;constructor(scope&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Construct, id&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string) {&lt;/span&gt;
        &lt;span class="s"&gt;super(scope, id);&lt;/span&gt;

        &lt;span class="s"&gt;const myVpc = new aws_ec2.VpcV2(this, 'Vpc', {&lt;/span&gt;
          &lt;span class="s"&gt;primaryAddressBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws_ec2.IpAddresses.ipv4('10.1.0.0/16'),&lt;/span&gt;
          &lt;span class="s"&gt;vpcName&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;vpc-Develop-Network'&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
         &lt;span class="na"&gt;secondaryAddressBlocks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;aws_ec2.IpAddresses.amazonProvidedIpv6(&lt;/span&gt;&lt;span class="pi"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;cidrBlockName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AmazonProvided'&lt;/span&gt;
          &lt;span class="pi"&gt;}&lt;/span&gt;&lt;span class="nv"&gt;)&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="err"&gt;        }&lt;/span&gt;&lt;span class="s"&gt;);&lt;/span&gt;

        &lt;span class="s"&gt;// Internet Gateway for Public Subnet&lt;/span&gt;
        &lt;span class="s"&gt;const igw = new aws_ec2.InternetGateway(this, 'IGW', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;// Egress-Only Internet Gateway for IPv6&lt;/span&gt;
       &lt;span class="s"&gt;const eigw = new aws_ec2.EgressOnlyInternetGateway(this, 'EIGW', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;// Public Subnets (Multi-AZ)&lt;/span&gt;
        &lt;span class="s"&gt;const publicRouteTable = new aws_ec2.RouteTable(this, 'PublicRouteTable', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;publicRouteTable.addRoute('PublicIGWRoute', '0.0.0.0/0', { gateway&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;igw });&lt;/span&gt;

        &lt;span class="s"&gt;const publicSubnetAZ1Name = cdk.Fn.join('', ['sub-public-', cdk.Fn.select(0, cdk.Fn.getAzs())]);&lt;/span&gt;
        &lt;span class="s"&gt;const publicSubnetAZ1 = new aws_ec2.SubnetV2(this, 'PublicSubnetAZ1', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc,&lt;/span&gt;
          &lt;span class="s"&gt;subnetName&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publicSubnetAZ1Name,&lt;/span&gt;
          &lt;span class="s"&gt;availabilityZone&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdk.Fn.select(0, cdk.Fn.getAzs()),&lt;/span&gt;
          &lt;span class="s"&gt;ipv4CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr('10.1.0.0/24'),&lt;/span&gt;
          &lt;span class="s"&gt;//ipv6CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr(cdk.Fn.select(0, cdk.Fn.cidr(cdk.Fn.select(0, myVpc.ipv6CidrBlocks), 4, '64'))),&lt;/span&gt;
          &lt;span class="s"&gt;subnetType&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SubnetType.PUBLIC,&lt;/span&gt;
          &lt;span class="s"&gt;routeTable&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publicRouteTable&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;// Explicitly set Name tag&lt;/span&gt;
        &lt;span class="s"&gt;const cfnPublicSubnetAZ1 = publicSubnetAZ1.node.defaultChild as CfnSubnet;&lt;/span&gt;
        &lt;span class="s"&gt;cdk.Tags.of(cfnPublicSubnetAZ1).add('Name', publicSubnetAZ1Name);&lt;/span&gt;

        &lt;span class="s"&gt;const publicSubnetAZ2Name = cdk.Fn.join('', ['sub-public-', cdk.Fn.select(1, cdk.Fn.getAzs())]);&lt;/span&gt;
        &lt;span class="s"&gt;const publicSubnetAZ2 = new aws_ec2.SubnetV2(this, 'PublicSubnetAZ2', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc,&lt;/span&gt;
          &lt;span class="s"&gt;subnetName&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publicSubnetAZ2Name,&lt;/span&gt;
          &lt;span class="s"&gt;availabilityZone&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdk.Fn.select(1, cdk.Fn.getAzs()),&lt;/span&gt;
          &lt;span class="s"&gt;ipv4CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr('10.1.1.0/24'),&lt;/span&gt;
          &lt;span class="s"&gt;//ipv6CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr(cdk.Fn.select(1, cdk.Fn.cidr(cdk.Fn.select(0, myVpc.ipv6CidrBlocks), 4, '64'))),&lt;/span&gt;
          &lt;span class="s"&gt;subnetType&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SubnetType.PUBLIC,&lt;/span&gt;
          &lt;span class="s"&gt;routeTable&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publicRouteTable&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;// Explicitly set Name tag&lt;/span&gt;
        &lt;span class="s"&gt;const cfnPublicSubnetAZ2 = publicSubnetAZ2.node.defaultChild as CfnSubnet;&lt;/span&gt;
        &lt;span class="s"&gt;cdk.Tags.of(cfnPublicSubnetAZ2).add('Name', publicSubnetAZ2Name);&lt;/span&gt;

        &lt;span class="s"&gt;// Elastic IP for NAT Gateway&lt;/span&gt;
       &lt;span class="s"&gt;// const eip = new CfnEIP(this, 'NatEIP', {&lt;/span&gt;
       &lt;span class="s"&gt;//   domain&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;vpc'&lt;/span&gt;
       &lt;span class="s"&gt;// });&lt;/span&gt;

        &lt;span class="s"&gt;// NAT Gateway in Public Subnet&lt;/span&gt;
      &lt;span class="s"&gt;//  const natGateway = new aws_ec2.NatGateway(this, 'NatGateway', {&lt;/span&gt;
      &lt;span class="s"&gt;//    subnet&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publicSubnetAZ1,&lt;/span&gt;
      &lt;span class="s"&gt;//    allocationId&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eip.attrAllocationId&lt;/span&gt;
      &lt;span class="s"&gt;//  });&lt;/span&gt;

        &lt;span class="s"&gt;// Private Subnets (Multi-AZ) with NAT Gateway&lt;/span&gt;
        &lt;span class="s"&gt;const privateRouteTable = new aws_ec2.RouteTable(this, 'PrivateRouteTable', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

     &lt;span class="s"&gt;//  privateRouteTable.addRoute('PrivateNatRoute', '0.0.0.0/0', { gateway&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;natGateway });&lt;/span&gt;
       &lt;span class="s"&gt;privateRouteTable.addRoute('PrivateEIGWRoute', '::/0', { gateway&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eigw });&lt;/span&gt;

        &lt;span class="s"&gt;const privateSubnetAZ1Name = cdk.Fn.join('', ['sub-private-', cdk.Fn.select(0, cdk.Fn.getAzs())]);&lt;/span&gt;
        &lt;span class="s"&gt;const privateSubnetAZ1 = new aws_ec2.SubnetV2(this, 'PrivateSubnetAZ1', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc,&lt;/span&gt;
          &lt;span class="s"&gt;subnetName&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;privateSubnetAZ1Name,&lt;/span&gt;
          &lt;span class="s"&gt;availabilityZone&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdk.Fn.select(0, cdk.Fn.getAzs()),&lt;/span&gt;
          &lt;span class="s"&gt;ipv4CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr('10.1.2.0/24'),&lt;/span&gt;
          &lt;span class="s"&gt;ipv6CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr(cdk.Fn.select(2, cdk.Fn.cidr(cdk.Fn.select(0, myVpc.ipv6CidrBlocks), 4, '64'))),&lt;/span&gt;
          &lt;span class="s"&gt;subnetType&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SubnetType.PRIVATE_WITH_EGRESS,&lt;/span&gt;
          &lt;span class="s"&gt;routeTable&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;privateRouteTable&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;// Explicitly set Name tag&lt;/span&gt;
        &lt;span class="s"&gt;const cfnPrivateSubnetAZ1 = privateSubnetAZ1.node.defaultChild as CfnSubnet;&lt;/span&gt;
        &lt;span class="s"&gt;cdk.Tags.of(cfnPrivateSubnetAZ1).add('Name', privateSubnetAZ1Name);&lt;/span&gt;

        &lt;span class="s"&gt;const privateSubnetAZ2Name = cdk.Fn.join('', ['sub-private-', cdk.Fn.select(1, cdk.Fn.getAzs())]);&lt;/span&gt;
        &lt;span class="s"&gt;const privateSubnetAZ2 = new aws_ec2.SubnetV2(this, 'PrivateSubnetAZ2', {&lt;/span&gt;
          &lt;span class="s"&gt;vpc&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myVpc,&lt;/span&gt;
          &lt;span class="s"&gt;subnetName&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;privateSubnetAZ2Name,&lt;/span&gt;
          &lt;span class="s"&gt;availabilityZone&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cdk.Fn.select(1, cdk.Fn.getAzs()),&lt;/span&gt;
          &lt;span class="s"&gt;ipv4CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr('10.1.3.0/24'),&lt;/span&gt;
          &lt;span class="s"&gt;ipv6CidrBlock&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;new aws_ec2.IpCidr(cdk.Fn.select(3, cdk.Fn.cidr(cdk.Fn.select(0, myVpc.ipv6CidrBlocks), 4, '64'))),&lt;/span&gt;
          &lt;span class="s"&gt;subnetType&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SubnetType.PRIVATE_WITH_EGRESS,&lt;/span&gt;
          &lt;span class="s"&gt;routeTable&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;privateRouteTable&lt;/span&gt;
        &lt;span class="s"&gt;});&lt;/span&gt;

        &lt;span class="s"&gt;// Explicitly set Name tag&lt;/span&gt;
        &lt;span class="s"&gt;const cfnPrivateSubnetAZ2 = privateSubnetAZ2.node.defaultChild as CfnSubnet;&lt;/span&gt;
        &lt;span class="s"&gt;cdk.Tags.of(cfnPrivateSubnetAZ2).add('Name', privateSubnetAZ2Name);&lt;/span&gt;

    &lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verifying IPv6 Connectivity with Lambda
&lt;/h2&gt;

&lt;p&gt;Confirmed in VPC Lambda with "Allow IPv6 traffic for dual-stack subnets" enabled&lt;/p&gt;

&lt;p&gt;This is a simple function that retrieves the source IPv6 address accessed from Lambda via ifconfig.me.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    http://ifconfig.me/ 
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="c1"&gt;# requestifconfig.me 
&lt;/span&gt;        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;http://ifconfig.me/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ip_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Successfully retrieved IP address&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ip_address&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ip_address&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URLError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# network error
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Error retrieving IP address&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# other error
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Unexpected error occurred&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;# for local test
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# test event
&lt;/span&gt;    &lt;span class="n"&gt;test_event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;test_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lambda_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test_event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="sb"&gt;``&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;bash&lt;/span&gt;
&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;statusCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;Successfully retrieved IP address&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;ip_address&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;2600:1f13:94:1a02:ef65:ac4:50ab:5e1&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  AWS Service
&lt;/h2&gt;

&lt;p&gt;use_dualstack_endpoint True&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/aws-ipv6-support.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/vpc/latest/userguide/aws-ipv6-support.html&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  S3
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
        my_config = Config(
            use_dualstack_endpoint=True,
            retries={'max_attempts': 3, 'mode': 'standard'}
        )

        bucket_name = ''
        try:
            s3_resource = boto3.resource("s3",config=my_config)
            buckets = list(s3_resource.buckets.all())
            for bucket in buckets:
                bucket_name = bucket.name
                logger.info(bucket_name)

        except ClientError:
            logger.exception("Couldn't get buckets.")


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;S3 Bucket Get Success&lt;/p&gt;

&lt;h3&gt;
  
  
  DynamoDB
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

try:
            client = boto3.client('dynamodb',config=my_config)
            response = client.get_item(
                TableName='testTable',
                Key={
                    'id': {
                        'S': '1'
                    },
                }
            )
            print(response['Item'])


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  S3 Vectors
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
        try:

            bedrock = boto3.client("bedrock-runtime");
            client = boto3.client('s3vectors',config=my_config)
            response = bedrock.invoke_model(
                modelId="amazon.titan-embed-text-v2:0",
                body=json.dumps({"inputText": 'サンプル'})
            )

            # Extract embedding from response.
            model_response = json.loads(response["body"].read())
            embedding = model_response["embedding"]

            response = client.query_vectors(
                vectorBucketName='my-s3-vector-bucket',
                indexName='my-s3-vector-index',
                topK=3,
                queryVector={
                    'float32': embedding
                },
                returnMetadata=True,
                returnDistance=True
            )
            print(json.dumps(response["vectors"], indent=2))
        except ClientError:
            logger.exception("")


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Bedrock Runtime
&lt;/h3&gt;

&lt;p&gt;dualstack endpoint no support&lt;/p&gt;
&lt;h3&gt;
  
  
  ECS
&lt;/h3&gt;

&lt;p&gt;ECS Fargate prioritizes IPv4 by default, so it attempts to connect via IPv4 even in IPv6 dual-stack environments.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
ResourceInitializationError: unable to pull secrets or registry auth: The task 
cannot pull registry auth from Amazon ECR: There is a connection issue between the 
task and Amazon ECR. Check your task network configuration. operation error ECR: 
GetAuthorizationToken, exceeded maximum number of attempts, 3, https response error 
StatusCode: 0, RequestID: , request send failed, Post 
"https://api.ecr.us-west-2.amazonaws.com/": dial tcp 34.223.26.183:443: i/o timeout


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/aws/containers-roadmap/issues/2641" rel="noopener noreferrer"&gt;https://github.com/aws/containers-roadmap/issues/2641&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  EKS Kubernetes
&lt;/h2&gt;

&lt;p&gt;The ECR dualstack endpoint exists, so images can be pulled via the Egress out internet Gateway.&lt;/p&gt;

&lt;p&gt;Initially, there was an issue where pulling was not possible.&lt;/p&gt;

&lt;p&gt;Kubernetes supports IPv4/IPv6 dualstack, but EKS can only be configured as an IPv6-only cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/best-practices/ipv6.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/eks/latest/best-practices/ipv6.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;More services are becoming IPv6-capable. However, since some services still cannot use it, the current approach is to use VPC Endpoints alongside them.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>Amazon Bedrock AgentCore Frist impression</title>
      <dc:creator>Soushi Hiruta</dc:creator>
      <pubDate>Mon, 21 Jul 2025 02:27:46 +0000</pubDate>
      <link>https://dev.to/shiruta/amazon-bedrock-agentcore-frist-impression-lch</link>
      <guid>https://dev.to/shiruta/amazon-bedrock-agentcore-frist-impression-lch</guid>
      <description>&lt;p&gt;Ths blog is English translation of The following blog.&lt;br&gt;
&lt;a href="https://zenn.dev/clouddevcode/articles/53713a1bd72fb7" rel="noopener noreferrer"&gt;https://zenn.dev/clouddevcode/articles/53713a1bd72fb7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We tried out a service that allows you to deploy Amazon Bedrock AgentCore, an AI agent announced at AWS Summit NYC, in a managed environment using a sample application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/bedrock/agentcore/" rel="noopener noreferrer"&gt;https://aws.amazon.com/bedrock/agentcore/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  StrandsAgent Sample Application
&lt;/h1&gt;

&lt;p&gt;This is the code for using Knowledge MCP from Strands Agnent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from strands import Agent
from mcp.client.streamable_http import streamablehttp_client
from strands.tools.mcp import MCPClient
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp


app = BedrockAgentCoreApp()
bedrock_model = BedrockModel(
   model_id="us.anthropic.claude-sonnet-4-20250514-v1:0"
)

@app.entrypoint
async def invoke(payload):

    streamable_http_mcp_client = MCPClient(lambda: streamablehttp_client(
       "https://knowledge-mcp.global.api.aws")
    )
    # Create an agent with MCP tools
    with streamable_http_mcp_client:
       # Get the tools from the MCP server
       tools = streamable_http_mcp_client.list_tools_sync()
       agent = Agent(model=bedrock_model,tools=tools)
       user_message = payload.get("prompt","hello")
       stream = agent.stream_async(user_message)
       async for event in stream:
         print(event)
         yield(event)
    #       

if __name__ == "__main__":
    app.run()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Deploying to Bedrock AgentCore
&lt;/h1&gt;

&lt;p&gt;When deploying a new revision with the agentcore run described later, the latest tag will be overwritten, so create an ECR, but make sure to set Tag immutability to Mutable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uv run agentcore configure --entrypoint main.py -er $IAM_ROLE_ARN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uv run agentcore run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;:::message&lt;br&gt;
When deploying AgentCore, the following error occurred. This was caused by the installed boto3 not being compatible with Bedrock AgentCore. Please upgrade boto3.&lt;br&gt;
Launch failed: Unknown service: 'bedrock-agentcore-control'. Valid service&lt;br&gt;
:::&lt;/p&gt;

&lt;p&gt;AgentCore currently only supports the ARM architecture, and there may be issues when building from an Intel architecture environment.&lt;br&gt;
You will need to set up a multi-platform build environment using QEMU.&lt;br&gt;
&lt;a href="https://qiita.com/hayao_k/items/aed1b7062ba403d70a12" rel="noopener noreferrer"&gt;https://qiita.com/hayao_k/items/aed1b7062ba403d70a12&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It seems that this can be addressed using CodeBuild, but as mentioned in the issue below, it is not yet supported in 0.1.0.&lt;br&gt;
&lt;a href="https://github.com/aws/bedrock-agentcore-starter-toolkit/pull/45" rel="noopener noreferrer"&gt;agentcore run --codebuild&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Frontend
&lt;/h1&gt;

&lt;p&gt;By calling invoke_agent_runtime from Streamlint, you can easily create a chat UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/minorun365/bedrock-agentcore-sample/blob/main/frontend/client.py" rel="noopener noreferrer"&gt;https://github.com/minorun365/bedrock-agentcore-sample/blob/main/frontend/client.py&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Logging
&lt;/h1&gt;

&lt;p&gt;AgentCore logs are output only to Cloudwatch Logs.&lt;/p&gt;

&lt;p&gt;All logs from the prompt and Tool use process are also recorded.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "resource": {
        "attributes": {
            "deployment.environment.name": "bedrock-agentcore:default",
            "aws.local.service": "main.DEFAULT",
            "service.name": "main.DEFAULT",
            "cloud.region": "us-west-2",
            "aws.log.stream.names": "runtime-logs",
            "telemetry.sdk.name": "opentelemetry",
            "aws.service.type": "gen_ai_agent",
            "telemetry.sdk.language": "python",
            "cloud.provider": "aws",
            "cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:xxxxxxxxxxxx:runtime/main-rVLdVz8WIg/runtime-endpoint/DEFAULT:DEFAULT",
            "aws.log.group.names": "/aws/bedrock-agentcore/runtimes/main-rVLdVz8WIg-DEFAULT",
            "telemetry.sdk.version": "1.33.1",
            "cloud.platform": "aws_bedrock_agentcore",
            "telemetry.auto.version": "0.1.6-aws"
        }
    },
    "scope": {
        "name": "opentelemetry.instrumentation.botocore.bedrock-runtime",
        "schemaUrl": "https://opentelemetry.io/schemas/1.30.0"
    },
    "timeUnixNano": 1752890294921734500,
    "observedTimeUnixNano": 1752890294921745001,
    "severityNumber": 9,
    "severityText": "",
    "body": {
        "content": [
            {
                "text": "describe best practice about vpc lattice"
            }
        ]
    },
    "attributes": {
        "event.name": "gen_ai.user.message",
        "gen_ai.system": "aws.bedrock"
    },
    "flags": 1,
    "traceId": "687afbb1fd5cc8569d31603b101fdc6c",
    "spanId": "a79e2e26dfb98b99"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition, OpenTelemetry trace information is also recorded in Cloudwatch Custom Metrics.&lt;br&gt;
Since Cloudwatch Agent does not support histogram metrics, response times are not supported.&lt;br&gt;
We are also concerned about the cost of writing large amounts of data to custom metrics.&lt;br&gt;
We hope that Amazon will support Amazon managed for prometheus in the future.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "_aws": {
        "Timestamp": 1752883420402,
        "CloudWatchMetrics": [
            {
                "Namespace": "bedrock-agentcore",
                "Dimensions": [
                    [
                        "http.scheme",
                        "http.host",
                        "http.flavor",
                        "http.method",
                        "http.server_name"
                    ]
                ],
                "Metrics": [
                    {
                        "Name": "http.server.active_requests"
                    }
                ]
            }
        ]
    },
    "Version": "1",
    "otel.resource.telemetry.sdk.language": "python",
    "otel.resource.telemetry.sdk.name": "opentelemetry",
    "otel.resource.telemetry.sdk.version": "1.33.1",
    "otel.resource.service.name": "main.DEFAULT",
    "otel.resource.aws.log.group.names": "/aws/bedrock-agentcore/runtimes/main-rVLdVz8WIg-DEFAULT",
    "otel.resource.aws.log.stream.names": "runtime-logs",
    "otel.resource.deployment.environment.name": "bedrock-agentcore:default",
    "otel.resource.cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:xxxxxxxxxxxx:runtime/main-rVLdVz8WIg/runtime-endpoint/DEFAULT:DEFAULT",
    "otel.resource.cloud.platform": "aws_bedrock_agentcore",
    "otel.resource.cloud.provider": "aws",
    "otel.resource.cloud.region": "us-west-2",
    "otel.resource.telemetry.auto.version": "0.1.6-aws",
    "otel.resource.aws.local.service": "main.DEFAULT",
    "otel.resource.aws.service.type": "gen_ai_agent",
    "http.server.active_requests": 0,
    "http.scheme": "http",
    "http.host": "127.0.0.1:8080",
    "http.flavor": "1.1",
    "http.method": "GET",
    "http.server_name": "localhost:8080"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ping requests are sent every minute, so the above trace information is buried.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INFO:     127.0.0.1:40694 - "GET /ping HTTP/1.1" 200 OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>bedrock</category>
      <category>mcp</category>
    </item>
    <item>
      <title>I tried Strands Agent</title>
      <dc:creator>Soushi Hiruta</dc:creator>
      <pubDate>Sun, 18 May 2025 08:05:50 +0000</pubDate>
      <link>https://dev.to/shiruta/i-tried-strands-agent-1ik6</link>
      <guid>https://dev.to/shiruta/i-tried-strands-agent-1ik6</guid>
      <description>&lt;p&gt;One day before AWS release Strands Agent.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/opensource/introducing-strands-agents-an-open-source-ai-agents-sdk/" rel="noopener noreferrer"&gt;https://aws.amazon.com/blogs/opensource/introducing-strands-agents-an-open-source-ai-agents-sdk/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like OpenAI Agent SDK and Google's Agent Development Kit, you can easily create agents.&lt;br&gt;
model_id property omit, Claude 3.7 Sonnet v1 use on us-west-2 (Oregon region). &lt;/p&gt;
&lt;h2&gt;
  
  
  module install
&lt;/h2&gt;

&lt;p&gt;We use uv to manage Python module versions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;uv init
uv add strands-agents strands-agents-tools boto3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Following code is call mcp-server-fetch MCP Server&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Sample
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from strands import Agent
from mcp import stdio_client, StdioServerParameters
from strands.tools.mcp import MCPClient
from strands.models import BedrockModel
import boto3

def main():
    session = boto3.Session(
       region_name='us-west-2',
    )

    bedrock_model = BedrockModel(
      model_id="us.anthropic.claude-3-5-haiku-20241022-v1:0",
      boto_session=session
    )

    stdio_mcp_client = MCPClient(lambda: stdio_client(
        StdioServerParameters(command="uvx", args=["mcp-server-fetch"])
    ))

    # Create an agent with MCP tools
    with stdio_mcp_client:
       # Get the tools from the MCP server
       tools = stdio_mcp_client.list_tools_sync()

       # Create an agent with these tools
       agent = Agent(model=bedrock_model,tools=tools)
       response = agent(" https://blog.generative-agents.co.jp/entry/2025-langchain-interrupt-day2-keynote についてまとめて")
       print(response)

if __name__ == "__main__":
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Response
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'll fetch the content of that URL and summarize it for you.
Tool #1: fetch


申し訳ありません。記事の内容が途中で切れてしまいました。しかし、これまでの内容から、LangChain InterruptイベントのDay 2キーノートについて、主要なポイントをまとめます：

### キーノート概要：Harrison Chase氏によるLangChainの未来ビジョン

#### 1. LangChainの歴史と目的
- オープンソースプロジェクトとして始まり、AIプロトタイプ構築支援から企業へ進化
- ミッション：「インテリジェントエージェントをユビキタスにする」

#### 2. エージェント構築の核となる要素
- プロンプティング
- エンジニアリング
- プロダクトセンス・プロダクトスキル
- 機械学習（特にEvals）

#### 3. 現在のエージェントに関する3つの信念

##### a) 多様なモデルへの依存
- 異なるモデルの長所・短所を活かす
- モデル選択の自由度を提供

##### b) 信頼性の高いエージェントのためのコンテキスト制御
- LangGraphによるエージェントオーケストレーション
- ローレベルでの柔軟なエージェントフロー構築

##### c) エージェント構築はチームスポーツ
- LangSmithによる協業プラットフォーム提供
- オブザーバビリティ、評価、プロンプトエンジニアリングの統合

#### 4. 未来のエージェント像と新発表

##### a) AIオブザーバビリティの革新
- エージェント特有のインサイト提供
- ツール使用、軌跡の追跡

##### b) エージェントビルダーの民主化
- LangGraph Pre-built
- LangGraph Studio v2
- Open Agent Platform

##### c) エージェントデプロイメントの課題解決
- LangGraph Platform GAリリース
- 長時間実行、ステートフル、不安定な出力への対応

#### 5. 2025年の展望
- 多くのエージェントが実稼働を開始
- 「エージェントエンジニア」という新しい職種の確立

Harrison Chase氏は、2025年がエージェント元年となり、インテリジェントエージェントが広く普及し始める年になると力強く述べました。

申し訳ありません。記事の内容が途中で切れてしまいました。しかし、これまでの内容から、LangChain InterruptイベントのDay 2キーノートについて、主要なポイントをまとめます：

### キーノート概要：Harrison Chase氏によるLangChainの未来ビジョン

#### 1. LangChainの歴史と目的
- オープンソースプロジェクトとして始まり、AIプロトタイプ構築支援から企業へ進化
- ミッション：「インテリジェントエージェントをユビキタスにする」

#### 2. エージェント構築の核となる要素
- プロンプティング
- エンジニアリング
- プロダクトセンス・プロダクトスキル
- 機械学習（特にEvals）

#### 3. 現在のエージェントに関する3つの信念

##### a) 多様なモデルへの依存
- 異なるモデルの長所・短所を活かす
- モデル選択の自由度を提供

##### b) 信頼性の高いエージェントのためのコンテキスト制御
- LangGraphによるエージェントオーケストレーション
- ローレベルでの柔軟なエージェントフロー構築

##### c) エージェント構築はチームスポーツ
- LangSmithによる協業プラットフォーム提供
- オブザーバビリティ、評価、プロンプトエンジニアリングの統合

#### 4. 未来のエージェント像と新発表

##### a) AIオブザーバビリティの革新
- エージェント特有のインサイト提供
- ツール使用、軌跡の追跡

##### b) エージェントビルダーの民主化
- LangGraph Pre-built
- LangGraph Studio v2
- Open Agent Platform

##### c) エージェントデプロイメントの課題解決
- LangGraph Platform GAリリース
- 長時間実行、ステートフル、不安定な出力への対応

#### 5. 2025年の展望
- 多くのエージェントが実稼働を開始
- 「エージェントエンジニア」という新しい職種の確立

Harrison Chase氏は、2025年がエージェント元年となり、インテリジェントエージェントが広く普及し始める年になると力強く述べました。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It seems that only Claude 3.5 Sonnet v2 does not read the tool.Not 100% reproducible&lt;/p&gt;

&lt;p&gt;The follwing response by using Cluade 3.5 Sonnet v2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;このURLが存在していないため、そのブログ投稿にアクセスすることはできません。URLのドメイン "generative-agents.co.jp" は架空のものに見え、また2025年の日付を含んでいることから、このURLは実際には存在しないものと思われます。

実在するブログ記事やウェブサイトについてまとめてほしい場合は、有効なURLを共有していただければと思います。アクセス可能な記事であれば、その内容を要約してお伝えすることができます。このURLが存在していないため、そのブログ投稿にアクセスすることはできません。URLのドメイン "generative-agents.co.jp" は架空のものに見え、また2025年の日付を含んでいることから、このURLは実際には存在しないものと思われます。

実在するブログ記事やウェブサイトについてまとめてほしい場合は、有効なURLを共有していただければと思います。アクセス可能な記事であれば、その内容を要約してお伝えすることができます。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strands Agent use Gemini Model  and so on by using LiteLLMModel.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>bedrock</category>
    </item>
    <item>
      <title>[AWS] EKS Auto Mode Node lifecycle [EKS]</title>
      <dc:creator>Soushi Hiruta</dc:creator>
      <pubDate>Thu, 08 May 2025 23:16:15 +0000</pubDate>
      <link>https://dev.to/shiruta/aws-eks-auto-mode-node-lifecycle-eks-1jgk</link>
      <guid>https://dev.to/shiruta/aws-eks-auto-mode-node-lifecycle-eks-1jgk</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17w3ir50fez7dwievjij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17w3ir50fez7dwievjij.png" alt="Image description" width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Node Lifecycle
&lt;/h2&gt;

&lt;p&gt;nodes launched by EKS Auto Mode have a maximum lifetime of 21 days (which you can reduce), after which they are automatically replaced with new nodes. &lt;/p&gt;

&lt;p&gt;Terminates instances after 336 hours by default&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/create-node-pool.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/eks/latest/userguide/create-node-pool.html&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      spec:
        expireAfter: 336h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The upper use Node disruption.&lt;br&gt;
&lt;a href="https://karpenter.sh/docs/concepts/disruption/" rel="noopener noreferrer"&gt;https://karpenter.sh/docs/concepts/disruption/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Karpenter automatically discovers disruptable nodes and spins up replacements when needed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Concept of Disruption Controller
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Deciding the priority of interrupted nodes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interruption node checks disruption budget&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;spec.disruption.budgets. If undefined, Karpenter will default to one budget with nodes: 10%&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  spec:
    disruption:
      budgets:
      - nodes: 10%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;The need for replacement nodes
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        taints:
        - effect: NoSchedule
          key: CriticalAddonsOnly
        terminationGracePeriod: 24h0m0s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By assigning CriticalAddonsOnly as a taint to a node, you can prevent Pods other than system Pods from being deployed to that node.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wait until the replacement node starts up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Delete the node(s) and wait for the Termination Controller to gracefully shutdown the node(s).&lt;/p&gt;

&lt;p&gt;Consolidation is configured by consolidationPolicy and consolidateAfter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  spec:
    disruption:
      budgets:
      - nodes: 10%
      consolidateAfter: 30s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can be used in cases where ECS application spin-up is slow, to delay node replacement to a certain extent.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Multi Node Consolidation - Try to delete two or more nodes in parallel, possibly launching a single replacement whose price is lower than that of all nodes being removed&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Node resource efficiency is automatically adjusted by adjusting the node instance type.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Using preferred anti-affinity and topology spreads can reduce the effectiveness of consolidation&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When using anti-affinity or topology, this setting takes precedence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If interruption-handling is enabled, Karpenter will watch for upcoming involuntary interruption events that would cause disruption to your workloads. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is advisable to monitor interrupt events.&lt;/p&gt;

&lt;p&gt;Node Auto Repair is a feature that automatically identifies and replaces unhealthy nodes in your cluster,but node repair feature is alpha feature.&lt;/p&gt;

&lt;p&gt;Since APIs other than GA cannot be enabled with EKS Feature gate, I believe this cannot be used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Custom NodePool
&lt;/h2&gt;

&lt;p&gt;Get Nodepools&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get nodepools  -o yaml &amp;gt; nodepools.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;expireAfter parameter edit&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f nodepools.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The settings will be reflected immediately.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>eks</category>
    </item>
    <item>
      <title>Fargate Spot Capacity rack</title>
      <dc:creator>Soushi Hiruta</dc:creator>
      <pubDate>Sat, 22 Mar 2025 05:17:52 +0000</pubDate>
      <link>https://dev.to/shiruta/fargate-spot-capacity-rack-4ble</link>
      <guid>https://dev.to/shiruta/fargate-spot-capacity-rack-4ble</guid>
      <description>&lt;p&gt;As AWS Community Builder 2025 ( Container category ) First post. &lt;/p&gt;

&lt;p&gt;I am using Fargate ondemand and Fargate Spot together, but&lt;br&gt;
it seems that the resources are running low, and the frequency of Spot interruptions has increased compared to three months ago. I am using it in the Tokyo region.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;service xxxx was unable to place a task. Reason: Capacity is unavailable at this time. Please try again later or in a different availability zone. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Adjusting the grace period when replacing FargateSpot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No base number setting&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Fargate Spot
&lt;/h2&gt;

&lt;p&gt;You can give yourself more time after the SIGKILL event. The default time you have to wait before replacing a spot is 30 seconds, so you can change it to 120 seconds.&lt;br&gt;
Can be set using the stopTimeout in the task definition&lt;/p&gt;

&lt;p&gt;From Sep 6, 2204 Fargate Spot can use in ARM architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2024/09/amazon-ecs-graviton-based-spot-compute-fargate/?nc1=h_ls" rel="noopener noreferrer"&gt;Amazon ECS now supports AWS Graviton-based Spot compute with AWS Fargate&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ECS Capacity Provider
&lt;/h2&gt;

&lt;p&gt;Base&lt;br&gt;
Do not specify the minimum number of tasks for the specified capacity provider. Default: 0&lt;br&gt;
It seems better not to specify this in Spot. Do not specify the minimum number of tasks for the specified capacity provider. Default: 0&lt;/p&gt;

&lt;p&gt;Weight&lt;br&gt;
Set the startup ratio for Capacity Provider&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98jpgp32yq97e082dglb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F98jpgp32yq97e082dglb.png" alt="Image description" width="393" height="137"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  ECS Trouble Shooting
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Checking the occurrence status of FargateSpot
&lt;/h3&gt;

&lt;p&gt;If the following event occurs in EventBridge, it is output to Cloudwatch Logs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source aws.ecs
detail-type ECS Task State Change
stopCode SpotInterruption
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_task_events.html" rel="noopener noreferrer"&gt;Amazon ECS task state change events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use the Metrics filter to set the number of occurrences to a custom metric.&lt;/p&gt;

&lt;p&gt;You can check this on the console, but if the task stops, you won't be able to check it.&lt;br&gt;
Recently, the reason why a task has stopped has started to be displayed in detail, but it disappears, so we recommend that you keep it in Cloudwatch Logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/soushi-hiruta-421556255/" rel="noopener noreferrer"&gt;Linkedln&lt;/a&gt; and check out &lt;a href="https://www.totalsolution.biz/" rel="noopener noreferrer"&gt;my blog&lt;/a&gt; for all my blog posts. Blog content is almost in Japanese.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>awscommunitybuilder</category>
      <category>ecs</category>
    </item>
  </channel>
</rss>
