Using generative infrastructure as code with Application Composer | AWS Compute Blog

Sử dụng cơ sở hạ tầng dạng mã tổng hợp với Application Composer 

bởi Julian Wood | 16 tháng 1 2024 | trong Amazon CodeWhisperer, AWS Amplify, AWS Application Composer, Serverless | Permalink |  Share

Bài đăng này được viết bởi Anna Spysz, Kỹ sư giao diện người dùng, Nhà soạn thảo ứng dụng AWS.

AWS Application Composer được công bố trong AWS Console một năm trước và bây giờ đã được mở rộng lên VS Code IDE như là một phần của AWS Toolkit. Nó bao gồm việc truy cập vào 1 đối tác AI tổng hợp giúp bạn viết hạ tầng dạng mã (IaC) cho hơn 1100+ các tài nguyên AWS CloudFormation mà Application Composer đang hỗ trợ.

Tổng quan

Application Composer cho phép bạn tạo các bản thảo IaC bằng việc kéo và thả các thẻ trong một trình canvas ảo. Những cái này đại diện cho các tài nguyên CloudFormation mà bạn có thể liên kết với nhau để tạo các phân quyền và tham chiếu. Với việc hỗ trợ toàn bộ 1100+ tài nguyên mà CloudFormation cho phép, bạn có thể xây dựng mọi thứ từ AWS Amplify đến AWS X-Ray.

Trước đó, các tài nguyên CloudFormation tiêu chuẩn chỉ có một cấu hình cơ bản. VIệc thêm Amplify App resource mang lại kết quả theo cấu hình mặc định sau:

MyAmplifyApp:
    Type: AWS::Amplify::App
    Properties:
      Name: <String>

Và trong Console:

Giờ đây Application Composer trong IDE sử dụng AI tổng hợp để tạo các cấu hình tài nguyên cụ thể với các biện pháp bảo vệ như thẩm định so với lược đồ CloudFormation để đảm bảo các giá trị hợp lệ.

Khi làm việc trên bảng thảo CloudFormation hoặc AWS Serverless Application Model (AWS SAM) trong VS Code, bạn có thể đang nhập với Builder ID của bạn và tạo nhiều cấu hình được gợi ý trong Application Composer. Đây là một ví dụ của cấu hình AI tổng hợp cho loại AWS::Amplify::App:

Các gợi ý này cụ thể cho từng loại tài nguyên và được bảo vệ bằng kiểm tra lại so với lược đồ CloudFormation để đảm bảo giá trị hợp lệ và các phần giữ chỗ có ích. Bạn có thể chọn, dùng hoặc điều chỉnh các gợi ý để phù hợp với nhu cầu.

Bây giờ Bạn biết làm thế nào để tạo một ví dụ cơ bản với một tài nguyên, nhưng hãy nhìn vào việc xây dựng một ứng dụng đầy đủ với sự giúp đỡ của các gợi ý của AI tổng hợp. VÍ dụ tạo lại 1 ứng dụng serverless từ hướng dẫn Serverless Land, “Use GenAI capabilities to build a chatbot dùng Application Composer và các gợi ý code tổng hợp bởi AI.

Bắt đầu với AWS Toolkit trong VS Code

Nếu bạn chưa có tiện ích AWS Toolkit, bạn có thể tìm nó dưới tab Extensions trong VS Code.Cài đặt hoặc nâng cấp nó lên phiên bản tối thiểu 2.1.0 để màn hình hiển thị Amazon Q và Application Composer:

Tiếp theo để bật tính năng gợi ý code bằng AI tổng hợp, bạn phải bật Amazon CodeWhisperer bằng Builder ID của bạn. Cách dễ nhất là mở Amazon Q chat và chọn Authenticate. Ở màn hình kế tiếp, chọn tùy chọn Builder ID và đăng nhập.

Sau khi đăng nhập, kết nối của bạn xuất hiện trong bảng điều khiển công cụ VS Code:

Xây dựng với Application Composer

Với bộ công cụ đã được cài đặt và kết nối với Builder ID của bạn, bạn đã sẵn sàng để bắt đầu xây dựng.

  1. Trong một không gian làm việc mới, tạo một thư mục cho ứng dụng và một file template.yaml
  2. Mở file này và khởi tạo Application Composer bằng cách chọn icon ở góc trên bên phải.

