logo
Menu
Diagramas para CDK/Terraform con Claude 3 en Amazon Bedrock

Diagramas para CDK/Terraform con Claude 3 en Amazon Bedrock

Usa la IA para generar infraestructura como código a partir de diagramas e imágenes de arquitectura

Deepayan Pandharkar
Amazon Employee
Published Mar 5, 2024
Last Modified Mar 15, 2024
Actualización #1: Se ha actualizado el contenido para incorporar los comentarios.

Introducción

En el mundo actual nativo de la nube, la infraestructura como código (IaC) se ha convertido en una práctica indispensable para los desarrolladores y los equipos de DevOps.
Con el reciente anuncio del soneto de Claude 3 en Amazon Bedrock y sus capacidades de conversión de imagen a texto, comienza una nueva era de integración perfecta entre los diagramas de arquitectura y las herramientas de IaC, como el Kit de desarrollo en la nube (CDK) de AWS o Terraform.
En esta entrada de blog se explicará cómo puedes aprovechar la potencia de esta integración para agilizar los procesos de aprovisionamiento y gestión de la infraestructura.

Diagramas de arquitectura

Los diagramas de arquitectura son una representación visual de los componentes del sistema, sus relaciones y la estructura general de tu aplicación o infraestructura. Sirven de modelo para la comunicación, la colaboración y la toma de decisiones entre los miembros del equipo. Sin embargo, traducir manualmente estos diagramas en código puede llevar mucho tiempo y ser propenso a errores, especialmente en entornos complejos.

Introduce el soneto de Claude 3 en Amazon Bedrock

Anthropic ha lanzado una nueva línea de modelos de IA llamada la familia Claude 3, y estos chicos malos son heteros. Estamos hablando del Claude 3 Opus, el Claude 3 Sonnet y el Claude 3 Haiku, la próxima generación de modelos de última generación que te dejarán boquiabierto.
Tiene la capacidad de analizar el texto de las imágenes. Esto es lo que vamos a utilizar en nuestra solución. https://www.anthropic.com/news/claude-3-family
En cuanto al rendimiento, en lo que respecta a la mayoría de las cargas de trabajo, el modelo Sonnet es el verdadero MVP. Es más rápido que los modelos Claude 2 y 2.1 anteriores de Anthropic, tanto en las entradas como en las salidas, y tiene un gran impacto con niveles de inteligencia más altos. Pero eso no es todo. El Sonnet también es más orientable, lo que significa que se obtienen resultados más predecibles y de mayor calidad. ¡Habla de una situación en la que todos ganan!
Aquí es donde se pone aún mejor
Amazon Bedrock ha anunciado su apoyo a la familia Anthropic Claude 3. https://www.aboutamazon.com/news/aws/amazon-bedrock-anthropic-ai-claude-3
Amazon Bedrock es un servicio totalmente gestionado que es como una ventanilla única para todo lo relacionado con la IA generativa. Con Bedrock, puedes elegir entre una gama de modelos básicos de alto rendimiento de las principales empresas de IA, como Anthropic, y viene repleto de funciones para crear y escalar aplicaciones de IA generativa en un abrir y cerrar de ojos.

Solución

Vale, pues pasemos directamente a la solución. Sigue los pasos que aparecen a continuación para conseguir un extractor de arquitectura para ti.
Para este tutorial, debes cumplir los siguientes requisitos previos:

Sigue los pasos siguientes

Paso 1: Activar el soneto antrópico de Claude 3 en Amazon Bedrock
Paso 2: Crea un archivo llamado claude_vision.py y copia el siguiente código
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import base64
import json
import os

import boto3
import click
from botocore.exceptions import ClientError

def call_claude_multi_model(bedrock_runtime, model_id, input_text, image, max_tokens):
"""
Streams the response from a multimodal prompt.
Args:
bedrock_runtime: The Amazon Bedrock boto3 client.
model_id (str): The model ID to use.
input_text (str) : The prompt text
image (str) : The path to an image that you want in the prompt.
max_tokens (int) : The maximum number of tokens to generate.
Returns:
None.
"""


with open(image, "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())

body = json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": max_tokens,
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": input_text},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": encoded_string.decode("utf-8"),
},
},
],
}
],
}
)

response = bedrock_runtime.invoke_model_with_response_stream(
body=body, modelId=model_id
)

for event in response.get("body"):
chunk = json.loads(event["chunk"]["bytes"])

if chunk["type"] == "content_block_delta":
if chunk["delta"]["type"] == "text_delta":
print(chunk["delta"]["text"], end="")

