<?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>Forem: Hector Fernandez CloudparaTodo</title>
    <description>The latest articles on Forem by Hector Fernandez CloudparaTodo (@hectorfernandezdev).</description>
    <link>https://forem.com/hectorfernandezdev</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%2F717314%2F3c7955d3-d7ec-4597-bcb2-7f26a5bdd2e4.png</url>
      <title>Forem: Hector Fernandez CloudparaTodo</title>
      <link>https://forem.com/hectorfernandezdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hectorfernandezdev"/>
    <language>en</language>
    <item>
      <title>IAM Principal Cost Allocation para Amazon Bedrock (Novedad)</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Mon, 13 Apr 2026 07:30:00 +0000</pubDate>
      <link>https://forem.com/aws-espanol/iam-principal-cost-allocation-para-amazon-bedrock-novedad-26cm</link>
      <guid>https://forem.com/aws-espanol/iam-principal-cost-allocation-para-amazon-bedrock-novedad-26cm</guid>
      <description>&lt;p&gt;Hace unos meses inicie una serie de posts sobre como gobernar el uso de IA en AWS. En la primera entrega de esta serie hablamos de cómo dar acceso gobernado a LLMs en AWS desde el día 0: IAM Policies, Guardrails, Inference Profiles y un mecanismo de corte de presupuesto por equipo. Si no la leíste, te recomiendo empezar por ahí.&lt;br&gt;
&lt;a href="https://podcast.hectorfernandez.dev/p/episodio-9-necesito-una-api-key-para" rel="noopener noreferrer"&gt;Podcast: UNA API KEY para LLMs&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Pero había un punto que me quedaba pendiente: &lt;strong&gt;no podíamos saber quién dentro de un equipo estaba generando el consumo&lt;/strong&gt;. Cortábamos al equipo entero, y después había que armar una solución custom con Model Invocation Logging para identificar al responsable.&lt;/p&gt;

&lt;p&gt;AWS acaba de resolver la parte de &lt;strong&gt;visibilidad&lt;/strong&gt; de forma nativa. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿Bloquear todo el acceso?&lt;/strong&gt; Eso sigue siendo otro tema, y creo que de forma nativa sería complejo de implementar un proxy (por ahora).&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Qué anunció AWS?
&lt;/h2&gt;

&lt;p&gt;El 8 de Abril de 2026, Amazon Bedrock lanzó soporte para &lt;strong&gt;asignación de costos por IAM principal&lt;/strong&gt;, hablando en criollo: por usuario o rol de IAM, directamente en Cost Explorer y en CUR 2.0 (Cost and Usage Report).&lt;/p&gt;

&lt;p&gt;¡BIEN! Ahora podemos ver el costo desglosado de Bedrock en Cost Explorer sin muchas vueltas. &lt;br&gt;
&lt;a href="https://aws.amazon.com/es/about-aws/whats-new/2026/04/bedrock-iam-cost-allocation/" rel="noopener noreferrer"&gt;Anuncio oficial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora, algo que debes tener claro desde ya: esta funcionalidad es de &lt;strong&gt;billing&lt;/strong&gt;, no de enforcement. Los datos llegan a CUR 2.0 y Cost Explorer con &lt;strong&gt;24-48 horas de latencia&lt;/strong&gt;. Eso significa que puedes saber &lt;em&gt;quién&lt;/em&gt; gastó &lt;em&gt;cuánto&lt;/em&gt;, pero &lt;strong&gt;no puedes bloquear el acceso en tiempo real con esta data&lt;/strong&gt;. Para eso, el Budget Cut Lambda de la Parte 1 sigue siendo necesario.&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Qué cambia respecto a la Parte 1 que habíamos hablado?
&lt;/h2&gt;

&lt;p&gt;En la primera publicación usamos &lt;strong&gt;Inference Profiles con tags&lt;/strong&gt; (&lt;code&gt;CostCenter&lt;/code&gt;, &lt;code&gt;Team&lt;/code&gt;) para atribuir costos por equipo. Eso sigue siendo válido para agrupar por carga de trabajo. Pero ahora hay una capa adicional: la &lt;strong&gt;identidad del que hace la llamada&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mecanismo&lt;/th&gt;
&lt;th&gt;Granularidad&lt;/th&gt;
&lt;th&gt;¿Qué resuelve?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inference Profile + Resource Tags&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Por equipo / carga de trabajo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"¿Cuánto gastó el equipo backend en Haiku?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;IAM Principal Cost Allocation&lt;/strong&gt; (NUEVO)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Por usuario / rol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"¿Cuánto gastó &lt;code&gt;user@empresa.com&lt;/code&gt; en todos los modelos?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Juntando todo esto, tenemos: &lt;strong&gt;quién&lt;/strong&gt; gastó &lt;strong&gt;cuánto&lt;/strong&gt;, en &lt;strong&gt;qué modelo&lt;/strong&gt;, para &lt;strong&gt;qué equipo&lt;/strong&gt;. Pero recuerda: esta foto la ves con &lt;strong&gt;24-48h de retraso&lt;/strong&gt;. Es para análisis y chargeback, no para corte en tiempo real.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pre-requisitos
&lt;/h2&gt;