Tài liệu hướng dẫn gốc bao gồm sơ đồ thiết kế sau:

Đầu tiên, thêm các dịch vụ trong sơ đồ để phát thảo thiết kế ứng dụng, đồng thời tạo một bản thảo CloudFormation có thể triển khai được:

  1. Từ danh sách Enhanced components, kéo một Lambda function và một Lambda layer
  2. Click đúp vào tài nguyên Function để sửa các thuộc tính. Đổi tên Logical ID của Lambda function thành LexGenAIBotLambda.
  3. Đổi đường dẫn Source thành src/LexGenAIBotLambda và runtime thành Python.
  4. Đổi giá trị handler thành TextGeneration.lambda_handler và chọn Save
  5. Click đúp vào tài nguyên Layer để thay đổi các thuộc tính. Đổi tên lớp Boto3Layer và đổi phương thức xây dựng sáng Python. Đổi đường dẫn Source thành src/Boto3PillowPyshorteners.zip.
  6. Cuối cùng, kết nối Layer đến Function để tạo một tham chiếu giữa chúng. Canvas của bạn trông như sau:

File Template.yaml giờ đã được nâng cấp bao gồm các tài nguyên này. Trong nguồn danh mục, bạn có thể thấy các file chức năng được tạo ra. Bạn sẽ thay chúng với các function và layer hướng dẫn sau.

Trong bước đầu, bạn đã thêm một vài tài nguyên và IaC được tạo bởi Application Composer bao gồm các best practice mặc định. Kế tiếp, bạn sẽ dùng các thành phần CloudFormation tiêu chuẩn.

Sử dụng AI cho các thành phần tiêu chuẩn

Bắt đầu sử dụng thanh tìm kiếm để tìm và thêm một vài thành phần tiêu chuẩn cần thiết cho ứng dụng của bạn.

  1. Trong thanh tìm kiếm Resources, nhập “lambda” và thêm loại tài nguyên AWS::Lambda::Permission vào canvas.
  2. Nhập “iam” trong thanh tìm kiếm và nhập AWS::IAM::Policy
  3. Thêm 2 tài nguyên loại AWS::IAM::Role

Ứng dụng của bạn sẽ như sau:

Một vài tài nguyên tiêu chuẩn có các mặc định bạn cần. Ví dụ khi bạn thêm AWS::Lambda::Permission, thay các giá trị giữ chỗ với:

FunctionName: !Ref LexGenAIBotLambda
Action: lambda:InvokeFunction
Principal: lexv2.amazonaws.com

Các tài nguyên khác như IAM role và IAM policy có các cấu hình cơ bản. Đây là chỗ bạn cần dùng trợ lý AI. Chọn tài nguyên IAM Role và chọn Generate suggestions để thấy những gợi ý của AI tổng hợp.

Bởi vì các gợi ý này được tạo ra bởi một  Large Language Model (LLM), chúng có thể khác nhau giữa các lần tạo. Những cái này được kiểm tra so với lược đồ CloudFormation, đảm bảo hợp lệ và cung cấp một lượng cấu hình bạn cần.

Tạo các cấu hình khác nhau cho bạn ý tưởng về chính sách của tài nguyên nên như thế nào và thường cho bạn các từ khóa để bạn có thể điền giá trị bạn cần. Sử dụng các cài đặt sau cho mỗi tài nguyên, thay thế các giá trị được tạo ra chỗ có thể áp dụng được.

  1. Click đúp vào “Permission” để sửa các cài đặt. Thay đổi Logical ID sang LexGenAIBotLambdaInvoke và thay cấu hình Resource với giá trị sau và chọn Save:
Action: lambda:InvokeFunction
FunctionName: !GetAtt LexGenAIBotLambda.Arn
Principal: lexv2.amazonaws.com
  1. Click đúp “Role” để sửa cài đặt. Thay Logical ID sang CfnLexGenAIDemoRole và thay cấu hình Resource với giá trị sau:
AssumeRolePolicyDocument:
  Statement:
    – Action: sts:AssumeRole
      Effect: Allow
      Principal:
        Service: lexv2.amazonaws.com
  Version: ‘2012-10-17’