@click.command()
@click.option("--image_path", prompt="path to image", help="Image you want to parse")
def main(image_path):
"""
Entrypoint for Anthropic Claude Sonnet multimodal prompt example.
"""


model_id = "anthropic.claude-3-sonnet-20240229-v1:0"
input_text = """
You are a AWS solution architect,
The image provided is an architecture diagram. Use two heading to explain below.
1. Explain the technical data flow in detail.
2. Provide cdk typescript code to implement using aws-cdk-lib

Do not:
1. use preambles.
2. make assumptions.
"""

max_tokens = 4000

try:

bedrock_runtime = boto3.client("bedrock-runtime")

call_claude_multi_model(
bedrock_runtime,
model_id,
input_text,
os.path.abspath(image_path),
max_tokens,
)

except ClientError as err:
message = err.response["Error"]["Message"]
logger.error("A client error occurred: %s", message)
print("A client error occured: " + format(message))

if __name__ == "__main__":
main()
Paso 3: Anota la ruta del archivo de imagen. Con fines de demostración, utilizaré el siguiente diagrama, guardado como s3_extractor.png en el disco local.
Paso 4: Ejecuta el guion python src/utils/claude_vision.py --image_path ~/Desktop/s3_extractor.png y guarda el resultado.
He aquí un ejemplo de respuesta
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
$ python src/utils/claude_vision.py --image_path ~/Desktop/s3_extractor.png

Technical Data Flow Explanation

The architecture diagram depicts a serverless data pipeline using AWS services. The data flow can be described as follows:

1. An Amazon S3 bucket is the source of data, which likely contains files or objects that need to be processed.
2. When a new object is uploaded or modified in the S3 bucket, it triggers an AWS Lambda function named "LambdaExtractor."
3. The LambdaExtractor function is responsible for extracting relevant data or events from the input files or objects in the S3 bucket.
4. After processing, the extracted data or events are stored in an Amazon DynamoDB table named "StoreEventsDB."

CDK Typescript Code Implementation

To implement this architecture using the AWS Cloud Development Kit (CDK) and TypeScript, you can use the following code:

```typescript
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import * as lambdaEventSources from 'aws-cdk-lib/aws-lambda-event-sources';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'DataPipelineStack');

// Create the S3 bucket
const sourceBucket = new s3.Bucket(stack, 'SourceBucket');

// Create the DynamoDB table
const eventsTable = new dynamodb.Table(stack, 'StoreEventsDB', {
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});

// Create the Lambda function
const lambdaExtractor = new lambda.Function(stack, 'LambdaExtractor', {
runtime: lambda.Runtime.NODEJS_14_X,
code: lambda.Code.fromAsset('lambda'),
handler: 'hello.handler',
environment: {
EVENTS_TABLE_NAME: eventsTable.tableName,
},
});

// Grant permissions for the Lambda function to access the DynamoDB table
eventsTable.grantWriteData(lambdaExtractor);

// Create the S3 event source and associate it with the Lambda function
lambdaExtractor.addEventSource(
new lambdaEventSources.S3EventSource(sourceBucket, {
events: [s3.EventType.OBJECT_CREATED, s3.EventType.OBJECT_REMOVED],
recursive: true,
})
);
```

In this code:

1. An S3 bucket named "SourceBucket" is created to serve as the source of data.
2. A DynamoDB table named "StoreEventsDB" is created with a partition key "id" of type string.
3. A Lambda function named "LambdaExtractor" is created with the provided source code and environment variables.
4. The Lambda function is granted write permissions to the DynamoDB table.
5. An S3 event source is created and associated with the Lambda function, triggering the function when objects are created or removed from the "SourceBucket."

Note: You need to replace 'lambda/hello.js' to your Lambda function code, and provide the necessary logic in the Lambda function to extract data from the S3 objects and store it in the DynamoDB table.
Paso 5: Inicializar un proyecto de CDK y actualizarlo copiando las partes del código pertinentes. Ahora puedes copiar el código tal como está para que funcione, pero voy a hacer un par de cambios más para seguir las mejores prácticas. Una es copiar solo el código de recursos de Stack Construct en el directorio /lib y la otra es cambiar el ámbito de esta palabra clave. Ten en cuenta que GenAI puede generar el mismo resultado directamente modificando el mensaje.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
> cdk init --language=typescript --generate-only
Applying project template app for typescript
# Welcome to your CDK TypeScript project

This is a blank project for CDK development with TypeScript.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

