View a markdown version of this page

使用 Amazon Bedrock 代理,通过基于文本的提示,在 Amazon EKS 中自动创建访问条目控制 - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon Bedrock 代理,通过基于文本的提示,在 Amazon EKS 中自动创建访问条目控制

Keshav Ganesh 和 Sudhanshu Saurav,Amazon Web Services

Summary

当多个团队需要使用共享的 Amazon Elastic Kubernetes Service(Amazon EKS)集群时,组织在管理访问控制和资源预调配方面面临着挑战。Amazon EKS 等托管式 Kubernetes 服务简化了集群操作。然而,在管理团队访问权限和资源权限方面的管理开销仍然既复杂又耗时。

此模式显示了 Amazon Bedrock 代理如何帮助您自动执行 Amazon EKS 集群访问管理。借助这一自动化,开发团队可以专注于核心应用程序开发工作,而不是处理访问控制设置和管理任务。您可以自定义 Amazon Bedrock 代理,使其通过简单的自然语言提示,对多种任务执行操作。

通过使用 AWS Lambda 功能作为操作组,Amazon Bedrock 代理可以处理诸如创建用户访问条目和管理访问策略之类的任务。此外,Amazon Bedrock 代理可以配置容器身份关联,从而允许集群中运行的 pod 访问 AWS Identity and Access Management (IAM) 资源。使用该解决方案,各个组织可以利用基于文本的简单提示来简化 Amazon EKS 集群管理、减少手动开销,并提高整体开发效率。

先决条件和限制

先决条件

限制

  • 可能需要提供培训和文档,以便帮助确保顺利地采用和有效地使用这些技术。使用亚马逊 Bedrock,亚马逊 EKS、Lambda、A OpenSearch mazon Service 和 OpenAPI 会给开发人员和团队带来重要的学习曲线。 DevOps

  • 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按区域划分的 AWS 服务。有关特定端点,请参阅服务端点和配额,然后选择相应服务的链接。

架构

下图显示了此模式的工作流和架构组件。

用于使用 Amazon Bedrock 代理,在 Amazon EKS 中创建访问控制措施的工作流和组件。

该解决方案将执行以下步骤:

  1. 用户提交一个提示或查询,以便与 Amazon Bedrock 代理进行交互,这些提示或查询将用作输入,以供代理处理和采取行动。

  2. 根据提示,Amazon Bedrock 代理会检查 OpenAPI 架构,以便确定要作为目标的正确 API。如果 Amazon Bedrock 代理找到正确的 API 调用,系统会将此请求发送到与实施这些操作的 Lambda 函数相关联的操作组。

  3. 如果找不到相关的 API,Amazon Bedrock 代理会查询该 OpenSearch 馆藏。该 OpenSearch 馆藏使用索引知识库内容,这些内容来自包含 Amazon EKS 用户指南的 Amazon S3 存储桶。

  4. 该 OpenSearch 集合将相关的上下文信息返回给 Amazon Bedrock 代理。

  5. 对于可操作的请求(与 API 操作匹配的那些请求),Amazon Bedrock 代理将在虚拟私有云(VPC)内执行,并触发 Lambda 函数。

  6. Lambda 函数将根据用户在 Amazon EKS 集群内的输入来执行操作。

  7. 用于 Lambda 代码的 Amazon S3 存储桶存储着一个构件,其中包含为 Lambda 函数编写的代码和逻辑。

工具

AWS 服务

  • Amazon Bedrock 是一项完全托管的服务,它通过统一的 API 提供来自领先的人工智能初创公司和亚马逊的高性能基础模型 (FMs) 供您使用。

  • AWS CloudFormation帮助您设置 AWS 资源,快速一致地配置资源,并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。

  • 亚马逊 Elastic Kubernetes Service(亚马逊 EKS)可帮助你在上面运行 AWS Kubernetes,而无需安装或维护自己的 Kubernetes 控制平面或节点。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。

  • Amazon OpenSearch Service 是一项托管服务,可帮助您在中部署、操作和扩展 OpenSearch 集群 AWS 云。它的集合功能可帮助您整理数据并建立全面的知识库,以供 Amazon Bedrock 代理等人工智能助手使用。

  • Amazon Simple Storage Service(Amazon S3)是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

其他工具

  • eksctl 是一款命令行实用程序,用于在 Amazon EKS 上创建和管理 Kubernetes 集群。