ManagedPolicyArns:
  – !Join
    – ”
    – – ‘arn:’
      – !Ref AWS::Partition
      – ‘:iam::aws:policy/AWSLambdaExecute’
  1. Click “Role2” để sửa cài đặt. Đổi Logical ID sang LexGenAIBotLambdaServiceRole và thay thế cấu hình Resource với:
AssumeRolePolicyDocument:
  Statement:
    – Action: sts:AssumeRole
      Effect: Allow
      Principal:
        Service: lambda.amazonaws.com
  Version: ‘2012-10-17’
ManagedPolicyArns:
  – !Join
    – ”
    – – ‘arn:’
      – !Ref AWS::Partition
      – ‘:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole’
  1. Click “Policy” để sửa. Đổi Logical ID thành LexGenAIBotLambdaServiceRoleDefaultPolicy và thay các giá trị:
PolicyDocument:
  Statement:
    – Action:
        – lex:*
        – logs:*
        – s3:DeleteObject
        – s3:GetObject
        – s3:ListBucket
        – s3:PutObject
      Effect: Allow
      Resource: ‘*’
    – Action: bedrock:InvokeModel
      Effect: Allow
      Resource: !Join
      – ”
        – – ‘arn:aws:bedrock:’
          – !Ref AWS::Region
          – ‘::foundation-model/anthropic.claude-v2’
  Version: ‘2012-10-17’
PolicyName: LexGenAIBotLambdaServiceRoleDefaultPolicy
Roles:
  – !Ref LexGenAIBotLambdaServiceRole

Sau khi bạn đã thay đổi các thuộc tính của từng tài nguyên, bạn thấy các kết nối và nhóm một cách tự động giữa chúng:

Để thêm Amazon Lex bot:

  1. Trong phần chọn tài nguyên, tìm và thêm AWS::Lex::Bot. Đây là thay đổi khác để thấy AI gợi ý những cấu hình gì
  2. Đổi Amazon Lẽ bot logical ID thành LexGenAIBot và sửa cấu hình:
DataPrivacy:
  ChildDirected: false
IdleSessionTTLInSeconds: 300
Name: LexGenAIBot
RoleArn: !GetAtt CfnLexGenAIDemoRole.Arn
AutoBuildBotLocales: true
BotLocales:
  – Intents:
      – InitialResponseSetting:
          CodeHook:
            EnableCodeHookInvocation: true
            IsActive: true
            PostCodeHookSpecification: {}
        IntentClosingSetting:
          ClosingResponse:
            MessageGroupsList:
              – Message:
                  PlainTextMessage:
                    Value: Hi there, I’m a GenAI Bot. How can I help you?
        Name: WelcomeIntent
        SampleUtterances:
          – Utterance: Hi
          – Utterance: Hey there
          – Utterance: Hello
          – Utterance: I need some help
          – Utterance: Help needed
          – Utterance: Can I get some help?
      – FulfillmentCodeHook:
          Enabled: true
          IsActive: true
          PostFulfillmentStatusSpecification: {}
        InitialResponseSetting:
          CodeHook:
            EnableCodeHookInvocation: true
            IsActive: true
            PostCodeHookSpecification: {}
        Name: GenerateTextIntent
        SampleUtterances:
          – Utterance: Generate content for
          – Utterance: ‘Create text ‘
          – Utterance: ‘Create a response for ‘
          – Utterance: Text to be generated for
      – FulfillmentCodeHook:
          Enabled: true
          IsActive: true
          PostFulfillmentStatusSpecification: {}
        InitialResponseSetting:
          CodeHook:
            EnableCodeHookInvocation: true
            IsActive: true
            PostCodeHookSpecification: {}
        Name: FallbackIntent
        ParentIntentSignature: AMAZON.FallbackIntent
    LocaleId: en_US
    NluConfidenceThreshold: 0.4
Description: Bot created demonstration of GenAI capabilities.
TestBotAliasSettings:
  BotAliasLocaleSettings:
    – BotAliasLocaleSetting:
        CodeHookSpecification:
          LambdaCodeHook:
            CodeHookInterfaceVersion: ‘1.0’
            LambdaArn: !GetAtt LexGenAIBotLambda.Arn
        Enabled: true
      LocaleId: en_US
  1. Chọn Save trên tài nguyên

