使用生成基础设施作为代码与应用程序构建器 计算博客

应用构建器中的基础设施即代码生成

作者:Julian Wood 2024年1月16日 发表在 , , ,

分享

这是由 AWS 应用构建器的前端工程师 Anna Spysz 撰写的文章。

重点总结

  • AWS 应用构建器自推出以来,今已扩展至 VS Code IDE,加入生成性 AI 伙伴,助力基础设施即代码(IaC)开发。
  • 该平台支持超过1100种 AWS CloudFormation 资源,可以通过拖放操作轻松构建应用架构。
  • 工作流中集成生成性 AI ,可以生成特定资源的配置,并被 CloudFormation 模式校验。

概述

AWS 应用构建器允许用户通过在虚拟画布上拖放卡片创建 IaC 模板。这些卡片代表 CloudFormation资源,可以将它们进行连接以创建权限和引用。现在支持超过1100种 CloudFormation 资源,包括从 到 的所有内容。

以前,标准 CloudFormation 资源仅提供基本配置。例如,添加一个 将默认产生如下配置:

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

在控制台上,您可以看到 AWS 应用构建器的界面:

现在,IDE 中的应用构建器利用生成性 AI 生成特定资源的配置,并通过 CloudFormation 模式进行验证,以确保输入有效。

在 VS Code 中处理 CloudFormation 或 (AWS SAM) 模板时,您可以使用您的 登录,并在应用构建器中生成多个建议配置。以下是为 AWS::Amplify::App 类型生成的 AI配置示例:

这些建议是特定于资源类型的,并经过校验以确保有效的值和有用的占位符。然后,您可以选择、使用和修改这些建议,以符合您的需求。

虽然您已了解如何生成一个资源的基本示例,但让我们看看如何借助 AI 生成的建议构建完整应用。本示例将重建一款无服务器应用,该应用来源于 的教程:“”。

在 VS Code 中开始使用 AWS 工具包

如果您尚未安装 扩展,请在 VS Code 的 扩展 选项卡中找到并安装或更新至至少版本 2.1.0,以便出现 和应用构建器的界面:

接下来,您需要使用 Builder ID 启用 来提供生成性 AI的代码建议。最简单的方法是打开 Amazon Q 聊天,选择身份验证。在下一个屏幕上,选择 Builder ID 选项,然后使用您的 Builder ID登录。

登录后,您的连接将会出现在 VS Code 工具包面板中:

使用应用构建器构建

安装并用 Builder ID 连接完毕后,您可以开始构建。

  1. 在新工作区中,创建一个应用程序文件夹和一个空白的 template.yaml 文件。
  2. 打开该文件,通过选择右上角的图标启动应用构建器。

原始架构图如下:

首先,添加图中的服务,以草绘应用程序架构,同时创建可部署的 CloudFormation 模板:

  1. 增强组件 列表中,拖入一个 Lambda 函数和一个 Lambda 层。
  2. 双击函数资源以编辑其属性。将 Lambda 函数的逻辑ID重命名为 LexGenAIBotLambda
  3. 路径更改为 src/LexGenAIBotLambda,并将运行时更改为 Python。
  4. 处理器 值更改为 TextGeneration.lambda_handler,然后选择 保存
  5. 双击层资源以编辑其属性。将层重命名为 Boto3Layer,并将其构建方法更改为 Python。将其源路径更改为 src/Boto3PillowPyshorteners.zip
  6. 最后,将层与函数连接起来,以在它们之间添加引用。您的画布看起来如下:

template.yaml 文件现在已更新以包含这些资源。在源目录中,您可以看到一些生成的函数文件,以后将用教程中的函数和层替换这些文件。

在第一步中,您添加了一些资源,应用构建器生成的 IaC 包括最佳实践的默认设置。接下来,您将使用标准 CloudFormation 组件。

使用 AI 进行标准组件

首先使用搜索框搜索并添加应用所需的多个标准组件。

  1. 在资源搜索框中输入“lambda”,并将资源类型 AWS::Lambda::Permission 添加到画布中。
  2. 在搜索框中输入“iam”,并添加类型 AWS::IAM::Policy
  3. 添加两个类型为 AWS::IAM::Role 的资源。

您的应用现在看起来如下:

有些标准资源已经具有您需要的所有默认值。例如,当您添加 AWS::Lambda::Permission 资源时,可以用以下内容替换占位符值:

yaml FunctionName: !Ref LexGenAIBotLambda Action: lambda:InvokeFunctionPrincipal: lexv2.amazonaws.com

其他资源,例如 IAM 角色和 IAM 策略,则有一个基础配置。这时您可以利用 AI 助手。选择一个 IAM 角色资源,然后选择 生成建议 以查看生成 AI 所建议的内容。

由于这些建议是由 (LLM) 生成的,因此它们每次生成的结果可能会有所不同。这些建议通过 CloudFormation 模式进行了验证,以确保有效性,并提供适合您需求的多种配置。

生成不同的配置使您了解资源的策略应该是什么样的,通常还会提供一些您可以用所需值填充的键。使用以下设置为每个资源替换生成的值(适用时)。

  1. 双击“权限”资源以编辑设置。将逻辑ID更改为 LexGenAIBotLambdaInvoke,并用以下内容替换其资源配置,然后选择 保存

yaml Action: lambda:InvokeFunction FunctionName: !GetAttLexGenAIBotLambda.Arn Principal: lexv2.amazonaws.com

  1. 双击“角色”资源以编辑设置。将逻辑ID更改为 CfnLexGenAIDemoRole,并用以下内容替换其资源配置,然后选择 保存

yaml 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. 双击“Role2”资源以编辑设置。将逻辑ID更改为 LexGenAIBotLambdaServiceRole,并用以下内容替换其资源配置,然后选择 保存

yaml 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. 双击“策略”资源以编辑设置,将逻辑ID更改为 LexGenAIBotLambdaServiceRoleDefaultPolicy,并用以下内容替换其资源配置,然后选择 保存

`yaml 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: - !RefLexGenAIBotLambdaServiceRole`

更新完每个资源的属性后,您可以看到它们之间的连接和分组自动生成:

要添加 机器人:

  1. 在资源选择器中,搜索并添加类型 AWS::Lex::Bot。这是另一个检查 AI 建议配置的机会。
  2. 将 Amazon Lex 机器人的逻辑 ID 更改为 LexGenAIBot,并更新其配置如下:
LexGenAIBot RoleArn: !GetAtt CfnLexGenAIDemoRole.Arn AutoBuildBotLocales: trueBotLocales: \- 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: trueIsActive: true PostFulfillmentStatusSpecification: {} InitialResponseSetting:
CodeHook: EnableCodeHookInvocation: true IsActive: truePostCodeHookSpecification: {} 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: truePostFulfillmentStatusSpecification: {} InitialResponseSetting: CodeHook:
EnableCodeHookInvocation

Leave a Reply

Required fields are marked *