代码存储库

此模式的代码可在 GitHub eks-access-controls-bedrock-agent 存储库中找到。

最佳实践

  • 在实施此模式时,保持尽可能高的安全性。确保 Amazon EKS 集群是私有集群,访问权限有限,而且所有资源都位于一个虚拟私有云(VPC)内。有关详情,请参阅 Amazon EKS 文档中的安全最佳实践

  • 尽可能使用 AWS KMS 客户托管的密钥,并向其授予有限的访问权限。

  • 遵循最低权限原则,并授予执行任务所需的最低权限。有关详情,请参阅 IAM 文档中的授予最低权限安全最佳实践

操作说明

Task说明所需技能

克隆存储库。

要克隆此模式的存储库,请在您的本地工作站中运行如下命令:

git clone https://github.com/aws-samples/eks-access-controls-bedrock-agent.git
AWS DevOps

获取 AWS 账户 身份证。

要获取 AWS 账户 ID,请按以下步骤操作:

  1. 在克隆的存储库的根文件夹 eks-access-controls-bedrock-agent 中,打开一个 shell。

  2. 要获取您的 AWS 账户 ID,请导航到克隆的目录并运行以下命令:

    AWS_ACCOUNT=$(aws sts get-caller-identity --query "Account" --output text)

此命令将您的 AWS 账户 ID 存储在AWS_ACCOUNT变量中。

AWS DevOps

为 Lambda 代码创建 S3 存储桶。

要实施该解决方案,您必须创建三个用于不同用途的 Amazon S3 存储桶,如架构图中所示。S3 存储桶用于存储 Lambda 代码、知识库和 OpenAPI 架构。

要创建 Lambda 代码存储桶,请执行以下步骤:

  1. 要为 Lambda 代码创建 S3 存储桶,请运行如下命令:

    aws s3 mb s3://bedrock-agent-lambda-artifacts-${AWS_ACCOUNT} --region us-east-1
  2. 要安装 Lambda 代码依赖项,请运行如下命令:

    cd eks-lambda npm install tsc cd .. && cd opensearch-lambda npm install tsc cd ..
  3. 要将代码打包并将其上传到 Lambda 的 S3 存储桶,请运行如下命令:

    aws cloudformation package \ --template-file eks-access-controls.yaml \ --s3-bucket bedrock-agent-lambda-artifacts-${AWS_ACCOUNT} \ --output-template-file eks-access-controls-template.yaml \ --region us-east-1

package 命令创建一个包含以下内容的新 CloudFormation 模板 (eks-access-controls-template.yaml):

  • 对 S3 存储桶中存储的 Lambda 函数代码的引用。

  • 所有必需 AWS 基础设施的定义,包括 VPC、子网、Amazon Bedrock 代理和集合。 OpenSearch 您可以使用此模板部署完整的解决方案 CloudFormation。

AWS DevOps

为知识库创建 S3 存储桶。

要为知识库创建 Amazon S3 存储桶,请执行以下步骤:

  1. 要为知识库创建 Amazon S3 存储桶,请运行如下命令:

    aws s3 mb s3://eks-knowledge-base-${AWS_ACCOUNT} --region us-east-1
  2. 要下载《Amazon EKS 用户指南》并将其存储在一个目录中,请运行以下命令:

    mkdir dataSource cd dataSource curl https://docs.aws.amazon.com/pdfs/eks/latest/userguide/eks-ug.pdf -o eks-user-guide.pdf
  3. 要将此用户指南上传到您在第 1 步中创建的 S3 存储桶,请运行如下命令:

    aws s3 cp eks-user-guide.pdf s3://eks-knowledge-base-${AWS_ACCOUNT} \ --region us-east-1 \
  4. 要返回到根目录,请运行如下命令:

    cd ..
AWS DevOps

为 OpenAPI 架构创建 S3 存储桶。

要为 OpenAPI 架构创建 Amazon S3 存储桶,请执行以下步骤:

  1. 要创建 S3 存储桶,请运行如下命令:

    aws s3 mb s3://eks-openapi-schema-${AWS_ACCOUNT} --region us-east-1
  2. 要将 OpenAPI 架构上传到 S3 存储桶,请运行如下命令:

    aws s3 cp openapi-schema.yaml s3://eks-openapi-schema-${AWS_ACCOUNT} --region us-east-1