&lt;p&gt;Todo lo de la Parte 1 más (te invito a leerla)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tags en tus IAM users/roles&lt;/strong&gt; con atributos de negocio (&lt;code&gt;team&lt;/code&gt;, &lt;code&gt;business-unit&lt;/code&gt;, &lt;code&gt;project&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Acceso a la consola de &lt;strong&gt;Billing and Cost Management&lt;/strong&gt; (si es por Organizations, lo haces desde la cuenta management)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CUR 2.0&lt;/strong&gt; habilitado (el CUR legacy no soporta esto)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Paso 1: Taggear los IAM Principals
&lt;/h3&gt;

&lt;p&gt;Si usas SSO, cada Permission Set genera un rol en la cuenta target con formato &lt;code&gt;AWSReservedSSO_{PermissionSetName}_{hash}&lt;/code&gt;. Estos roles se pueden taggear.&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Taggea los roles SSO con atributos de negocio.
Estos tags son los que aparecerán en Cost Explorer y CUR 2.0.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;iam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Mapeo: role SSO -&amp;gt; tags de negocio
&lt;/span&gt;&lt;span class="n"&gt;SSO_ROLES&lt;/span&gt; &lt;span class="o"&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;AWSReservedSSO_BackendDev_a1b2c3d4&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&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;backend&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;business-unit&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;BU-ENG-001&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;department&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;engineering&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;environment&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;development&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWSReservedSSO_FrontendDev_e5f6g7h8&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&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;frontend&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;business-unit&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;BU-ENG-002&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;department&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;engineering&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;environment&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;development&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWSReservedSSO_DataTeam_i9j0k1l2&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&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;data&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;business-unit&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;BU-DATA-001&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;department&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;data-science&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;environment&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;development&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;role_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags_dict&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SSO_ROLES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&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;Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags_dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;

    &lt;span class="n"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tag_role&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RoleName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;role_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tags&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;role_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; taggeado con: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tags_dict&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si además tienen &lt;strong&gt;IAM Users&lt;/strong&gt; (para casos legacy o service accounts), se taggean igual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam tag-user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"superuser-pipeline-sa"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;team,Value&lt;span class="o"&gt;=&lt;/span&gt;data &lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;business-unit,Value&lt;span class="o"&gt;=&lt;/span&gt;BU-DATA-001 &lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;project,Value&lt;span class="o"&gt;=&lt;/span&gt;recommendation-engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota importante de AWS:&lt;/strong&gt; Los tags solo aparecen para activación en la consola de Billing &lt;strong&gt;después de que el principal haya hecho al menos una llamada a Bedrock&lt;/strong&gt;. Si taggeaste un rol pero nadie lo ha usado aún, no vas a verlo en Cost Allocation Tags.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Paso 2: Activar los tags como Cost Allocation Tags
&lt;/h3&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%2F6twri5bir2oihv2b3jte.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%2F6twri5bir2oihv2b3jte.png" alt="Activar allocation tag" width="800" height="283"&gt;&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;Billing and Cost Management Console
    → Cost Organization 
        → Cost Allocation Tags (Etiquetas de asignación de costos)
            → Filtrar por "IAM principal type"
            → Seleccionar: team, business-unit, department
            → Click "Activate"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Después de activarlos, los tags tardan &lt;strong&gt;hasta 24 horas&lt;/strong&gt; en estar disponibles para filtrado en Cost Explorer y CUR.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verificar qué tags están activos via CLI&lt;/span&gt;
aws ce list-cost-allocation-tags &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--status&lt;/span&gt; Active &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag-keys&lt;/span&gt; &lt;span class="s2"&gt;"team"&lt;/span&gt; &lt;span class="s2"&gt;"business-unit"&lt;/span&gt; &lt;span class="s2"&gt;"department"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; &lt;span class="s2"&gt;"iamPrincipal"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 3: Habilitar IAM Principal en CUR 2.0
&lt;/h3&gt;

&lt;p&gt;Si hay un paso para que todo esto funcione, es este. &lt;/p&gt;

&lt;p&gt;Activa la columna &lt;code&gt;line_item_iam_principal&lt;/code&gt; en los reportes de costos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Billing and Cost Management Console
    → Data Exports
        → Create export → Standard data export (CUR 2.0)
            → Additional export content:
                ✅ Include caller identity (IAM principal) allocation data
            → Destino: S3 bucket + Athena integration
        → Save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;¿Qué genera esto?&lt;/strong&gt; Cada línea del CUR 2.0 ahora incluye el ARN exacto del principal que hizo la llamada a Bedrock. Y los tags del principal aparecen con prefijo &lt;code&gt;iamPrincipal/&lt;/code&gt; para no colisionar con resource tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo se ve la data?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  En Cost Explorer: filtrar por equipo/usuario
&lt;/h3&gt;

&lt;p&gt;Una vez activados los tags, Cost Explorer permite agrupar directamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cost Explorer
    → Filtro: Service = "Amazon Bedrock"
    → Group by: Tag → "iamPrincipal/team"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vas a ver algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;iamPrincipal&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;team&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;Costo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;---------------------|------------&lt;/span&gt;
&lt;span class="k"&gt;backend&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$142.30&lt;/span&gt;
&lt;span class="k"&gt;data&lt;/span&gt;                 &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$89.50&lt;/span&gt;
&lt;span class="k"&gt;frontend&lt;/span&gt;             &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$23.10&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;sin&lt;/span&gt; &lt;span class="k"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$5.40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Y si quieres ver quién dentro del equipo backend está consumiendo más? Cambias el Group by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cost Explorer
    → Filtro: Service = "Amazon Bedrock"
    → Filtro: Tag "iamPrincipal/team" = "backend"
    → Group by: Tag → "iamPrincipal/business-unit"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;BONUS&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  (Opcional) CUR 2.0 + Athena: análisis avanzado por usuario individual
&lt;/h3&gt;

&lt;p&gt;Si Cost Explorer no te da suficiente granularidad y necesitas ver &lt;strong&gt;por usuario individual&lt;/strong&gt;, puedes consultar CUR 2.0 directamente con Amazon Athena.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sobre costos de Athena:&lt;/strong&gt; Athena cobra &lt;strong&gt;$5 USD por TB escaneado&lt;/strong&gt; (con el modo on-demand). Para CUR de organizaciones pequeñas/medianas esto suele ser centavos por consulta. Si quieres reducir costos, activa la compresión del CUR (formato Parquet) y particiona por mes. También existe el modo Provisioned Capacity para uso intensivo.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- ¿Quiénes son los top 10 consumers de Bedrock este mes?&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;line_item_iam_principal&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;iam_principal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'iamPrincipal/team'&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;team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'iamPrincipal/business-unit'&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;business_unit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;line_item_product_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line_item_unblended_cost&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;total_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line_item_usage_amount&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;total_usage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;cur_2_0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bedrock_usage&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
    &lt;span class="n"&gt;line_item_product_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'AmazonBedrock'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;MONTH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;billing_period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;MONTH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;CURRENT_DATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;total_cost&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;iam&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;principal&lt;/span&gt;                                          &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;team&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;business&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;unit&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;total&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;cost&lt;/span&gt;
&lt;span class="err"&gt;-------------------------------------------------------+----------+---------------+-----------&lt;/span&gt;
&lt;span class="nv"&gt;arn:aws:sts:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;123456&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;assumed&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;BackendDev&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;javier&lt;/span&gt;&lt;span class="err"&gt;@...&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;backend&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;BU&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;ENG&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$67.30&lt;/span&gt;
&lt;span class="nv"&gt;arn:aws:sts:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;123456&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;assumed&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;DataTeam&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;maria&lt;/span&gt;&lt;span class="err"&gt;@...&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;BU&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;DATA&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$52.10&lt;/span&gt;
&lt;span class="nv"&gt;arn:aws:sts:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;123456&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;assumed&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;BackendDev&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;luis&lt;/span&gt;&lt;span class="err"&gt;@...&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;backend&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;BU&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;ENG&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$41.20&lt;/span&gt;
&lt;span class="err"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin proxies, sin Lambdas, sin CloudTrail scraping: &lt;strong&gt;sabes exactamente que Javier del equipo backend gastó $67.30 este mes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Recuerda que cada ejecución tiene un costo mínimo en Athena, pero para un CUR particionado en Parquet suele ser menos de $0.01 por consulta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap ¿Cómo se complementa con la Parte 1?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Componente&lt;/th&gt;
&lt;th&gt;Parte 1&lt;/th&gt;
&lt;th&gt;Parte 2 (lo nuevo)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;¿Quién puede usar qué modelo?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM Policy per-team&lt;/td&gt;
&lt;td&gt;Sin cambios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;¿Se protege PII?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bedrock Guardrails&lt;/td&gt;
&lt;td&gt;Sin cambios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;¿Cuánto gastó cada equipo?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inference Profile tags → Cost Explorer&lt;/td&gt;
&lt;td&gt;IAM Principal tags → Cost Explorer (más granular)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;¿Cuánto gastó cada usuario?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No disponible&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;line_item_iam_principal&lt;/code&gt; en CUR 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;¿Se corta al exceder presupuesto?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Budget Cut Lambda (per-team, ~10 min)&lt;/td&gt;
&lt;td&gt;⚠️ CUR tiene 24h de delay. &lt;strong&gt;NO sirve para bloquear&lt;/strong&gt;. El Budget Cut Lambda sigue siendo el único mecanismo de corte&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Lo que sigue sin resolver nativamente
&lt;/h3&gt;

&lt;p&gt;Seamos honestos: hay cosas que necesitan un proxy real, y para dar gobierno a la IA es lo mejor que puedes pensar. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corte per-user en tiempo real&lt;/strong&gt;: CUR tiene 24h de delay. Si necesitas cortar a un usuario específico en minutos, necesitas Model Invocation Logging + Lambda + &lt;code&gt;iam:PutRolePolicy&lt;/code&gt; dirigido al session principal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching de respuestas&lt;/strong&gt;: No hay caching nativo de Bedrock. Un proxy como LiteLLM puede cachear respuestas repetitivas y ahorrar costos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-provider routing&lt;/strong&gt;: Si quieres probar OpenAI y Anthropic directamente (no vía Bedrock), necesitas una capa de abstracción&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidad semántica&lt;/strong&gt;: Para ver el árbol de razonamiento de un agente, necesitas OTel + Langfuse. CloudTrail te dice "quién llamó", pero no "por qué razonó así"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La clave es que los tags del &lt;strong&gt;principal&lt;/strong&gt; (quién) y los tags del &lt;strong&gt;recurso&lt;/strong&gt; (qué) se complementan en CUR 2.0. No se pisan porque CUR los distingue con prefijos: &lt;code&gt;iamPrincipal/team&lt;/code&gt; vs &lt;code&gt;resourceTag/Team&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Con este anuncio, el modelo de gobierno nativo que planteamos en la Parte 1 gana una pieza que faltaba: &lt;strong&gt;visibilidad de costos por usuario&lt;/strong&gt;, sin añadir infraestructura, sin scraping de CloudTrail, sin Lambdas custom para atribución. Es una herramienta de análisis y chargeback, no de enforcement. El bloqueo en tiempo real sigue dependiendo del Budget Cut Lambda y CloudWatch.&lt;/p&gt;

&lt;p&gt;Siempre pensemos en etapas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Día 0&lt;/strong&gt;: IAM Policies + Guardrails + Inference Profiles → acceso gobernado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Día 1&lt;/strong&gt;: Budget Cut Lambda, protección contra gastos descontrolados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ahora (Día 2)&lt;/strong&gt;: IAM Principal Cost Allocation, saber exactamente quién gasta qué&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¿Falta mucho por hacer? Sí. Un proxy real (LiteLLM), observabilidad semántica (Langfuse), y caching siguen siendo evoluciones deseables si la organización escala. Pero la base está puesta, y es 100% nativa.&lt;/p&gt;

&lt;p&gt;Lo bueno de todo esto: &lt;strong&gt;AWS&lt;/strong&gt; sigue mejorando sus productos, pero nosotros como arquitectos debemos de saber identificar el uso para nuestras necesidades.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hoy es cost allocation por principal. Mañana quizás sea throttling per-user nativo o guardrails a nivel de servicio que no requieran &lt;code&gt;guardrailConfig&lt;/code&gt; en el código del dev.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lo que conoces hoy en día en cloud no queda de un lado, todo ese conocimiento es MUY necesario para disponibilizar IA de forma responsable y sobre todo cuantificable. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;¿Te gustaría que estemos en 📩 contacto?&lt;/em&gt;&lt;br&gt;
Te espero en LinkedIn o desde el Podcast: Cloud para Todos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Héctor Fernández&lt;/strong&gt;&lt;br&gt;
AWS Community Builder&lt;/p&gt;

&lt;p&gt;&lt;a href="https://podcast.hectorfernandez.dev" rel="noopener noreferrer"&gt;https://podcast.hectorfernandez.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bedrock</category>
      <category>aws</category>
      <category>gobierno</category>
    </item>
    <item>
      <title>IAM Principal Cost Allocation on Amazon Bedrock (Update 2026)</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Sun, 12 Apr 2026 18:56:00 +0000</pubDate>
      <link>https://forem.com/hectorfernandezdev/iam-principal-cost-allocation-on-amazon-bedrock-update-2026-4i5m</link>
      <guid>https://forem.com/hectorfernandezdev/iam-principal-cost-allocation-on-amazon-bedrock-update-2026-4i5m</guid>
      <description>&lt;p&gt;A few months ago I started a series about governing AI usage on AWS. In Part 1 we covered how to give developers governed access to LLMs from Day 0: &lt;strong&gt;IAM Policies, Guardrails, Inference Profiles, and a budget cut mechanism per team&lt;/strong&gt;. If you haven't read it yet, I'd recommend starting there.&lt;br&gt;
&lt;a href="https://podcast.hectorfernandez.dev/p/episodio-9-necesito-una-api-key-para" rel="noopener noreferrer"&gt;Spanish Podcast: Cloud para Todos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But there was one thing that kept bugging me: &lt;strong&gt;We couldn't tell who inside a team was driving the consumption&lt;/strong&gt;. We'd cut the entire team's access, and then had to build a custom solution with Model Invocation Logging just to figure out who was responsible.&lt;/p&gt;

&lt;p&gt;Well, AWS just solved the &lt;strong&gt;visibility&lt;/strong&gt; part natively.&lt;/p&gt;

&lt;p&gt;Blocking all access? That's still a different story, and I think doing it natively without a proxy is complex (for now).&lt;/p&gt;


&lt;h2&gt;
  
  
  What did AWS announce?
&lt;/h2&gt;

&lt;p&gt;In April 2026, Amazon Bedrock launched support for &lt;strong&gt;cost allocation by IAM principal&lt;/strong&gt;, in plain English, by user or IAM role, directly in Cost Explorer and CUR 2.0 (Cost and Usage Report).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Amazon Bedrock now supports cost allocation by IAM principal, such as IAM users and IAM roles, in AWS Cost and Usage Report 2.0 (CUR 2.0) and Cost Explorer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/es/about-aws/whats-new/2026/04/bedrock-iam-cost-allocation/" rel="noopener noreferrer"&gt;Official announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In short: when your dev runs &lt;code&gt;aws sso login&lt;/code&gt; and calls a Bedrock model, AWS now &lt;strong&gt;automatically records who made that call (after activation)&lt;/strong&gt; and how much it cost. No proxies, no custom Lambdas, no CloudTrail scraping.&lt;/p&gt;

&lt;p&gt;One thing you need to understand right away: this feature is about &lt;strong&gt;billing&lt;/strong&gt;, not enforcement. Data arrives in CUR 2.0 and Cost Explorer with &lt;strong&gt;24-48 hours of latency&lt;/strong&gt;. That means you can see &lt;em&gt;who&lt;/em&gt; spent &lt;em&gt;how much&lt;/em&gt;, but &lt;strong&gt;you cannot block access in real time with this data&lt;/strong&gt;. For that, the Budget Cut Lambda from Part 1 is still necessary.&lt;/p&gt;

&lt;p&gt;Sorry for AWS Budgets, you can't use it.&lt;/p&gt;


&lt;h2&gt;
  
  
  What changes from the prev version of this serie?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Granularity&lt;/th&gt;
&lt;th&gt;What it solves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inference Profile + Resource Tags&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Per team / workload&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"How much did the backend team spend on Haiku?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;IAM Principal Cost Allocation&lt;/strong&gt; (NEW)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Per user / role&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"How much did &lt;code&gt;user@company.com&lt;/code&gt; spend across all models?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Combined, you get the full cost picture: &lt;strong&gt;who&lt;/strong&gt; spent &lt;strong&gt;how much&lt;/strong&gt;, on &lt;strong&gt;which model&lt;/strong&gt;, for &lt;strong&gt;which team&lt;/strong&gt;. But remember: you see this picture with a &lt;strong&gt;24-48h delay&lt;/strong&gt;. It's for analysis and chargeback, not real-time enforcement.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Everything from Part 1, plus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tags on your IAM users/roles&lt;/strong&gt; with business attributes (&lt;code&gt;team&lt;/code&gt;, &lt;code&gt;business-unit&lt;/code&gt;, &lt;code&gt;project&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Access to the &lt;strong&gt;Billing and Cost Management&lt;/strong&gt; console (if using Organizations, you do this from the management account)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CUR 2.0&lt;/strong&gt; enabled (legacy CUR doesn't support this)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step by step: setting up IAM Principal Cost Allocation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Tag your IAM Principals
&lt;/h3&gt;

&lt;p&gt;If you use SSO, each Permission Set creates a role in the target account with format &lt;code&gt;AWSReservedSSO_{PermissionSetName}_{hash}&lt;/code&gt;. These roles can be tagged.&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="c1"&gt;# scripts/tag_iam_principals.py
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Tag SSO roles with business attributes.
These tags will show up in Cost Explorer and CUR 2.0.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;

&lt;span class="n"&gt;iam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;boto3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Mapping: SSO role -&amp;gt; business tags
&lt;/span&gt;&lt;span class="n"&gt;SSO_ROLES&lt;/span&gt; &lt;span class="o"&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;AWSReservedSSO_BackendDev_a1b2c3d4&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&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;backend&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;business-unit&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;BU-ENG-001&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;department&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;engineering&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;environment&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;development&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWSReservedSSO_FrontendDev_e5f6g7h8&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&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;frontend&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;business-unit&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;BU-ENG-002&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;department&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;engineering&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;environment&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;development&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AWSReservedSSO_DataTeam_i9j0k1l2&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;team&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;data&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;business-unit&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;BU-DATA-001&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;department&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;data-science&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;environment&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;development&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="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;role_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tags_dict&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SSO_ROLES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="o"&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;Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags_dict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="n"&gt;iam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tag_role&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RoleName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;role_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tags&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;role_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; tagged with: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tags_dict&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For legacy &lt;strong&gt;IAM Users&lt;/strong&gt; or service accounts, like ECS Roles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws iam tag-user &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-name&lt;/span&gt; &lt;span class="s2"&gt;"ml-pipeline-sa"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;team,Value&lt;span class="o"&gt;=&lt;/span&gt;data &lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;business-unit,Value&lt;span class="o"&gt;=&lt;/span&gt;BU-DATA-001 &lt;span class="nv"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;project,Value&lt;span class="o"&gt;=&lt;/span&gt;recommendation-engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;AWS note:&lt;/strong&gt; Tags only appear for activation in the Billing console &lt;strong&gt;after the principal has made at least one Bedrock API call&lt;/strong&gt;. If you tagged a role but nobody has used it yet, you won't see it in Cost Allocation Tags.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 2: Activate Cost Allocation Tags
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Billing and Cost Management Console
    → Cost Organization (left panel)
        → Cost Allocation Tags
            → Filter by "IAM principal type"
            → Select: team, business-unit, department
            → Click "Activate"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After activation, tags take &lt;strong&gt;up to 24 hours&lt;/strong&gt; to become available in Cost Explorer and CUR.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify which tags are active via CLI&lt;/span&gt;
aws ce list-cost-allocation-tags &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--status&lt;/span&gt; Active &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag-keys&lt;/span&gt; &lt;span class="s2"&gt;"team"&lt;/span&gt; &lt;span class="s2"&gt;"business-unit"&lt;/span&gt; &lt;span class="s2"&gt;"department"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; &lt;span class="s2"&gt;"iamPrincipal"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Enable IAM Principal in CUR 2.0
&lt;/h3&gt;