Một khi các tài nguyên đã được cấu hình, ứng dụng của bạn trong như sau:

Thêm function code và triển khai

Khi thiết kế của bạn đã được xác định, xem lại và điều chỉnh file template.yaml. Để tham khảo chi tiết và đảm bảo các giá trị đúng, ghé  GitHub repository và kiểm trang lại file template.yaml.

  1. Sao chép Lambda layer trực tiếp từ repository và thêm vào ./src/Boto3PillowPyshorteners.zip.
  2. Trong danh mục .src/, đổi tên file được tạo handler.py thành TextGeneration.py. Bạn có thể xóa các file không cần thiết.
  3. Mở TextGeneration.py và thay đổi các giá trị giữ chỗ với các giá trị sau:
import json
import boto3
import os
import logging
from botocore.exceptions import ClientError

LOG = logging.getLogger()
LOG.setLevel(logging.INFO)

region_name = os.getenv(“region”, “us-east-1”)
s3_bucket = os.getenv(“bucket”)
model_id = os.getenv(“model_id”, “anthropic.claude-v2”)

# Bedrock client used to interact with APIs around models
bedrock = boto3.client(service_name=”bedrock”, region_name=region_name)

# Bedrock Runtime client used to invoke and question the models
bedrock_runtime = boto3.client(service_name=”bedrock-runtime”, region_name=region_name)


def get_session_attributes(intent_request):
    session_state = intent_request[“sessionState”]
    if “sessionAttributes” in session_state:
        return session_state[“sessionAttributes”]

    return {}

def close(intent_request, session_attributes, fulfillment_state, message):
    intent_request[“sessionState”][“intent”][“state”] = fulfillment_state
    return {
        “sessionState”: {
            “sessionAttributes”: session_attributes,
            “dialogAction”: {“type”: “Close”},
            “intent”: intent_request[“sessionState”][“intent”],
        },
        “messages”: [message],
        “sessionId”: intent_request[“sessionId”],
        “requestAttributes”: intent_request[“requestAttributes”]
        if “requestAttributes” in intent_request
        else None,
    }

def lambda_handler(event, context):
    LOG.info(f”Event is {event}”)
    accept = “application/json”
    content_type = “application/json”
    prompt = event[“inputTranscript”]

    try:
        request = json.dumps(
            {
                “prompt”: “\n\nHuman:” + prompt + “\n\nAssistant:”,
                “max_tokens_to_sample”: 4096,
                “temperature”: 0.5,
                “top_k”: 250,
                “top_p”: 1,
                “stop_sequences”: [“\\n\\nHuman:”],
            }
        )

        response = bedrock_runtime.invoke_model(
            body=request,
            modelId=model_id,
            accept=accept,
            contentType=content_type,
        )

        response_body = json.loads(response.get(“body”).read())
        LOG.info(f”Response body: {response_body}”)
        response_message = {
            “contentType”: “PlainText”,
            “content”: response_body[“completion”],
        }
        session_attributes = get_session_attributes(event)
        fulfillment_state = “Fulfilled”

        return close(event, session_attributes, fulfillment_state, response_message)

    except ClientError as e:
        LOG.error(f”Exception raised while execution and the error is {e}”)
  1. Để triển khai hạ tầng, trở về App Composer và chọn icon Sync. Theo hướng dẫn AWS SAM để hoàn tất triển khai.

Sau khi thông báo SAM Sync thành công, điều hướng tới CloudFormation trên Console để thấy các tài nguyên được tạo mới. Để tiếp tục xây dựng chatbot, theo dõi toàn bộ hướng dẫn gốc ở đây.

Kết luận

Hướng dẫn này chứng tỏ làm thế nào CloudFormation AI tổng hợp có thể hợp lý quy trình của bạn Application Composer, nâng cao sự thấu hiểm các cấu hình tài nguyên và tăng tốc độ quá trình phát triển. Và luôn luôn tuân theo AWS Responsible AI Policy khi sử dụng các tính năng này.

Leave a comment