AWS DevOps
Task说明所需技能

部署 CloudFormation 堆栈。

要部署 CloudFormation 堆栈,请使用之前创建eks-access-controls-template.yaml的 CloudFormation 模板文件。有关更多详细说明,请参阅 CloudFormation 文档中的从 CloudFormation 控制台创建堆栈

注意

使用 CloudFormation 模板配置 OpenSearch 索引大约需要 10 分钟。

创建此堆栈之后,记下 VPC_IDPRIVATE_SUBNET ID

AWS DevOps

创建 Amazon EKS 集群。

要在 VPC 内创建 Amazon EKS 集群,请执行以下步骤:

  1. eks-config.yaml 配置文件创建一个副本,并将此副本命名为 eks-deploy.yaml

  2. 在文本编辑器中打开 eks-deploy.yaml。随后,将以下占位符值替换为已部署的堆栈中的值:VPC_IDPRIVATE_SUBNET1PRIVATE_SUBNET2

  3. 要使用 eksctl 实用程序创建集群,请运行如下命令:

    eksctl create cluster -f eks-deploy.yaml
    注意

    要完成此集群创建过程,可能需要 15 到 20 分钟的时间。

  4. 要确认已成功创建集群,请运行以下命令:

    aws eks describe-cluster --name --query "cluster.status" aws eks update-kubeconfig --name --region kubectl get nodes

预期的结果如下所示:

  • 集群状态为 ACTIVE

  • kubectl get nodes 命令将显示所有处于 Ready 状态的节点。

AWS DevOps
Task说明所需技能

在 Amazon EKS 集群与 Lambda 函数之间,创建一个连接。

要设置网络和 IAM 权限,以便允许 Lambda 函数与 Amazon EKS 集群进行通信,请执行以下步骤:

  1. 要识别附加到 Lambda 函数的 IAM 角色,请打开 AWS 管理控制台 并找到名为的 Lambda 函数。bedrock-agent-eks-access-control记下 IAM 角色的 Amazon 资源名称(ARN)。

  2. 要在 Amazon EKS 集群中为 Lambda 函数的 IAM 角色创建一个访问条目,请运行如下命令:

    aws eks create-access-entry --cluster-name eks-testing-cluster --principal-arn <principal-Role-ARN>
  3. 要为此角色分配 AmazonEKSClusterAdminPolicy 权限,请运行如下命令:

    aws eks associate-access-policy --cluster-name eks-testing-cluster --principal-arn <principal-Role-ARN> --policy-arn arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy --access-scope type=cluster

    有关更多信息,请参阅将访问策略与访问条目关联以及 Amazon EKS 文档EKSClusterAdminPolicy中的 Amazon。

  4. 找到 Amazon EKS 集群的安全组。添加一条入站规则,以便允许网络流量从 Lambda 函数传入到 Amazon EKS 集群。

    对于此入站规则,使用以下值:

    • 类型 – HTTPS

    • 端口范围 – 443

    • 来源 – Lambda 安全组

      有关详情,请参阅 Amazon VPC 文档中的配置安全组规则

AWS DevOps
Task说明所需技能

测试 Amazon Bedrock 代理。

在测试 Amazon Bedrock 代理之前,请确保执行以下操作:

  • 首先使用非生产角色执行测试。

  • 记录对集群访问权限进行的任何更改。

  • 制定一项计划,以便在需要时恢复更改。