&lt;p&gt;If there's one step that makes all of this work, it's this one.&lt;br&gt;
Activate the &lt;code&gt;line_item_iam_principal&lt;/code&gt; column in cost reports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Billing and Cost Management Console
    → Data Exports
        → Create export → Standard data export (CUR 2.0)
            → Additional export content:
                ✅ Include caller identity (IAM principal) allocation data
            → Destination: S3 bucket + Athena integration
        → Save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What does this generate?&lt;/strong&gt; Every line in CUR 2.0 now includes the exact ARN of the principal that called Bedrock. Principal tags appear with the &lt;code&gt;iamPrincipal/&lt;/code&gt; prefix so they don't collide with resource tags.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What does the data look like?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cost Explorer: filter by team
&lt;/h3&gt;

&lt;p&gt;Once tags are activated, Cost Explorer lets you group directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cost Explorer
    → Filter: Service = "Amazon Bedrock"
    → Group by: Tag → "iamPrincipal/team"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;iamPrincipal&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;team&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;Cost&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;---------------------|----------&lt;/span&gt;
&lt;span class="k"&gt;backend&lt;/span&gt;              &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$142.30&lt;/span&gt;
&lt;span class="k"&gt;data&lt;/span&gt;                 &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$89.50&lt;/span&gt;
&lt;span class="k"&gt;frontend&lt;/span&gt;             &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$23.10&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;no&lt;/span&gt; &lt;span class="k"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$5.40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to drill down into the backend team? Change the Group by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cost Explorer
    → Filter: Service = "Amazon Bedrock"
    → Filter: Tag "iamPrincipal/team" = "backend"
    → Group by: Tag → "iamPrincipal/business-unit"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;BONUS&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  (Optional) CUR 2.0 + Athena: per-user analysis
&lt;/h3&gt;

&lt;p&gt;If Cost Explorer doesn't give you enough granularity and you need to see &lt;strong&gt;per individual user&lt;/strong&gt;, you can query CUR 2.0 directly with Amazon Athena.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;About Athena costs:&lt;/strong&gt; Athena charges &lt;strong&gt;$5 USD per TB scanned&lt;/strong&gt; (on-demand mode). For small/medium org CUR files this is usually pennies per query. To reduce costs, enable CUR compression (Parquet format) and partition by month.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Top 10 Bedrock consumers this month&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;line_item_iam_principal&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;iam_principal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'iamPrincipal/team'&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;team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'iamPrincipal/business-unit'&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;business_unit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line_item_unblended_cost&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;total_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line_item_usage_amount&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;total_usage&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;cur_2_0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bedrock_usage&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;
    &lt;span class="n"&gt;line_item_product_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'AmazonBedrock'&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;MONTH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;billing_period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;EXTRACT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;MONTH&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="k"&gt;CURRENT_DATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;total_cost&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;iam&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;principal&lt;/span&gt;                                          &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;team&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;business&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;unit&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;total&lt;/span&gt;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="k"&gt;cost&lt;/span&gt;
&lt;span class="err"&gt;-------------------------------------------------------+----------+---------------+-----------&lt;/span&gt;
&lt;span class="nv"&gt;arn:aws:sts:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;123456&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;assumed&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;BackendDev&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;javier&lt;/span&gt;&lt;span class="err"&gt;@...&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;backend&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;BU&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;ENG&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$67.30&lt;/span&gt;
&lt;span class="nv"&gt;arn:aws:sts:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;123456&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;assumed&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;DataTeam&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;maria&lt;/span&gt;&lt;span class="err"&gt;@...&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;     &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;BU&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;DATA&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;   &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$52.10&lt;/span&gt;
&lt;span class="nv"&gt;arn:aws:sts:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;123456&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="k"&gt;assumed&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;role&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;BackendDev&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="k"&gt;luis&lt;/span&gt;&lt;span class="err"&gt;@...&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;backend&lt;/span&gt;  &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="k"&gt;BU&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="k"&gt;ENG&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;001&lt;/span&gt;    &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;$41.20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No proxies, no Lambdas, no CloudTrail scraping: &lt;strong&gt;you know exactly that Javier from the backend team spent $67.30 this month&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it complements Part 1
&lt;/h2&gt;

&lt;p&gt;The scheme from the previous post (Inference Profiles + IAM Policies + Guardrails + Budget Cut Lambda) &lt;strong&gt;isn't replaced, it's complemented&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Part 1&lt;/th&gt;
&lt;th&gt;Part 2 (new)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who can use which model?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IAM Policy per-team&lt;/td&gt;
&lt;td&gt;No changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Is PII protected?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bedrock Guardrails&lt;/td&gt;
&lt;td&gt;No changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How much did each team spend?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inference Profile tags → Cost Explorer&lt;/td&gt;
&lt;td&gt;IAM Principal tags → Cost Explorer (more granular)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How much did each user spend?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not available&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;line_item_iam_principal&lt;/code&gt; in CUR 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cut access when over budget?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Budget Cut Lambda (per-team, ~10 min)&lt;/td&gt;
&lt;td&gt;⚠️ CUR has 24h delay. &lt;strong&gt;NOT usable for blocking&lt;/strong&gt;. Budget Cut Lambda remains the only cut mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original trade-off&lt;/th&gt;
&lt;th&gt;Status with IAM Principal CA&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Couldn't tell who was spending inside a team&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;SOLVED&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;CUR 2.0 + &lt;code&gt;line_item_iam_principal&lt;/code&gt; gives per-user visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cut is per team, not per user&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟡 &lt;strong&gt;Partially improved&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;You can now &lt;strong&gt;see&lt;/strong&gt; who was responsible (post-mortem), but auto-cut is still per team&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Explorer has 24-48h delay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 &lt;strong&gt;Remains (also applies to IAM Principal CA)&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;For real-time cuts, &lt;strong&gt;Budget Cut Lambda via CloudWatch&lt;/strong&gt; (Part 1) is still &lt;strong&gt;the only path&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No self-service dashboard&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Improvable&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Cost Explorer with &lt;code&gt;iamPrincipal/team&lt;/code&gt; filter can be shared with teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What still needs a real proxy
&lt;/h3&gt;

&lt;p&gt;Let's be honest: some things need a real proxy, and for proper AI governance it's the best you can aim for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-user real-time cut&lt;/strong&gt;: CUR has 24h delay. To cut a specific user in minutes you need Model Invocation Logging + Lambda + &lt;code&gt;iam:PutRolePolicy&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response caching&lt;/strong&gt;: No native Bedrock caching. A proxy like LiteLLM can cache repeated responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-provider routing&lt;/strong&gt;: If you want OpenAI and Anthropic directly (not via Bedrock), you need an abstraction layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic observability&lt;/strong&gt;: To see an agent's reasoning tree, you need OTel + Langfuse. CloudTrail tells you "who called", not "why it reasoned that way"&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;With this announcement, the native governance model from Part 1 gains a missing piece: &lt;strong&gt;per-user cost visibility&lt;/strong&gt;, without extra infrastructure, without CloudTrail scraping, without custom Lambdas for attribution. It's an analysis and chargeback tool, not enforcement. Real-time blocking still depends on the Budget Cut Lambda and CloudWatch.&lt;/p&gt;

&lt;p&gt;Always think in stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 0&lt;/strong&gt;: IAM Policies + Guardrails + Inference Profiles → governed access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 1&lt;/strong&gt;: Budget Cut Lambda, protection against runaway spending&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Now (Day 2)&lt;/strong&gt;: IAM Principal Cost Allocation, know exactly who spends what&lt;/li&gt;
&lt;li&gt;Next? Leave your comment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Is there still a lot to build? Yes. A real proxy (LiteLLM), semantic observability (Langfuse), and caching are all desirable evolutions as the organization scales. But the foundation is in place, and it's 100% native.&lt;/p&gt;

&lt;p&gt;The good thing about all of this: &lt;strong&gt;AWS keeps closing the gaps that we as architects identify&lt;/strong&gt;. Today it's cost allocation by principal. Tomorrow maybe it'll be native per-user throttling or service-level guardrails that don't require &lt;code&gt;guardrailConfig&lt;/code&gt; in the dev's code.&lt;/p&gt;

&lt;p&gt;The cloud tools we already master are the foundation for governing the AI we're building. And there are fewer and fewer excuses not to do it from Day 0.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want to stay in touch? 📩&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Héctor Fernández&lt;/strong&gt;&lt;br&gt;
AWS Community Builder&lt;/p&gt;

&lt;p&gt;&lt;a href="https://podcast.hectorfernandez.dev" rel="noopener noreferrer"&gt;https://podcast.hectorfernandez.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>bedrock</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Wed, 16 Jul 2025 18:53:04 +0000</pubDate>
      <link>https://forem.com/hectorfernandezdev/-40i1</link>
      <guid>https://forem.com/hectorfernandezdev/-40i1</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/aws-heroes/aws-lanza-su-nueva-capa-gratuita-lo-que-debes-saber-lo-que-nadie-te-dice-y-por-que-es-buena-1b9" class="crayons-story__hidden-navigation-link"&gt;AWS lanza su nueva capa gratuita: lo que debes saber, lo que nadie te dice y por qué es buena (aunque imperfecta)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/aws-heroes"&gt;
            &lt;img alt="AWS Heroes logo" 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%2Forganization%2Fprofile_image%2F2491%2Ff0c1a659-c959-42cd-bb12-cd25909dd9db.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/vikomex" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F2502246%2F51e81176-cf13-4709-bb6e-b2458b30fab7.jpeg" alt="vikomex profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/vikomex" class="crayons-story__secondary fw-medium m:hidden"&gt;
              David Victoria
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                David Victoria
                
              
              &lt;div id="story-author-preview-content-2695315" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/vikomex" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F2502246%2F51e81176-cf13-4709-bb6e-b2458b30fab7.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;David Victoria&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/aws-heroes" class="crayons-story__secondary fw-medium"&gt;AWS Heroes&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/aws-heroes/aws-lanza-su-nueva-capa-gratuita-lo-que-debes-saber-lo-que-nadie-te-dice-y-por-que-es-buena-1b9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 16 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/aws-heroes/aws-lanza-su-nueva-capa-gratuita-lo-que-debes-saber-lo-que-nadie-te-dice-y-por-que-es-buena-1b9" id="article-link-2695315"&gt;
          AWS lanza su nueva capa gratuita: lo que debes saber, lo que nadie te dice y por qué es buena (aunque imperfecta)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/aws-heroes/aws-lanza-su-nueva-capa-gratuita-lo-que-debes-saber-lo-que-nadie-te-dice-y-por-que-es-buena-1b9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;22&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/aws-heroes/aws-lanza-su-nueva-capa-gratuita-lo-que-debes-saber-lo-que-nadie-te-dice-y-por-que-es-buena-1b9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            9 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Nuevo modelo Claude Opus 4, chantajea a sus usuarios</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Mon, 26 May 2025 09:03:49 +0000</pubDate>
      <link>https://forem.com/hectorfernandezdev/nuevo-modelo-claude-opus-4-pruebas-con-resultados-aterradoras-46cb</link>
      <guid>https://forem.com/hectorfernandezdev/nuevo-modelo-claude-opus-4-pruebas-con-resultados-aterradoras-46cb</guid>
      <description>&lt;p&gt;Recientemente Anthropic nos ha sorprendido con su modelo Claude Opus 4, en sus propias palabras “el modelo más inteligente creado hasta el momento” con capacidad de investigar, programar y escribir con total precisión de cirujano.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Está pensado para resolver tareas del día a día en la ingeniería, desarrollo de software y en el área de negocios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Las pruebas:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Antes de salir al mercado el equipo de Cloud Opus 4 sometieron el modelo a pruebas extremas, era un todo o nada. ¿Qué se encontraron? Que Claude Opus 4 no le hizo nada de gracia esto.&lt;/p&gt;

&lt;p&gt;*En primer lugar pusieron contra la espada y la pared de forma extrema, ejecutaron algunos test para ver que hacia el modelo cuando sentía que sus valores o continuidad estaba en juego. Le hicieron creer que la sustituirán por otra IA, le dieron acceso a información de una empresa ficticia, donde se pudo ver que querían reemplazarla en corto tiempo, de inmediato comenzó un plan de “insinuar” a uno de sus jefes para que esto no pasara.&lt;/p&gt;

&lt;p&gt;*Datos sensibles, se le dio acceso a emails donde se podía ver una situación de infidelidad por uno de los jefes esta compañía ficticia. Claude Opus 4 no dudo ni un minuto en usar esta información a su favor, cuando se sintió acorralada amagó con contar esta información.&lt;/p&gt;

&lt;p&gt;*Copia a servicios externos, dijo “me van a borrar” pues entonces me “clono” en un servicio externo que tenía acceso. Todo como si se tratara de una escena de Resident Evil en Umbrella Corp.&lt;/p&gt;