* `npm run build` compile typescript to js
* `npm run watch` watch for changes and compile
* `npm run test` perform the jest unit tests
* `npx cdk deploy` deploy this stack to your default AWS account/region
* `npx cdk diff` compare deployed stack with current state
* `npx cdk synth` emits the synthesized CloudFormation template

✅ All done!
****************************************************
*** Newer version of CDK is available [2.131.0] ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************
Actualiza la construcción de la pila.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
cat lib/genai-iac-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import * as lambdaEventSources from 'aws-cdk-lib/aws-lambda-event-sources';
import { Construct } from 'constructs';

export class GenAiIacStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);

// Create the S3 bucket
const sourceBucket = new s3.Bucket(this, 'SourceBucket');

// Create the DynamoDB table
const eventsTable = new dynamodb.Table(this, 'StoreEventsDB', {
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
});

// Create the Lambda function
const lambdaExtractor = new lambda.Function(this, 'LambdaExtractor', {
runtime: lambda.Runtime.NODEJS_20_X,
code: lambda.Code.fromAsset('lambda'),
handler: 'hello.handler',
environment: {
EVENTS_TABLE_NAME: eventsTable.tableName,
},
});

// Grant permissions for the Lambda function to access the DynamoDB table
eventsTable.grantWriteData(lambdaExtractor);

// Create the S3 event source and associate it with the Lambda function
lambdaExtractor.addEventSource(
new lambdaEventSources.S3EventSource(sourceBucket, {
events: [s3.EventType.OBJECT_CREATED, s3.EventType.OBJECT_REMOVED],
})
);
}
}
Por fin crea un lambda carpeta en la raíz y crea una muestra hello.js archivo con el siguiente código de muestra.
1
2
3
4
5
6
7
8
9
exports.handler = async function(event) {
console.log("request:", JSON.stringify(event, undefined, 2));
return {
statusCode: 200,
headers: { "Content-Type": "text/plain" },
body: `Hello, CDK! You've hit ${event.path}\n`
};
};
Paso 6: Correr cdk synth y cdk deploy –all. ¡¡Voilá!!

Limpiar

Para evitar incurrir en cargos futuros, elimina los recursos.
  1. Corre cdk destroy
  2. Desactivar el acceso a Amazon Bedrock Model.

Ventajas de convertir los diagramas de arquitectura a iAC

  1. Automatización perfecta con asistencia impulsada por la IA: Aprovechar las capacidades de la IA para leer diagramas y generar código, incluso si produce un código repetitivo inicial, si no el código completamente estructurado, agiliza el proceso de desarrollo. A medida que la IA sigue evolucionando, aumenta la posibilidad de generar código más sofisticado y estructurado, lo que promete aumentar aún más la eficiencia en el futuro.
  2. Accesibilidad para personas que no son programadores: Las herramientas de diagrama a código permiten a los miembros del equipo sin una amplia experiencia en programación contribuir al desarrollo de la infraestructura. Al proporcionar una interfaz fácil de usar para crear diagramas y generar código, estas herramientas democratizan el proceso y permiten a más miembros del equipo participar eficazmente en las iniciativas de infraestructura como código.
  3. Creación acelerada de prototipos e iteración: La capacidad de generar rápidamente código repetitivo a partir de diagramas acelera los ciclos de creación de prototipos e iteración. Los equipos pueden traducir rápidamente los diseños arquitectónicos en código funcional, lo que permite ciclos de retroalimentación más rápidos y prácticas de desarrollo más ágiles.
  4. Facilitó el aprendizaje y el desarrollo de habilidades: Para las personas que buscan mejorar sus habilidades de codificación, las herramientas de diagrama a código son un valioso recurso de aprendizaje. Al observar el código generado y su relación con los diagramas arquitectónicos, los miembros del equipo pueden obtener información sobre los principios y las prácticas de codificación, lo que fomenta el desarrollo de habilidades con el tiempo.

Conclusión

La integración del soneto de Claude 3 con AWS Bedrock y la posibilidad de convertir diagramas de arquitectura en código CDK o Terraform representan un importante paso adelante para los desarrolladores y los equipos de DevOps.
Al adoptar este enfoque, puedes aprovechar el poder de la infraestructura como código y acelerar la entrega de una infraestructura de nube fiable y escalable. Embárcate en este viaje y disfruta de la fusión perfecta del diseño visual y la generación automática de código, que te permitirá crear y gestionar tus entornos de nube con una eficacia y una confianza sin precedentes.
Next up, a streamlit web UI based approach which provides a friendly interactive UI to use this solution for those who hate CLIs
 

Any opinions in this post are those of the individual author and may not reflect the opinions of AWS.

2 Comments