要访问 Amazon Bedrock 代理,请执行以下步骤:

  1. AWS 管理控制台 使用具有 Amazon Bedrock 权限的 IAM 角色登录,然后通过以下网址打开 Amazon Bedrock 控制台。https://console.aws.amazon.com/bedrock/

  2. 从左侧的导航窗格中,选择代理。随后,在代理部分中选择您配置的代理。

  3. 要测试此代理,请尝试以下示例提示,您需要将其中的 Principal-ARN-OF-ROLE 替换为一个实际的 IAM 角色 ARN:

  • 要为您希望授权访问 EKS 集群的任何 IAM 角色创建一个访问条目,请使用如下提示:Create an access entry in cluster eks-testing-new for a role whose principal arn is <Principal-ARN-OF-ROLE> with access policy as AmazonEKSAdminPolicy

    预期结果

    • 此代理应当确认访问条目创建操作。

    • 要进行验证,请使用 AWS 管理控制台 或使用 Amazon EKS API 进行检查,然后运行以下命令:aws eks list-access-entries --cluster-name ekscluster

  • 要说明您创建的访问条目,请使用如下提示:Describe an access entry in cluster eks-testing-new whose principal arn is <Principal-ARN-OF-ROLE>

    预期结果

    • 此代理应当返回有关此访问条目的详细信息。

    • 这些详细信息应当与您之前为此访问条目配置的内容匹配。

  • 要删除您创建的访问条目,请使用如下提示:Delete the access entry in cluster eks-testing-new whose principal arn is <Principal-ARN-OF-ROLE>

    预期结果

    • 此代理应当确认删除此访问条目。

    • 要进行验证,请使用 AWS 管理控制台 或使用 Amazon EKS API 进行检查,然后运行以下命令:aws eks list-access-entries --cluster-name ekscluster

您也可以要求此代理执行操作,以便建立 EKS 容器组身份关联。有关更多详细信息,请参阅 Amazon EKS 文档中的了解 EKS 容器组身份如何向容器组(pod)授予对 AWS 服务的访问权限

AWS DevOps
Task说明所需技能

清理资源。

要清理此模式创建的资源,请执行如下过程。等待每个删除步骤都完成之后,再继续执行下一个步骤。

警告

此过程将永久删除这些堆栈创建的所有资源。在继续之前,请确保您已备份所有的重要数据。

  1. 要删除 Amazon ECS 集群,请运行如下命令:

    eksctl delete cluster -f eks-deploy.yaml
    注意

    此操作可能需要 15 到 20 分钟的时间才能完成。

  2. 要删除 Amazon S3 存储桶,请运行以下命令:

    • 要清空 Lambda 存储桶:

      aws s3 rm s3://bedrock-agent-lambda-artifacts-${AWS_ACCOUNT} --recursive
    • 要清空知识库存储桶:

      aws s3 rm s3://eks-knowledge-base-${AWS_ACCOUNT} –recursive
    • 要清空 OpenAPI 架构存储桶:

      aws s3 rm s3://bedrock-agent-openapi-schema-${AWS_ACCOUNT} –recursive
    • 要删除空存储桶:

      aws s3 rb s3://bedrock-agent-lambda-artifacts-${AWS_ACCOUNT} aws s3 rb s3://eks-knowledge-base-${AWS_ACCOUNT} aws s3 rb s3://bedrock-agent-openapi-schema-${AWS_ACCOUNT}
  3. 要删除 CloudFormation 堆栈,请运行以下命令:

    aws cloudformation delete-stack \ --stack-name
  4. 要确认删除 Amazon ECS 集群,请运行如下命令:

    eksctl get clusters
  5. 要确认删除 Amazon S3 存储桶,请运行以下命令:

    • 要确认删除 Lambda 存储桶:

      aws s3 ls | grep "bedrock-agent-lambda-artifacts"
    • 要确认删除知识库存储桶:

      aws s3 ls | grep "eks-knowledge-base"
    • 要确认删除 OpenAPI 架构存储桶:

      aws s3 ls | grep "bedrock-agent-openapi-schema"
  6. 要确认删除堆栈,请运行如下命令:

    aws cloudformation list-stacks \--query 'StackSummaries[?StackName==``]'

    如果删除堆栈失败,请参阅问题排查

AWS DevOps

问题排查

问题解决方案

在环境设置期间,返回了非零错误代码。

运行任何命令以便部署该解决方案时,请确认您正在使用正确的文件夹。有关详情,请参阅此模式的存储库中的 FIRST_DEPLOY.md 文件。

Lambda 函数无法执行此任务。

请确保正确设置了从 Lambda 函数到 Amazon EKS 集群的连接。

代理提示无法识别 APIs。

重新部署该解决方案。有关详情,请参阅此模式的存储库中的 RE_DEPLOY.md 文件。

删除此堆栈失败。

首次尝试删除此堆栈时,可能会失败。之所以出现这种故障,可能是因为为知识库编制索引的 OpenSearch 集合创建的自定义资源存在依赖性问题。要删除此堆栈,请保留自定义资源,以便重试此删除操作。

相关资源

AWS 博客

Amazon Bedrock 文档

Amazon EKS 文档