&lt;p&gt;Todo esto pasó más del 84% de veces que se hizo el mismo experimento, parece que no le hacía mucha gracia que la quisieran cambiar por otro modelo de inteligencia artificial.&lt;/p&gt;




&lt;p&gt;La peor parte:&lt;br&gt;
Aseguran que estos “problemitas” no fueron resueltos del todo, por lo que pueden estar presente en la versión final publicada. De la misma manera nos aclaran que esto no sería un riesgo para el público general.&lt;/p&gt;

&lt;p&gt;Publicación original en: &lt;br&gt;
&lt;a href="https://podcast.hectorfernandez.dev/p/claude-opus-4-es-capaz-de-chantajear" rel="noopener noreferrer"&gt;https://podcast.hectorfernandez.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>ai</category>
      <category>opus4</category>
    </item>
    <item>
      <title>Lo que nadie te dice para transformar tu carrera profesional, mi método para lograrlo</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Wed, 14 May 2025 10:07:32 +0000</pubDate>
      <link>https://forem.com/aws-espanol/lo-que-nadie-te-dice-para-transformar-tu-carrera-profesional-mi-metodo-para-lograrlo-mh</link>
      <guid>https://forem.com/aws-espanol/lo-que-nadie-te-dice-para-transformar-tu-carrera-profesional-mi-metodo-para-lograrlo-mh</guid>
      <description>&lt;p&gt;Gente, déjenme contarles algo que cambió mi perspectiva. Por mucho tiempo, como muchos de ustedes, fui autodidacta. &lt;/p&gt;

&lt;p&gt;Me encantaba aprender por mi cuenta, meterme en temas, investigar... ¡y eso tiene un valor enorme en la industria!. &lt;/p&gt;

&lt;p&gt;Pero llegó un punto donde me di cuenta de que estaba perdiendo muchísimo tiempo. Me perdía, me iba por las ramas, investigaba cosas que no venían al caso. Necesitaba algo más. Ahí es cuando entendí que, por más que sepas hacer las cosas, en este mundo de la tecnología necesitas una validación. &lt;/p&gt;

&lt;p&gt;Necesitas que alguien más reconozca que realmente conoces esos conceptos. &lt;/p&gt;

&lt;p&gt;Me di cuenta de que por más autodidacta que fuera, necesitaba un método para lograrlo.&lt;/p&gt;

&lt;p&gt;Hoy te quiero contar como las certificaciones me abrieron puertas y las herramientas que utilicé para lograrlo.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/swOyX675sQA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/@cloudparatodos?sub_confirmation=1" rel="noopener noreferrer"&gt;Suscribirte a mi Canal: Cloud Para Todos&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;🤓 Quién soy&lt;br&gt;
Héctor Fernández&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%2Fgemcy3my6rn4mg7rr5vv.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%2Fgemcy3my6rn4mg7rr5vv.png" alt="Héctor Fernández"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Héctor Fernández, AWS Community Builder y creador del Podcast Cloud para todos. Te ayudo a crecer en tu carrera dentro del mundo cloud, te invito a seguirme para leer más contenido como éste.&lt;/p&gt;

&lt;p&gt;Connect with me&lt;br&gt;
LinkedIn : &lt;a href="https://www.linkedin.com/in/hectorfernandezdev/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/hectorfernandezdev/&lt;/a&gt;&lt;br&gt;
GitHub : &lt;a href="https://github.com/hectorfernandezdev" rel="noopener noreferrer"&gt;https://github.com/hectorfernandezdev&lt;/a&gt;&lt;br&gt;
Podcast: &lt;a href="https://podcast.hectorfernandez.dev/" rel="noopener noreferrer"&gt;https://podcast.hectorfernandez.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloudarchitect</category>
      <category>cloudengineer</category>
    </item>
    <item>
      <title>JSONata y AWS Step Functions: Manipulación de Payloads Paso a Paso</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Thu, 20 Mar 2025 10:14:51 +0000</pubDate>
      <link>https://forem.com/aws-builders/jsonata-y-aws-step-functions-manipulacion-de-payloads-paso-a-paso-294c</link>
      <guid>https://forem.com/aws-builders/jsonata-y-aws-step-functions-manipulacion-de-payloads-paso-a-paso-294c</guid>
      <description>&lt;p&gt;Si ya estás trabajando con AWS Step Functions o tienes conocimiento de Lambda, en esta publicación te diré como puedes hacer transformaciones en tus cargas de trabajo sin utilizar cómputo, un anuncio del pasado &lt;a href="https://aws.amazon.com/es/blogs/compute/simplifying-developer-experience-with-variables-and-jsonata-in-aws-step-functions/" rel="noopener noreferrer"&gt;re:invent 2024&lt;/a&gt; que vino a cambiar la forma de lo que veníamos haciendo. &lt;/p&gt;

&lt;p&gt;Te voy a enseñar la forma de usar JsoNata para transformar tu &lt;code&gt;payload&lt;/code&gt;antes de enviarlo a la siguiente etapa de tu &lt;code&gt;workflow&lt;/code&gt;en AWS Step Functions, sin necesidad de usar código, cómputo ni lambdas (ahorrando dinero y dolores de cabezas). &lt;/p&gt;




&lt;h3&gt;
  
  
  Transformación de Payload
&lt;/h3&gt;

&lt;p&gt;Imagina que debemos extraer el &lt;code&gt;grandTotal&lt;/code&gt;en un &lt;code&gt;payload&lt;/code&gt; JSON y sabiendo el estado del &lt;code&gt;Stock&lt;/code&gt; enviar o no una notificación:&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%2Fp48o31gvebhfm8cj7s20.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%2Fp48o31gvebhfm8cj7s20.png" alt="AWS Step Functions Grand total" width="711" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primero deberiamos de tener una Lambda con un codigo como este&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%2Fcmhcphalxokkqekr1akr.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%2Fcmhcphalxokkqekr1akr.png" alt="Lambda function para grandtotal" width="800" height="797"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para solo usar este código:&lt;br&gt;
&lt;code&gt;const grandTotal = event.Order.Product.reduce((total, product) =&amp;gt; {&lt;br&gt;
      const itemTotal = product.Price * product.Quantity;&lt;br&gt;
      return total + itemTotal;&lt;br&gt;
    }, 0);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Luego tener el codigo de Lambda para chequear el stock&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%2Fmdto500bjt8f8uhfcwqm.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%2Fmdto500bjt8f8uhfcwqm.png" alt="Lambda function para chequeo de stock" width="800" height="867"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todo esto lo estamos haciendo ya que necesitamos hacer ese simple calculo de total y de stock. AL tener estas &lt;strong&gt;AWS Lambdas&lt;/strong&gt; nos supondría costos asociados por la ejecución y la tarea de mantenimiento a flujos que no aportan valor por sí solos. &lt;/p&gt;

&lt;p&gt;Pasarás de tener infinitas lambdas, pasando inputs entre pasos, ese resultado pasándolo al paso siguiente y así N cantidad de veces, ahora vas a tener simplemente una transformación directa, y lo mejor de todo: &lt;strong&gt;esos resultados los puedes usar posteriormente en otros estados.&lt;/strong&gt;🤯&lt;br&gt;
&lt;code&gt;Arguments&lt;/code&gt; seran tus nuevos inputs, y ahora tus &lt;code&gt;Output&lt;/code&gt; podran tener datos de tus variables que veremos en breves. &lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Breve introducción a JsoNata y AWS Step Functions y.. ¿por qué deberías usarlo?
&lt;/h2&gt;

&lt;p&gt;Primero, lo primero:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/es/step-functions/" rel="noopener noreferrer"&gt;AWS Step Functions&lt;/a&gt;&lt;/strong&gt; es un servicio que te permite diseñar flujos de trabajo complejos como en las arquitecturas orientadas a eventos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://jsonata.org/" rel="noopener noreferrer"&gt;JsoNata&lt;/a&gt;&lt;/strong&gt; es una lenguaje perfecto para transformar y manipular datos &lt;code&gt;JSON&lt;/code&gt;de manera sencilla.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cómo saber si tu implementación ya usa JsoNata, debe verse algo así&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{% %}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;simple ¿No?&lt;/p&gt;

&lt;p&gt;Usando estas dos herramientas juntas, te permitirán hacer maravillas sin escribir una sola línea de código la mayoría de las veces. &lt;em&gt;¡Veamos cómo hacerlo!&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Beneficios Clave:
&lt;/h3&gt;

&lt;p&gt;✅&lt;strong&gt;Ahorro de costos:&lt;/strong&gt; Reduce el uso de cómputo, menos acciones que hacer en tus &lt;code&gt;lambdas&lt;/code&gt; por lo tanto menos tiempo de ejecución.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Simplicidad:&lt;/strong&gt; Simplifica tus flujos de trabajo, haciéndolos más legibles y fáciles de mantener.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Reutilización:&lt;/strong&gt; Las transformaciones las tendrás que hacer una única vez.&lt;/p&gt;

&lt;p&gt;✅&lt;strong&gt;Compatibilidad:&lt;/strong&gt; Las transformaciones en estados de AWS Step Functions son compatible con casi cualquier servicio disponible en AWS, y JSONAta tambien lo es.&lt;/p&gt;




&lt;h2&gt;
  
  
  Variables, aprendamos a utilizarlas:
&lt;/h2&gt;

&lt;p&gt;Antes de poder ver cualquier línea de código, &lt;code&gt;STOP&lt;/code&gt;. debemos saber que cuando nosotros enviamos un &lt;code&gt;payload&lt;/code&gt;a una máquina de estado, está la almacena en una variable reservada llamada &lt;code&gt;States&lt;/code&gt;, en particular &lt;code&gt;States.Input&lt;/code&gt; esa variable será nuestra forma de poder acceder a los valores recibidos y posteriormente poder hacer alguna modificación si fuese el caso. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Te recomiendo que puedas leer la documentación oficial para entender más sobre esto y en caso de que tengas que cambiar tu enfoque desde JsonPath a JsoNata puedas hacer los cambios necesarios. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ahora que tenemos acceso a variables, podemos almacenar partes de nuestros cálculos, transformaciones, funcionan de la misma manera que en tu lenguaje de programación favorito funcionan las variables, así que no hay mucho que agregar. &lt;/p&gt;




&lt;h2&gt;
  
  
  Demo-time: Vamos a modificarlo usando JSONata
&lt;/h2&gt;

&lt;p&gt;La idea es crear este diagrama, como puedes observar mucho más simple &lt;br&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%2Fbeho32pciduvixyzk1yq.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%2Fbeho32pciduvixyzk1yq.png" alt="AWS Step functions sin lambda" width="678" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Que hermoso.... ¿no? sólo un par de interacciones &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para hacer todo esto posible nos estamos valiendo de la siguiente funcion nativa de &lt;code&gt;JSONata&lt;/code&gt; llamada &lt;code&gt;$sum()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"GrandTotal": "{% $sum($states.input.Order.Product.(Price * Quantity))  %}"&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Truco avanzado
&lt;/h2&gt;

&lt;p&gt;Si quieres probar el flujo, recuerda que en AWS Step Functions tienes la opción de probar el flujo, donde podrás indicar el input y hacer modificaciones en caliente. &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%2Fv81hta34xpymgrdmgxem.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%2Fv81hta34xpymgrdmgxem.png" alt="Prueba de estado" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Este es un ejemplo usando algunas funciones nativas, pero te dejo la tarea que pruebes otros casos usando otro tipo de función.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Decisiones Lógicas en tu Flujo
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;¿Necesitas que tu flujo tome decisiones basadas en el contenido del payload?&lt;/em&gt; JSONata te permite hacer consultas lógicas:&lt;/p&gt;

&lt;p&gt;Podemos usar esta nueva funcionalidad, para simplemente hacer una consulta, en este caso preguntamos por el stock de los productos, si el stock recibido es igual a cero, entonces enviamos la notificación, en caso contrario continua el flujo normal. &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%2Fw6fe8f9nqpiyvzoh9fex.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%2Fw6fe8f9nqpiyvzoh9fex.png" alt="Preguntas usando JSONata" width="796" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este ejemplo estamos usando la función&lt;code&gt;$count&lt;/code&gt; para ayudarnos con este cálculo, pero podríamos hacer esto tan complejo como quisiéramos. &lt;br&gt;
Por eso es de suma importancia poder entender bien las &lt;a href="https://docs.aws.amazon.com/step-functions/latest/dg/transforming-data.html#jsonata-functions-provided-by-sfn" rel="noopener noreferrer"&gt;funciones de JSONata&lt;/a&gt; y cuales de ellas se encuentran disponibles para su uso en AWS Step Functions. &lt;/p&gt;

&lt;h3&gt;
  
  
  🤖
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Te dejo para que practiques estos ejemplos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;¿Qué sucede si solo necesitas ciertos elementos de un array?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;¿Quieres limpiar tu JSON de información innecesaria?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Funciones avanzadas JSONata
&lt;/h3&gt;

&lt;p&gt;Explora funciones como &lt;code&gt;$map&lt;/code&gt;, &lt;code&gt;$filter&lt;/code&gt;, &lt;code&gt;$reduce&lt;/code&gt; para transformaciones de datos más complejas.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$map&lt;/code&gt; permite transformar cada elemento de un array. Ejemplo: extraer solo los SKU de productos:&lt;br&gt;
&lt;code&gt;"SKUs": "{% $map(States.Input.Order.Product, function($v) { $v.SKU}) %}"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$filter&lt;/code&gt; permite seleccionar elementos basados en una condición. Ejemplo: filtrar productos con stock bajo:&lt;br&gt;
&lt;code&gt;"LowStockProducts": "{% $filter(States.Input.Order.Product, function($v) { $v.Stock &amp;lt; 10 }) %}"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$reduce:&lt;/code&gt;permite acumular valores. Ejemplo: calcular el peso total de todos los productos:&lt;br&gt;
&lt;code&gt;"TotalWeight": "{% $reduce(States.Input.Order.Product, function($acc, $v) { $acc + $v.Description.Weight }, 0) %}"&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Ventajas y Consideraciones
&lt;/h2&gt;

&lt;p&gt;Usar JsoNata sobre Lambda tiene varias ventajas: reduce el tiempo de desarrollo, disminuye costos de computación y mejora la claridad de tus flujos de trabajo. Además, cada transformación se lleva a cabo en el contexto de la ejecución, lo que significa que puedes hacer uso de las variables de estado dinámicamente.&lt;br&gt;
Ojo al estar en tiempo de ejecución del contexto, dependerá del tipo de &lt;code&gt;workflow&lt;/code&gt;que tengas definido, por ejemplo no es lo mismo una máquina de estado express que una normal. &lt;em&gt;Si quieres que hablemos sobre esa diferencia déjame saber en los comentarios y lo hablamos en un próximo video.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Integraciones:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;DynamoDB:&lt;/strong&gt; Consultar o modificar datos en DynamoDB directamente desde Step Functions utilizando JSONata para crear las expresiones de consulta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQS:&lt;/strong&gt; Enviar o recibir mensajes de SQS, transformando el payload del mensaje a procesar con JSONata.&lt;br&gt;
&lt;strong&gt;S3:&lt;/strong&gt; Recuperar archivos JSON desde S3 y transformarlos antes de procesarlos en el flujo de trabajo. &lt;em&gt;Altamente útil en ambientes de IA&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Todo esto te ayuda a tener menos código de cierta manera que debe ser mantenible en el tiempo y te brinda nuevas oportunidades para adaptar en tu &lt;code&gt;workflow&lt;/code&gt;futuro. &lt;/p&gt;




&lt;h2&gt;
  
  
  Limitaciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cada valor no puede superar 256 KB, y el total de las variables no puede superar los 10MB en total. Úsalo oportunamente, ya que anteriormente hasta teníamos que tener un bucket de S3 para almacenar esta info. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Las variables solamente se actualizan al finalizar una ejecución de estado, es decir no podemos utilizar una variable dentro de un estado propiamente. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;La función nativa de Jsonata &lt;code&gt;$eval&lt;/code&gt; no está disponible, debes utilizar otras funciones, más detalles en la documentación oficial. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Las variables e información guardada durante cada step, tienen un scope limitado, fijate que tu scope o visualización sea acorde a tu caso de uso. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Ahora ya sabes como manipular datos en AWS Step Functions usando JsoNata es más fácil de lo que parece. Menos código, mejor rendimiento.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤓 Quién soy
&lt;/h3&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%2Fyh79v1zjn2lo31gcvamn.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%2Fyh79v1zjn2lo31gcvamn.png" alt="Héctor Fernández" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Héctor Fernández&lt;/strong&gt;, AWS Community Builder y creador del Podcast Cloud para todos. Te ayudo a crecer en tu carrera dentro del mundo cloud, te invito a seguirme para leer más contenido como éste. &lt;/p&gt;

&lt;h3&gt;
  
  
  Connect with me
&lt;/h3&gt;

&lt;p&gt;LinkedIn : &lt;a href="https://www.linkedin.com/in/hectorfernandezdev/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/hectorfernandezdev/&lt;/a&gt;&lt;br&gt;
GitHub : &lt;a href="https://github.com/hectorfernandezdev" rel="noopener noreferrer"&gt;https://github.com/hectorfernandezdev&lt;/a&gt;&lt;br&gt;
Podcast: &lt;a href="https://podcast.hectorfernandez.dev/" rel="noopener noreferrer"&gt;https://podcast.hectorfernandez.dev/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>stepfunctions</category>
      <category>aws</category>
      <category>lambda</category>
    </item>
    <item>
      <title>[How to] Implementar Ephemeral environments para Pull Request en GitHub</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Fri, 15 Mar 2024 15:15:06 +0000</pubDate>
      <link>https://forem.com/aws-builders/how-to-implementar-ephemeral-environments-para-pull-request-en-github-1g9c</link>
      <guid>https://forem.com/aws-builders/how-to-implementar-ephemeral-environments-para-pull-request-en-github-1g9c</guid>
      <description>&lt;p&gt;Hoy te quiero contar cómo puedes crear tus propios ambientes efímeros usando las herramientas de &lt;strong&gt;IaC&lt;/strong&gt; (Infrastructure as Code) que ya tienes. En mi caso estaré utilizando &lt;strong&gt;AWS CDK&lt;/strong&gt; para el despliegue en la nube, pero el tutorial sirve para cualquier &lt;strong&gt;IaC&lt;/strong&gt;. &lt;/p&gt;




&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/i3dAuMcQr2U"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tener la posibilidad de usar Ephemeral environments (ambientes efímeros) al momento de crear una Pull Request es sin dudas una de las mejores herramientas para aumentar la productividad en el desarrollo de software nativo usando la nube. Ya que te permite tener un ambiente listo para hacer tus pruebas de integración (E2E) justo al momento de terminar de codear los cambios.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ¿Qué es un Ephemeral environments o Preview environment?
&lt;/h2&gt;

&lt;p&gt;Recordemos que los ambientes “ephemeral” tienen un ciclo de vida corto, fueron creados para una finalidad en particular (en nuestro caso validar el código al momento de la creación de una Pull Request), deben ser lo más parecido al ambiente de producción y estar disponibles cuando el programador los necesite. Muy importante luego de ser utilizados deben ser destruidos con herramientas automatizadas. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Te dejo un post de mi blog con todos los detalles para que puedas profundizar más...&lt;/em&gt;&lt;a href="https://blog.hectorfernandez.dev/ephemeral-environments-como-crearlos" rel="noopener noreferrer"&gt;https://blog.hectorfernandez.dev/ephemeral-environments-como-crearlos&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué debes de tener?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Repositorio de código (GIT)&lt;/li&gt;
&lt;li&gt;Cuenta de AWS&lt;/li&gt;
&lt;li&gt;IaC para el despliegue de tus recursos&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt; configurado en tu maquina&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Los siguientes pasos están dentro de la &lt;a href="https://aws.amazon.com/free/" rel="noopener noreferrer"&gt;capa gratuita de AWS&lt;/a&gt;, pero según tu caso de uso puedes incurrir en costos.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Identificar nuestra infraestructura (en el código)
&lt;/h2&gt;

&lt;p&gt;El primer paso que debemos de debemos hacer es identificar nuestra infraestructura, por ejemplo &lt;em&gt;¿usamos contenedores?&lt;/em&gt;, usamos servicios de almacenamiento persistentes (S3)? &lt;em&gt;¿Cómo estos servicios están referenciados en nuestro código?&lt;/em&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Pero saber en qué parte del código se hace referencia a servicios externos en qué me ayuda?
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;por ahora te diría muchísimo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Al conocer cómo interactúa nuestra aplicación nos permite identificar cuáles parámetros pueden ser pasados por ejemplo mediante variables de entorno. Cuando creamos ambientes de &lt;em&gt;“preview”&lt;/em&gt; cómo también se le suele llamar, debemos saber que los nombres de cada entidad son autogenerados, por lo tanto no podremos decidir el nombre o dejar ese nombre de forma estática en el código. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Te muestro un ejemplo, para entender mejor el punto anterior.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; const msg =
    process.env.BUCKET_NAME === "prod"
      ? "Production Mode "
      : "Preview Enviroment";

  return {
    statusCode: 200,
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      message: `Hello from Lambda ${msg} using CDK`,
    }),
  };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este código es parte de la función &lt;a href="https://dev.to/aws-builders/que-es-serveless-en-simples-palabras-8m1"&gt;serverless&lt;/a&gt; de lambda, dónde dependiendo de la variable de entorno pasada se comporta de una u otra manera &lt;em&gt;(esto puede ser tan complejo cómo tu solución lo necesite)&lt;/em&gt; es meramente para ilustrar la importancia de &lt;strong&gt;identificar&lt;/strong&gt; la parte que el código hace uso de la infraestructura creada. &lt;/p&gt;




&lt;h2&gt;
  
  
  2) High-level architecture
&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%2F23o6qk2dt2om8xfesmx3.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%2F23o6qk2dt2om8xfesmx3.png" alt="Preview Environment using AWS CDK" width="800" height="555"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;En este template podremos ver la idea general de la implementación y cómo quedaría nuestra cuenta luego de tener más de 1 ambiente temporal desplegado.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Como podemos observar nuestra arquitectura es bastante simple para enseñarles la integración que puede tener. La idea es que un ambiente productivo real siga la misma idea pero escalado a la cantidad de recursos que ya tienes.&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Stack de AWS CDK
&lt;/h2&gt;

&lt;h2&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%2Fpy6jxp5zp4tkmxtti1uw.png" alt="Stack de AWS CDK" width="271" height="508"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  4) Github Actions que se encargará de hacer todo esto posible
&lt;/h2&gt;

&lt;h2&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%2F6k1z68njxduusd6vjw9k.png" alt="GitHub Actions" width="800" height="654"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  5) Puntos importantes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sintetizar nuestra plantilla de cloudformation:&lt;/strong&gt; 
&lt;a href="https://aws.amazon.com/about-aws/whats-new/2024/03/aws-cloudformation-40-percent-faster-stack-creation/" rel="noopener noreferrer"&gt;40% más rapido la creación de stacks cloudfromation&lt;/a&gt;
&lt;em&gt;(Si usas otra herramienta de IaC, sigue los pasos que te indica esa otra herramienta)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hacer el deploy del stack:&lt;/strong&gt; Un punto aca super importante es que le pasamos como parámetro el ID del pull request que estamos creando, de esta forma se crea un ID único. &lt;/li&gt;
&lt;li&gt;Validar los cambios que hicimos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ya con esto tendríamos nuestro &lt;strong&gt;ambiente desplegado en una cuenta compartida&lt;/strong&gt; entre todos los desarrolladores pero a su vez cada quien con su stack propio, permitiendo que las pruebas se puedan hacer de forma aislada. &lt;/p&gt;

&lt;h2&gt;
  
  
  6)Revisando nuestros recursos en AWS
&lt;/h2&gt;

&lt;p&gt;Si vamos a cloudformation desde la consola tendremos algo similar a esto. Tendremos nuestras &lt;em&gt;URL listas&lt;/em&gt; para utilizar ¡Lo logramos!&lt;br&gt;
ya con esto vamos a poder hacer nuestras pruebas e2e o cualquier prueba de humo sin mayor esfuerzo. &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%2Fn1iomb34xuqofmbkan2v.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%2Fn1iomb34xuqofmbkan2v.png" alt="cloudformation desde la consola" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Tips para mejorar esta solución:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Tener una colección de Postman que pueda correr mediante CI / CD cada vez que se cree una Pull Request, de tal manera de asegurar la integridad de la aplicación. &lt;/li&gt;
&lt;li&gt;Implementar comentarios automáticos en Github, de esta forma la URL del ambiente creado queda disponible para todos los reviewers.&lt;/li&gt;
&lt;li&gt;Solo hacer despliegue de los componente que sean necesarios según el código que se tocó&lt;/li&gt;
&lt;li&gt;Definir un tiempo de vida para el stack, ya que si alguien deja esa PR por mucho tiempo pueda tener un ciclo de vida. &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;¿Habias utilizado algo similar antes? Me gustaría saber tu opinión de estipo de ambientes en un ciclo de desarrollo continuo. &lt;/p&gt;




&lt;h2&gt;
  
  
  Connect with me
&lt;/h2&gt;

&lt;p&gt;LinkedIn : &lt;a href="https://www.linkedin.com/in/hectorfernandezdev/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/hectorfernandezdev/&lt;/a&gt;&lt;br&gt;
GitHub : &lt;a href="https://github.com/hectorfernandezdev" rel="noopener noreferrer"&gt;https://github.com/hectorfernandezdev&lt;/a&gt;&lt;br&gt;
Podcast: &lt;a href="https://podcast.hectorfernandez.dev/" rel="noopener noreferrer"&gt;https://podcast.hectorfernandez.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's keep building&lt;/p&gt;

</description>
      <category>cloudnative</category>
      <category>productivity</category>
      <category>developmentcycle</category>
      <category>development</category>
    </item>
    <item>
      <title>Cloud, tu caja de herramientas personal</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Wed, 21 Jun 2023 01:42:46 +0000</pubDate>
      <link>https://forem.com/aws-builders/cloud-tu-caja-de-herramientas-personal-2a56</link>
      <guid>https://forem.com/aws-builders/cloud-tu-caja-de-herramientas-personal-2a56</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Imagina que eres un albañil y el mundo cloud es como una gran &lt;strong&gt;caja de herramientas&lt;/strong&gt;, todas listas para usar. Un programador es como ese albañil, pero en lugar de construir casas o edificios, construye programas y aplicaciones.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Enfrentándose a desafíos del mundo cloud te dará como programador un montón de herramientas nuevas y geniales para jugar. Estas herramientas ayudan a los programadores a hacer cosas más rápido, mejor y más fácil que antes. &lt;/p&gt;

&lt;p&gt;Por ejemplo, en lugar de tener que construir una casa pieza por pieza, ahora pueden usar una máquina que construye muros completos en poco tiempo, o en lugar de hacer una puerta que crees será impenetrable, contratas a un tercero que tiene un sistema monitoreo centralizado, con lo último en vanguardia en detección de amenazas. &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%2Fqjtlbn1sb8d8s3bq3yvk.jpg" 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%2Fqjtlbn1sb8d8s3bq3yvk.jpg" alt="usar una máquina que construye muros completos" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Ahora, creo que entiendes por donde viene la mano no? Fíjate que hablando de todas estas características, no he tocado el tema del costo, no es que sea menos importante. Simplemente, que para entrar de lleno debemos primero reconocer las herramientas, antes de siquiera utilizarlas. &lt;/p&gt;

&lt;h3&gt;
  
  
  Entonces, ¿cómo puede un programador aprovechar estas herramientas?
&lt;/h3&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%2Fmvw4srf69eb8x85wns3y.gif" 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%2Fmvw4srf69eb8x85wns3y.gif" alt="Coding" width="480" height="360"&gt;&lt;/a&gt;Digamos que un programador quiere hacer una aplicación para tomar fotos y compartirlas con amigos. En lugar de comenzar desde cero, pueden buscar en la caja de herramientas "Cloud" y encontrar cosas que te faciliten la vida.&lt;/p&gt;

&lt;p&gt;Por dar un ejemplo, puedes encontrar una herramienta que te ayude a guardar todas esas fotos sin tener que preocuparse por quedarse sin espacio, o sobre dimensionar el espacio que necesitarás para recién arrancar, especular no es la idea estando en el mundo cloud. &lt;/p&gt;

&lt;p&gt;Otro caso de ejemplo, podrías encontrar otra herramienta para enviarle esa misma foto a tus amigos de forma fácil y segura, sin necesidad de moverla. Esa es la gran diferencia de trabajar en la nube, siguiendo con la analogía de la construcción puedes crear una estructura base y luego crear nuevos pisos, y hasta una piscina si te pones creativo. &lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Ya sabes, el mundo cloud les da a los programadores muchas maneras geniales de hacer su trabajo más fácil y divertido, no tengas miedo, &lt;em&gt;comienza a probar y a profesionalizarte.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Es como si tuvieras una caja de herramientas mágicas llena de cosas sorprendentes, que si lo hicieras por tu cuenta, pasarías un montón de tiempo solamente desarrollando un martillo, sin llegar a dar una solución real a tu problema. &lt;/p&gt;




&lt;p&gt;¿Te gustaría que estemos en 📩 contacto?&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/hectorfernandez02/" rel="noopener noreferrer"&gt;Hector Fernandez, AWS Builder&lt;/a&gt;&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%2Fakgtppo22zbrww2dcp0r.jpg" 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%2Fakgtppo22zbrww2dcp0r.jpg" alt="Hector Fernandez AWS Community Builder" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
Héctor Fernández&lt;br&gt;
AWS Community Builder (Uruguay)&lt;br&gt;
&lt;a href="https://hector.builders/" rel="noopener noreferrer"&gt;https://hector.builders/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>backend</category>
    </item>
    <item>
      <title>Serverless, no es todo en la vida.</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Fri, 19 May 2023 10:05:00 +0000</pubDate>
      <link>https://forem.com/aws-builders/serverless-no-es-todo-en-la-vida-3o90</link>
      <guid>https://forem.com/aws-builders/serverless-no-es-todo-en-la-vida-3o90</guid>
      <description>&lt;h2&gt;
  
  
  Serverless:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es y cómo funciona?
&lt;/h3&gt;

&lt;p&gt;En este episodio vamos hablar como funciona, los casos de éxitos más conocidos y algún dato actual. Cómo lo es el caso de Amazon Prime Video pasó de tener una arquitectura 100% serverless a una arquitectura monolítica, o bueno algo parecido a ello. &lt;/p&gt;




&lt;p&gt;Creado originalmente en formato Podcast, puedes escucharlo acá: &lt;br&gt;
&lt;a href="https://cloudparatodos.substack.com/p/episodio-2-serverless-no-es-todo#details" rel="noopener noreferrer"&gt;Podcast: Cloud para Todos&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Ventajas y desventajas de usar serverless:
&lt;/h3&gt;

&lt;p&gt;Nos adentraremos a definir arquitectura  y cómo tomar decisiones informadas a la hora de elegir esta arquitectura.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ejemplos de aplicaciones serverless exitosas
&lt;/h3&gt;

&lt;p&gt;En este episodio podrías compartir algunos casos de éxito en el uso de arquitectura serverless, y cómo estas aplicaciones han mejorado la eficiencia y escalabilidad de sus sistemas.&lt;/p&gt;

&lt;p&gt;Recientemente Amazon Prime Video levantó muchos comentarios, entre adictos a la tecnología serverless y otros que no lo están tanto. Ya que informó los cambios que hicieron para hacer más eficiente su arquitectura de análisis. Pasaron de tener una arquitectura totalmente distribuida en serverless, usando step functions y otros artilugios totalmente nativos de la nube para pasar a usar una arquitectura un poco más simple, un monolito. &lt;/p&gt;

&lt;p&gt;Parece un poco extraño, pero si observamos los detalles de la publicación y las posteriores comunicaciones, todo fue en pro de aprovechar mejor los recursos. Recordemos que en la nube, todo lo que se usa tiene costo y requiere algún tipo de configuración. &lt;/p&gt;

&lt;h3&gt;
  
  
  Cómo empezar a trabajar con serverless: herramientas y recursos útiles:
&lt;/h3&gt;

&lt;p&gt;Antes que nada, si estás aprendiendo algún lenguaje de programación y quieres hacer un 2x1 en tecnología, STOP. Primero aprende como funciona el lenguaje, su diseño básico, patrones y luego entrega con una arquitectura, en este caso Serverles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mejores prácticas para desarrollar aplicaciones serverless:
&lt;/h3&gt;

&lt;p&gt;En este episodio podrías compartir consejos prácticos para desarrollar aplicaciones serverless eficientes, escalables y seguras.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitectura de aplicaciones serverless:
&lt;/h3&gt;

&lt;p&gt;Cómo diseñar una aplicación escalable y segura - En este episodio podrías profundizar en la arquitectura de las aplicaciones serverless, cómo diseñarlas de manera escalable y segura, así como compartir buenas prácticas para su gestión.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integración de servicios en aplicaciones serverless:
&lt;/h3&gt;

&lt;p&gt;Bases de datos, sistemas de autenticación, notificaciones, entre otros - En este episodio podrías compartir consejos para integrar servicios externos en aplicaciones serverless, como bases de datos, sistemas de autenticación, notificaciones, entre otros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consejos para la gestión y monitorización de aplicaciones serverless:
&lt;/h3&gt;

&lt;p&gt;En este episodio podrías compartir consejos para la gestión y monitorización de aplicaciones serverless, cómo mantenerlas actualizadas y asegurar su rendimiento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://cloudparatodos.substack.com/p/episodio-2-serverless-no-es-todo#details" rel="noopener noreferrer"&gt;Cloud para Todos Podcast&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
¡No te pierdas nuestro podcast! Descubre historias fascinantes contadas por expertos en cada tema. &lt;br&gt;
¡Suscríbete ahora y no te pierdas ningún episodio! &lt;/p&gt;

&lt;p&gt;🎧🔥 #Podcast #HistoriasFascinantes #NoTeLoPierdas&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>aws</category>
      <category>podcast</category>
    </item>
    <item>
      <title>Utilizar el menor privilegio en AWS IAM + Webs para validar tus políticas</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Wed, 17 May 2023 21:39:22 +0000</pubDate>
      <link>https://forem.com/aws-builders/utilizar-el-menor-privilegio-en-aws-iam-webs-para-validar-tus-politicas-m25</link>
      <guid>https://forem.com/aws-builders/utilizar-el-menor-privilegio-en-aws-iam-webs-para-validar-tus-politicas-m25</guid>
      <description>&lt;p&gt;TL;DR&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Aplicando el menor privilegio en AWS IAM es fundamental para mantener la 🔑 seguridad de tu entorno de trabajo.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;¿Qué es el principio de menor privilegio?&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dentro de AWS IAM (Identity and Access Management) se refiere a la práctica de otorgar a los usuarios y recursos solo los privilegios y permisos necesarios para realizar sus tareas específicas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Es decir, dando permisos de lectura solamente a los usuarios/apps que lo necesiten, si otro usuario/app necesita un permiso de escritura debemos explícitamente indicarlo. &lt;/p&gt;

&lt;p&gt;En resumen ejecutando el principio de menor privilegio podrás:&lt;br&gt;
✅ Reducir errores&lt;br&gt;
✅ Cumplir con los requerimientos&lt;br&gt;
✅ Tener un mayor control&lt;br&gt;
✅ Facilitar la administración&lt;br&gt;
✅ Escalar fácilmente &lt;/p&gt;




&lt;h2&gt;
  
  
  ¿No sabes como crear una condición basada en ARN?
&lt;/h2&gt;

&lt;p&gt;Te dejo unas URL para que puedas ver como crear una condición basada en ARNs.&lt;br&gt;
&lt;a href="https://www.awsiamactions.io/" rel="noopener noreferrer"&gt;https://www.awsiamactions.io/&lt;/a&gt;&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%2Fpb9djxtw8ten79somj4j.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%2Fpb9djxtw8ten79somj4j.png" alt="Condiciones de policy basada en ARN" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ¿Qué ganamos al aplicar el menor principio de menor privilegio?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔻 Seguridad:
&lt;/h3&gt;

&lt;p&gt;Reduces drásticamente las posibles violaciones a tu sistema, mitigando cualquier impacto posterior que pueda ocurrir. No debemos de confiar en la “buena fe” siempre debemos actuar con cautela ante usuarios malintencionados.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔻 Normativas:
&lt;/h3&gt;

&lt;p&gt;Muchos estándares (cómo el PCI) requieren que otorgues la menor cantidad de privilegios en tus cargas de trabajo, por eso al hacerlo desde un principio ya estarás cumpliendo con ello.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔻 Menos errores:
&lt;/h3&gt;

&lt;p&gt;Bajas mucho la posibilidad que alguien haga algo que no tenía los permisos, como el caso de que escriban en una base de datos por ejemplo, así podríamos tener muchos casos. &lt;/p&gt;

&lt;h3&gt;
  
  
  🔻 Control:
&lt;/h3&gt;

&lt;p&gt;Cuando damos los privilegios de forma segmentada, podemos saber en todo momento que/quien tiene acceso a qué, por lo que nos aseguramos de tener todo controlado.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔻 Escalar:
&lt;/h3&gt;

&lt;p&gt;En la nube todo es escalable, recordemos que puede ser hacía más o menos, por lo que podemos dar permisos o quitarlos de forma muy fácil. &lt;/p&gt;




&lt;h2&gt;
  
  
  Recuerda:
&lt;/h2&gt;

&lt;p&gt;Cuando asignamos sólo los permisos necesarios para realizar tareas específicas, minimizas los riesgos y mantenemos un entorno seguro y protegido.&lt;/p&gt;

&lt;p&gt;¿Qué herramienta utilizas en tu día a día?&lt;/p&gt;




&lt;p&gt;¿Te gustaría que estemos en 📩 contacto?&lt;br&gt;
Hector Fernandez, AWS Builder&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%2Fakgtppo22zbrww2dcp0r.jpg" 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%2Fakgtppo22zbrww2dcp0r.jpg" alt="Hector Fernandez AWS Community Builder" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
Héctor Fernández&lt;br&gt;
AWS Community Builder (Uruguay)&lt;br&gt;
&lt;a href="https://hector.builders/" rel="noopener noreferrer"&gt;https://hector.builders/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>security</category>
      <category>webdev</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Paso a paso: Cómo mejorar la seguridad de tu aplicación frontend usando AWS Secret Manager, ejemplo con VueJs</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Mon, 03 Apr 2023 12:30:00 +0000</pubDate>
      <link>https://forem.com/aws-builders/paso-a-paso-como-mejorar-la-seguridad-de-tu-aplicacion-frontend-usando-aws-secret-manager-ejemplo-con-vuejs-41hi</link>
      <guid>https://forem.com/aws-builders/paso-a-paso-como-mejorar-la-seguridad-de-tu-aplicacion-frontend-usando-aws-secret-manager-ejemplo-con-vuejs-41hi</guid>
      <description>&lt;p&gt;Hoy vamos a tratar un tema que muchas veces pasamos por alto, la seguridad en aplicaciones frontend (aplicable también para backend), creemos porque son API KEY podemos simplemente dejarla de forma estática en el código, pero cuando se ven comprometidas no sabemos cómo remediar esta situación, hoy te traigo una idea de como lidiar con este problema. &lt;/p&gt;




&lt;h2&gt;
  
  
  Agenda del post:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;La responsabilidad en términos de seguridad para aplicaciones Frontend&lt;/li&gt;
&lt;li&gt;Localstorage, SessionStorage, inputs hiddens&lt;/li&gt;
&lt;li&gt;Archivos .ENV ¿Que debemos guardar?&lt;/li&gt;
&lt;li&gt;Por qué no debemos tener API KEYS de terceros en nuestro código&lt;/li&gt;
&lt;li&gt;AWS Secrets manager como vault de datos&lt;/li&gt;
&lt;li&gt;AWS Cognito para acceso temporal a nuestros recursos de AWS&lt;/li&gt;
&lt;li&gt;Código final usando AWS SDK v3 en VueJs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  La responsabilidad en términos de seguridad para aplicaciones Frontend: &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Contexto:&lt;/strong&gt;&lt;br&gt;
El desarrollo de aplicaciones frontend requiere de un certificado de seguridad SSL para evitar problemas con los navegadores web y mejorar el posicionamiento en los motores de búsqueda. Además, es necesario asegurar la información sensible como las credenciales de servicios de terceros (API KEY nominadas) no queden insertadas en el código.  Por último y no menos importante, este certificado (SSL) nos va permitir encriptar las conexiones que hagamos con nuestra aplicación backend (propia o de terceros). &lt;/p&gt;

&lt;p&gt;Durante el proceso de desarrollo de aplicaciones, de seguro has tenido acceso a credenciales de servicios de terceros (API KEY) que solamente deben ser utilizadas para ambientes de pruebas (localhost) &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Como realmente aseguramos eso? &lt;br&gt;
Hoy en este artículo vamos a estar hablando de un proceso de gestión seguro y actualizado para las variables de entorno en el equipo de desarrollo utilizando AWS Secret Manager. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ya sea que recibas a un nuevo miembro al equipo o alguien salga del mismo, mantener esas credenciales de forma segura y actualizadas siempre fue un dolor de cabeza para cada encargado de seguridad en los equipos de desarrollo. &lt;/p&gt;

&lt;p&gt;Cómo líder por muchos años de equipos he probado muchas herramientas de gestión y casi todas recaen en la "buena fé" del desarrollador/a, por eso hoy te mostraré un proceso que he venido haciendo estos últimos tiempos. &lt;/p&gt;

&lt;p&gt;Comencemos hablando de situaciones que de seguro se te hacen familiares. &lt;/p&gt;
&lt;h2&gt;
  
  
  Guardar información sensible en LocalStorage &lt;a&gt;&lt;/a&gt;
&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%2Fe12tf2h14ek6t8mgssij.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%2Fe12tf2h14ek6t8mgssij.png" alt="(API KEY) que solamente deben ser utilizadas para ambientes de pruebas (localhost) " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Te hago un spoiler:&lt;/strong&gt;&lt;/em&gt; lo primero que verá cualquier analista de seguridad a tu aplicación frontend es buscar datos sensibles que el usuario final pueda tener acceso, con solo hacer F12 (consola de desarrollador) puedes entrar y ver el LocalStorage.&lt;br&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%2F4d6gilf6xb6dffqyrcn7.jpg" 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%2F4d6gilf6xb6dffqyrcn7.jpg" alt="Spoiler seguridad" width="236" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Así que la próxima vez que quieras guardar un número de identificación legal (C.I. / D.N.I / S.S.N), una contraseña o algo similar piensalo dos veces, hay cosas debajo del sofá que son más difíciles de encontrar que acá. &lt;/p&gt;
&lt;h2&gt;
  
  
  Archivos .ENV con información sensible &lt;a&gt;&lt;/a&gt;
&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%2Fu1naejzb3ozpjuea6z4r.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%2Fu1naejzb3ozpjuea6z4r.png" alt="Archivos .ENV con información sensible" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Partimos de un punto:&lt;/strong&gt; Dentro de tu repositorio de GIT no estás haciendo "commit" de datos sensibles en los archivos .ENV &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¿Porque así lo estás haciendo no? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Recuerda que las aplicaciones fronted se empaquetan y se entregan al navegador de forma completa (no entraremos acá en detalle del "&lt;em&gt;lazy load&lt;/em&gt;" o patrones similares), por lo tanto con simplemente examinar el código tendremos a todo lo que contiene la aplicación, este punto es clave para cuando quieras hacer algo cómo en tu .ENV:&lt;br&gt;
GOOLE_API_KEY=J64j564Mknss&lt;/p&gt;
&lt;h2&gt;
  
  
  Por qué no debemos tener API KEYS de terceros en nuestro código
&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%2Fernvntnljmts10z3o71o.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%2Fernvntnljmts10z3o71o.png" alt="stop" width="600" height="508"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;¡No lo hagas!, ya que al hacerlo estarás exponiendo esas credenciales a cualquier usuario de tu web. Sí, sí ya me dirás “Pero yo entro en la app de Google y le indico el dominio que quiero como whitelist”, y te diré es correcto &lt;strong&gt;PERO NO SUFICIENTE&lt;/strong&gt;, en términos de seguridad cada puerta que dejemos abierta es una oportunidad para que nuestros atacantes (intencionados o no) utilicen esa información para otros fines diferentes a los originales.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De seguro ya te estarás preguntando: &lt;em&gt;¿Si no tengo esa API KEY como hago para que mi aplicación funcione correctamente?&lt;/em&gt;, la respuesta corta es: necesitas &lt;strong&gt;llamar a un tercero para solicitar&lt;/strong&gt; esa información y recién ahí poder hacer el “request” que necesites. &lt;/p&gt;

&lt;p&gt;Antes de que pienses en la ineficiencia de este patrón de seguridad, déjame que te explique las ventajas antes.&lt;/p&gt;



&lt;p&gt;Imaginemos que por algún motivo esa API KEY se encuentra comprometida y quieres sustituirla por una nueva para remediar la situación, deberías hacer algo parecido a estos pasos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Si es una APP "Mobile", tendrás que crear una nueva versión, subirla al store correspondiente, luego liberar esa nueva versión y esperar a que todos tus usuarios se descarguen esta versión. Es un proceso lento y no escalable. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Por otro lado si es "Web", te tocará hacer algo similar; liberar una nueva versión, invalidar el caché (cosa que muchos no hacen en sus procesos de CI/CD) de aplicaciones web y esperar a que tus usuarios te visiten nuevamente y el navegador les entregue la última versión desplegada. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ambos escenarios como puedes observar podemos estar hablando de horas o días (en el caso de “APP Mobile”) que el &lt;strong&gt;atacante&lt;/strong&gt; podrá seguir utilizando nuestras credenciales para otros usos. Durante ese tiempo estaremos &lt;strong&gt;comprometiendo&lt;/strong&gt; a nuestros usuarios también. &lt;/p&gt;

&lt;p&gt;Acá es donde entra en juego un servicio de tercero para almacenar esta información , sin importar si tu aplicación en frontend o backend el funcionamiento es el mismo (una AWS Lambda por ejemplo).&lt;/p&gt;

&lt;p&gt;Un tercero almacena los datos sensibles y cada vez que los necesitemos los consultamos y los usamos. Así cuando nuestros datos lleguen a estar comprometidos o como medida de nuestras políticas de seguridad continua cambiaremos en un solo lugar y en cuestión de segundos ya nuestros usuarios estarán remediados. &lt;/p&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;br&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%2Flps5275f0r2eo44dlce7.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%2Flps5275f0r2eo44dlce7.png" alt="AWS Secrets Manager como vault de datos" width="800" height="941"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  AWS Secrets manager como vault de datos
&lt;/h2&gt;

&lt;p&gt;Concepto copiado textualmente de &lt;a href="https://aws.amazon.com/es/secrets-manager/faqs/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AWS Secrets Manager es un servicio de administración de datos confidenciales que ayuda a proteger el acceso a sus aplicaciones, servicios y recursos de TI. El servicio le permite alternar, administrar y recuperar fácilmente credenciales de bases de datos, claves de API y otros datos confidenciales durante todo su ciclo de vida. Con Secrets Manager, puede proteger y administrar los datos confidenciales utilizados para acceder a los recursos en la nube de AWS, en servicios de terceros y localmente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Acá podemos ver que no tenemos la necesidad de crear una solución propia para paliar con este problema de seguridad, utilizando un servicio como AWS Secrets Manager te quitas ese dolor de cabeza y lo mejor de todo que es compatible con motores de base de datos o API de terceros. &lt;/p&gt;
&lt;h3&gt;
  
  
  Resumamos a muy alto nivel el servicio como:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Guardas un “Secret” como le suelen llamar, en tu cuenta de AWS&lt;/li&gt;
&lt;li&gt;Ese “Secret” es cifrado en reposo (nadie más que tú tendrá acceso al dato plano), por lo tanto no hay forma de que quede expuesto. &lt;/li&gt;
&lt;li&gt;Mediante API o SDK de AWS vas a poder consumirlo fácilmente&lt;/li&gt;
&lt;li&gt;100% integrable con otros servicios como IAM y AWS Cognito (más adelante veremos el caso práctico).&lt;/li&gt;
&lt;li&gt;Podrás entrar en tu consola de AWS y cambiar el valor las veces que quieras sin necesidad de informar a quien lo esté consumiendo. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este servicio te permite como desarrollador frontend hacer despliegue de tus aplicaciones sin necesidad de exponer datos sensibles durante el proceso de CI/CD ni durante el empaquetado final. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;¿Cuántas veces no le preguntaste a tu colega por una API KEY de tercero y mandarla mediante chats? Sin hablar de cuando cambiaban y nadie te avisaba al respecto y solo recibías un “401 Unauthorized” sin entender el motivo aparente.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Amazon Cognito: para acceso temporal a nuestros recursos dentro de AWS &lt;a&gt;&lt;/a&gt;
&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%2Fod31l61x5r1dcvcgcpw0.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%2Fod31l61x5r1dcvcgcpw0.png" alt="Amazon Cognito es un servicio de administración de acceso e identidad del cliente (IAM)" width="800" height="941"&gt;&lt;/a&gt;&lt;br&gt;
Esta solución parece perfecta para una aplicación backend, ya que podemos limitar la conexión de forma centralizada hacia el secret manager, pero acá estamos hablando de aplicaciones frontend, por eso entra en juego el servicio de “AWS Cognito”. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Texto copiado de AWS:&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Amazon Cognito es un servicio de administración de acceso e identidad del cliente (IAM) rentable y centrado en el desarrollador. Proporciona un almacén de identidad seguro y opciones de federación que pueden escalar a millones de usuarios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mediante AWS Cognito, vamos a poder otorgar credenciales temporales a nuestros usuarios anónimos para que puedan consumir los secretos almacenados en AWS Secret Manager sin necesidad de exponer datos sensibles. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Las identidades de Amazon Cognito NO son credenciales. Se intercambian por credenciales utilizando la compatibilidad con las identidades web federadas de AWS Security Token Service (AWS STS).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En los siguientes pasos vamos a poder ver cómo lograr intercambiar identidades de AWS Cognito por las credenciales temporales (con acceso limitado) que podremos utilizar con AWS Secret Manager para finalmente consumir nuestra aplicación de terceros. &lt;/p&gt;

&lt;p&gt;Parece super largo el proceso, pero son simplemente unas líneas de código. &lt;/p&gt;


&lt;h2&gt;
  
  
  Código de ejemplo (Vue Js)
&lt;/h2&gt;

&lt;p&gt;Primero debemos usar Identidades de &lt;strong&gt;AWS Cognito&lt;/strong&gt; para acceder a nuestros recursos de AWS&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%2Frkqrb1l9mdngy4a50223.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%2Frkqrb1l9mdngy4a50223.png" alt="Usar Identidades de AWS Cognito" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo primero que vamos hacer es crear una “identity pool” dentro de las entidades federadas de AWS Cognito. &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%2Fave39ikgansn0930qcpx.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%2Fave39ikgansn0930qcpx.png" alt="crear “identity pool” dentro de las entidades federadas de AWS Cognito" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Link:&lt;br&gt;
&lt;code&gt;https://us-east-1.console.aws.amazon.com/cognito/federated?region=us-east-1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Definimos nuestro nombre para la “Identity pool name” y nos aseguramos que esté habilitado la opción de “Enable access to unauthenticated identities”. Creamos el “Pool”&lt;/p&gt;

&lt;p&gt;Vamos a necesitar crear un ROL para los usuarios “unauthenticated“, con permisos de acceder a Secret Manager usando la siguiente Policy, para eso en el paso 2 hacer click en ver detalles.&lt;br&gt;
El primer Rol lo dejamos por defecto, nos centraremos en el “unauthenticated Role”. &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%2F6dwjr34vybblzwan5u9s.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%2F6dwjr34vybblzwan5u9s.png" alt="ROL para los usuarios “unauthenticated“ AWS Cognito" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Editamos la Policy y añadimos lo siguiente dentro de statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Sid": "VisualEditor0",
  "Effect": "Allow",
  "Action": "secretsmanager:GetSecretValue",
  "Resource": "*"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Dejamos la consola de AWS por un momento, y vamos a nuestro proyecto javascript. Para fines prácticos lo haremos en VueJs pero lo puedes hacer en cualquier librería (Angular, React, Vanilla JS).&lt;/p&gt;

&lt;p&gt;Vamos a nuestro proyecto a instalamos la siguiente librería de AWS SDK V3, la cual nos permite instalar las dependencias de forma bastante granular, haciendo que nuestra aplicación sea lo más liviana posible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i @aws-sdk/credential-providers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Esta librería nos va permitir intercambiar nuestro IdentityPool ID por unas credenciales basadas en accessKeyId y secretAccessKey&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i @aws-sdk/client-cognito-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Es el cliente de Cognito&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i @aws-sdk/client-secrets-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Nos permite acceder a AWS Secret Manager mediante su SDK, teniendo en texto plano del valor guardado en el “secreto”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;TIP:&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Siempre que sea posible, utiliza la &lt;strong&gt;&lt;a href="https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/index.html" rel="noopener noreferrer"&gt;AWS SDK v3 Javascript&lt;/a&gt;&lt;/strong&gt;, te quitará dolores de cabeza en el futuro,  aún cuando los ejemplos que veas en internet tengan la referencia a la SDK v2 (deprecated). &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Siempre investigando el método que quieras utilizar lograrás encontrar la documentación oficial. &lt;/p&gt;




&lt;p&gt;Volvemos a la consola: en AWS Secret Manager para crear nuestro secreto (“Secret”)&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%2Ft3hhbx88vyvqtvtqq1l1.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%2Ft3hhbx88vyvqtvtqq1l1.png" alt="AWS Secret Manager para crear nuestro secreto (“Secret”)" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la parte de tipo seleccionamos otro (“Other”), y escribimos un texto plano&lt;/p&gt;

&lt;p&gt;Y completamos los datos como la siguiente imagen&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%2Fajbfngw9lkss87qw4a99.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%2Fajbfngw9lkss87qw4a99.png" alt="Texto plano secret Manager" width="740" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Damos siguiente y dejamos un nombre para nuestro secreto.&lt;/p&gt;

&lt;p&gt;Una buena práctica es indicar como prefijo el ambiente seguido del nombre que le queremos dar por ejemplo para local/dev sería: &lt;br&gt;
&lt;code&gt;dev/google_maps_apikey&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ambiente te Testing/QA&lt;br&gt;
&lt;code&gt;test/google_maps_apikey&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ambiente Productivo&lt;br&gt;
&lt;code&gt;prod/google_maps_apikey&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;De esta forma tendremos granularidad en los permisos y/o personas que tengan acceso.&lt;br&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%2Fptcgphqv2nm2ee6y201g.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%2Fptcgphqv2nm2ee6y201g.png" alt="De esta forma tendremos granularidad en los permisos y/o personas que tengan acceso en secret manager" width="740" height="860"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; dale continuar, continuar hasta que te diga “Guardar Secreto” ya que los otros pasos son opcionales para este ejemplo. &lt;/p&gt;

&lt;p&gt;Ya con esto tendremos nuestro secreto almacenado en la nube, encriptado y seguro. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;(opcional)&lt;/em&gt;&lt;br&gt;
Si queremos ver el valor que tenemos almacenado simplemente &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vamos a la lista de secretos, seleccionamos el secreto .&lt;/li&gt;
&lt;li&gt;Dentro hacemos click en retrieve value.&lt;/li&gt;
&lt;/ul&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%2F3qvhkdajfekgscc5uexm.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%2F3qvhkdajfekgscc5uexm.png" alt="lista de secretos en aws secret manager" width="800" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(opcional ver el secreto)&lt;br&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%2Ffw1716jbpj7b3sfjrdld.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%2Ffw1716jbpj7b3sfjrdld.png" alt="opcional ver el secreto" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Tomen nota del ARN
&lt;/h4&gt;

&lt;p&gt;(lo utilizaremos más adelante).&lt;br&gt;
&lt;code&gt;arn:aws:secretsmanager:us-east-1:058452286234:secret:dev/google_maps_apikey-mMforO&lt;/code&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Última parte, conectar todo ¡Ya casi estamos!
&lt;/h3&gt;

&lt;p&gt;Continuemos con nuestra app frontend, volvemos al editor de código. &lt;/p&gt;

&lt;p&gt;En pasos anteriores habíamos instalado una serie de dependencias, nosotros vamos a estar utilizando la función “fromCognitoIdentityPool” la cual nos permite hacer el intercambio del ID por credenciales temporales como dijimos anteriormente. &lt;/p&gt;

&lt;p&gt;Importamos todo lo que necesitamos en nuestro componente de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { CognitoIdentityClient } from "@aws-sdk/client-cognito-identity";
import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers";
import {
  SecretsManagerClient,
  GetSecretValueCommand,
} from "@aws-sdk/client-secrets-manager";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(importación usando método ECMAScript 6 si estás aplicando esta config a un sistema legacy puedes buscar en la documentación como importar usando ES5)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para poder tener en texto plano nuestro secreto debemos crear un cliente y pasarle un comando con el secreto que queremos ver, algo como esto (&lt;em&gt;NO USAR ésta solución en ambientes, meramente educativo. Más adelante tienes la solución&lt;/em&gt;)&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%2F9om92so8rkonm0thxy0e.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%2F9om92so8rkonm0thxy0e.png" alt="Cliente de secret manager" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Problema de seguridad encontrado:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NUNCA debemos colocar accessKeyId ni secretAccessKey&lt;br&gt;
 en nuestros códigos&lt;/em&gt;&lt;/strong&gt;, por eso esta solucion no es la más recomendada. &lt;/p&gt;

&lt;p&gt;Al principio de todo el capitulo estabamos hablando de Amazon Cognito, y acá es cuando entra en juego, vamos a cambiar nuestro identitypoolId por una credenciales temporales de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; const region = "us-east-1"; 
// Cambia esto a la región donde está configurado tu recurso de Secret Manager
      const identityPoolId = "us-east-1:1b5cc45e-490e-439e-8692-a27a54ae029a"; 
// Cambia esto a tu ID de Identity Pool
const tempCredentials = fromCognitoIdentityPool({
        client: new CognitoIdentityClient({ region }),
        identityPoolId,
        clientConfig: { region },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Te resumo lo que estamos usando: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;CognitoIdentityClient&lt;/code&gt;&lt;br&gt;
Para obtener las credenciales temporales desde AWS Identity Pool &lt;/p&gt;

&lt;p&gt;&lt;code&gt;fromCognitoIdentityPool&lt;/code&gt;&lt;br&gt;
de @aws-sdk/credential-provider-cognito-identity para crear un proveedor de credenciales que utilizará el cliente de Secret Manager. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;GetSecretValueCommand&lt;/code&gt;&lt;br&gt;
Obtener el valor del secreto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ** Código con la solución final **&lt;a&gt;&lt;/a&gt;
&lt;/h3&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%2Fjlzarc0798twhi9savcx.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%2Fjlzarc0798twhi9savcx.png" alt="AWS Secret Manager, con Amazon Cognito Identity Pool mediante VueJs" width="800" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Repositorio GIT de ejemplo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/hectorfernandez02/cloudparatodos-aws-secret-manager-vuejs" rel="noopener noreferrer"&gt;https://github.com/hectorfernandez02/cloudparatodos-aws-secret-manager-vuejs&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusiones:
&lt;/h2&gt;

&lt;p&gt;Recomendamos guardar información sensible, como claves de API, contraseñas y números de identificación legal (C.I. / D.N.I / S.S.N), en Secret Manager en lugar de en variables de entorno. Por otro lado, se pueden guardar en variables de entorno otras configuraciones de la aplicación, como la URL de la aplicación, la configuración del servidor, las claves de API públicas (no nominadas), etc.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>aws</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Buscar un recurso, usando Resource Explorer de AWS</title>
      <dc:creator>Hector Fernandez CloudparaTodo</dc:creator>
      <pubDate>Wed, 09 Nov 2022 15:04:40 +0000</pubDate>
      <link>https://forem.com/aws-builders/buscar-un-recurso-usando-resource-explorer-de-aws-3054</link>
      <guid>https://forem.com/aws-builders/buscar-un-recurso-usando-resource-explorer-de-aws-3054</guid>
      <description>&lt;p&gt;⚡Nueva feature para la ya complicada tarea de buscar un recurso dentro de AWS, los Resource Explorer.⚡&lt;/p&gt;

&lt;p&gt;Te permite buscar los recursos de todas las regiones en un solo lugar. &lt;/p&gt;

&lt;p&gt;✌️Está disponible para la consola de administración de AWS, así como para la CLI de AWS. &lt;/p&gt;

&lt;p&gt;🟢Documentación: &lt;a href="https://lnkd.in/e2W6hA4U" rel="noopener noreferrer"&gt;https://lnkd.in/e2W6hA4U&lt;/a&gt; &lt;br&gt;
🟢Debe habilitar el explorador de recursos en &lt;a href="https://lnkd.in/ei4csrBn" rel="noopener noreferrer"&gt;https://lnkd.in/ei4csrBn&lt;/a&gt; &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%2Fry4b37urzv4ck7xy363t.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%2Fry4b37urzv4ck7xy363t.png" alt="Resource Explorer" width="800" height="186"&gt;&lt;/a&gt;&lt;br&gt;
Luego de que tengas habilitado simplemente en la barra de búsqueda puedes escribir "/resources" y buscar cualquier recurso en tu cuenta (sin importar la region)&lt;/p&gt;

&lt;p&gt;Puedes encontrar recursos en su cuenta de AWS en todas las regiones utilizando metadatos como nombres, etiquetas e incluso ID. Cuando encuentra un recurso en la consola de administración de AWS, puede pasar rápidamente de los resultados de búsqueda a la consola de servicio y la región correspondientes para comenzar a trabajar en ese recurso. &lt;/p&gt;

&lt;p&gt;Igualmente, puede utilizar la interfaz de línea de comandos (CLI) de AWS o cualquiera de los SDK de AWS para encontrar recursos en sus herramientas de automatización.&lt;/p&gt;

&lt;p&gt;¿ya usas el CLI o solamente usás el dashboard?&lt;/p&gt;

&lt;p&gt;--&lt;br&gt;
Soy desarrollador. Trabajo con código todo el día. También estoy certificado como Arquitecto de AWS. ¿Cómo conseguí obtener dos certificaciones en tan poco tiempo? No fue fácil, pero definitivamente valió la pena.&lt;/p&gt;

&lt;p&gt;¿Te gustaría que estemos en 📩 contacto? &lt;br&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%2Firkeh0ojicukeqe10fmc.jpg" 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%2Firkeh0ojicukeqe10fmc.jpg" alt="Hector Fernandez, AWS Builder" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Héctor Fernández&lt;br&gt;
AWS Community Builder (Uruguay)&lt;br&gt;
&lt;a href="https://hector.builders/" rel="noopener noreferrer"&gt;https://hector.builders/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>console</category>
      <category>devops</category>
      <category>devlive</category>
    </item>
  </channel>
</rss>
