RAG解决方案在Amazon Bedrock中的第八部分:将Amazon Cognito与Amazon EKS集成在一起

2024/10/12 21:02:46

本文主要是介绍RAG解决方案在Amazon Bedrock中的第八部分:将Amazon Cognito与Amazon EKS集成在一起,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

使用 AWS-CDK 将 Cognito 与 EKS 结合的实现的 GenAI 应用程序演示,展示如何实施

今天我们来谈一谈如何将 Amazon Cognito 集成到现有的 Amazon EKS 部署,以增强我们 GenAI 应用程序的功能。通过集成 Cognito,我们可以利用其认证和授权功能,从而提升应用程序的安全性和用户管理能力。

GenAI RAG(Bedrock + AOSS + SQS + Lambda)在使用 Cognito 和外部 DNS 的 EKS 集群上

前提条件
  • AWS 账户
  • AWS CLI
  • NodeJS
  • Python
  • AWS CDK
  • 运行命令:cdk bootstrap aws://ACCOUNT-NUMBER/REGION 初始化 CDK 使用
  • Visual Studio Code (或您喜欢的代码编辑器)
  • Amazon Bedrock 访问
  • Docker
  • kubectl
  • eksctl (选填此演示)
  • git
  • Route 53 域名及公共托管区域

查看EKS 蓝图 CDK 项目设置以了解最新支持的 AWS CDK 版本。

基于 RAG 的应用程序在 EKS 上运行并集成了 Cognito

请先确保您已安装并初始化了AWS CDK,按照预设的先决条件。该项目的完整源代码可在我们的 GitHub 仓库 中找到。可以使用以下命令克隆 v0.8.0 版本的仓库:

git clone -b v0.8.0 https://github.com/awsdataarchitect/opensearch-bedrock-rag-cdk
    git clone -b v0.8.0 https://github.com/awsdataarchitect/opensearch-bedrock-rag-cdk.git && cd opensearch-bedrock-rag-cdk  
    npm install

(这将会克隆特定分支的仓库,并安装npm依赖)

CDK 应用介绍
CDK 应用入口点更改 (bin/opensearch-bedrock-rag-cdk.ts)

更新的变量有: 我们在 EKS 堆栈配置里添加了这些变量:userPoolClientIduserPoolArnuserPoolDomainacmCertificate,以实现与 Cognito 的整合。

添加了 Cognito 堆栈(Stack): 堆栈现在已包含 Cognito 的配置,使 EKS 部署的认证功能更加强大。

以下是一个用于新配置的 config.ini 文件示例:

[设置]  
domainName = rag-demo.example.com  
hostedZoneId = ZF235GS3HYTHDSST9  
targetPlatform = 目标平台
认知栈概览

Cognito堆栈, 用于管理用户身份验证并生成用户池客户端凭证。

用户池: 创建一个新的用户池来管理应用的用户.

认知用户池客户端(Cognito 用户池客户端): 配置为使用OAuth2认证方式,并设置了回调URL到应用程序域。

SSL证书: 这会为应用程序域名颁发SSL证书,从而确保加密通信。

import { Construct } from 'constructs';  
import * as cdk from 'aws-cdk-lib';  
import * as cognito from 'aws-cdk-lib/aws-cognito';  
import * as acm from 'aws-cdk-lib/aws-certificatemanager';  
import { Lazy } from 'aws-cdk-lib';  

interface 集群属性 extends cdk.StackProps {  
    domainName: string;  
    hostedZoneId: string;  
}  

export class CognitoStack extends cdk.Stack {  
  public readonly cognitoUserPool: cognito.UserPool;  
  public readonly cognitoUserPoolClient: cognito.UserPoolClient;  
  public readonly cognitoUserPoolDomain: string;  
  public readonly acmCertificate: string;  

  constructor(scope: Construct, id: string, props: 集群属性) {  
    super(scope, id, props);  

    const domainName = props.domainName;  
    const hostedZoneId = props.hostedZoneId;  

    // 创建一个 Cognito 用户池  
    const userPool = new cognito.UserPool(this, 'MyUserPool', {  
      userPoolName: 'rag-demo-pool',  
      selfSignUpEnabled: true, // 开启自助注册  
      accountRecovery: cognito.AccountRecovery.EMAIL_ONLY, // 设置只通过电子邮件恢复账户  
      signInAliases: { email: true }, // 设置电子邮件作为别名  
      autoVerify: { email: true }, // 开启电子邮件自动验证  
      removalPolicy: cdk.RemovalPolicy.DESTROY, // 当堆栈被销毁时移除用户池  
    });  

    const userPoolDomain = new cognito.UserPoolDomain(this, 'MyUserPoolDomain', {  
      userPool,  
      cognitoDomain: {    
        domainPrefix: 'rag-demo', // 选择一个唯一的前缀  
      },  
    });  

    // 构造注销 URL  
    const redirectUri = encodeURIComponent(`https://${domainName}`);  

    // 创建一个 Cognito 用户池客户端  
    const userPoolClient = userPool.addClient('MyUserPoolClient', {  
      userPoolClientName: 'rag-demo-client',  
      idTokenValidity: cdk.Duration.days(1), // ID 令牌有效期为 1 天  
      accessTokenValidity: cdk.Duration.days(1), // 访问令牌有效期为 1 天  
      generateSecret: true, // 生成客户端密钥  
      oAuth: {  
        callbackUrls: [  
          Lazy.string({ produce: () => `https://${domainName}/oauth2/idpresponse` }), // OAuth 回调 URL 1  
          Lazy.string({ produce: () => `https://${domainName}` }), // OAuth 回调 URL 2  
        ],  
        flows: {  
          authorizationCodeGrant: true, // 授权码授予  
        },  
        scopes: [cognito.OAuthScope.OPENID], // 范围:[开放标识]  
      },  
      supportedIdentityProviders: [cognito.UserPoolClientIdentityProvider.COGNITO], // 支持的身份提供者:  
    });  

    const hostedZone = cdk.aws_route53.HostedZone.fromHostedZoneAttributes(this, 'hosted-zone', {  
      hostedZoneId: hostedZoneId,  
      zoneName: domainName,  
    });  

    // 创建一个 SSL 证书  
    const certificate = new acm.Certificate(this, 'MyCertificate', {  
      domainName: domainName,  
      validation: acm.CertificateValidation.fromDns(hostedZone), // 使用 DNS 验证证书  
    });  

    this.cognitoUserPool = userPool;  
    this.cognitoUserPoolClient = userPoolClient;    
    this.cognitoUserPoolDomain = userPoolDomain.domainName;  
    this.acmCertificate = certificate.certificateArn  

  }  
}
EKS 堆栈里的部署清单文件 (lib/eks-cluster-cdk-stack.ts)

Kubernetes Manifests: 更新的 YAML 定义,使用 Kubernetes ingress 资源部署具有 Cognito 集成的应用程序。

const ingress = cluster.addManifest('ingress', {  
    apiVersion: 'networking.k8s.io/v1',  
    kind: 'Ingress',  // Ingress 资源
    metadata: {  // 元数据:
        name: 'rag-ingress',  
        annotations: {  
            'alb.ingress.kubernetes.io/scheme': 'internet-facing',  
            'alb.ingress.kubernetes.io/target-type': 'ip',  
            'alb.ingress.kubernetes.io/auth-type': 'cognito',  
            'alb.ingress.kubernetes.io/certificate-arn': this.acmCertificate,  // this 指的是当前对象的属性
            'alb.ingress.kubernetes.io/auth-idp-cognito': JSON.stringify({  
                userPoolArn: this.userPoolArn,  
                userPoolClientId: this.userPoolClientId,  
                userPoolDomain: this.userPoolDomain,  
            }),  // 将身份提供程序配置转换为 JSON 字符串
            //'alb.ingress.kubernetes.io/auth-session-timeout': '3600',  // 注释: 'alb.ingress.kubernetes.io/auth-session-timeout': '3600',
            //'alb.ingress.kubernetes.io/listen-ports': '[{"HTTP": 80}, {"HTTPS":443}]',  // 注释: 'alb.ingress.kubernetes.io/listen-ports': '[{"HTTP": 80}, {"HTTPS":443}]',
            //'alb.ingress.kubernetes.io/auth-session-cookie': 'AWSELBAuthSessionCookie',  // 注释: 'alb.ingress.kubernetes.io/auth-session-cookie': 'AWSELBAuthSessionCookie',
            //'alb.ingress.kubernetes.io/auth-on-unauthenticated-request': 'authenticate',  // 注释: 'alb.ingress.kubernetes.io/auth-on-unauthenticated-request': 'authenticate',
        },  
    },  
    spec: {  
        ingressClassName: 'alb',  // ingress 类型为 alb
        rules: [  
            {  
                host: `${this.domainName}`,  // 主机域名
                http: {  
                    paths: [  
                        {  
                            path: '/',  
                            pathType: 'Prefix',  
                            backend: {  
                                service: {  
                                    name: 'rag-service',  
                                    port: { number: 443 },  
                                },  
                            },  
                        },  
                    ],  
                },  
            },  
        ],  
    },  
});
运行CDK堆栈(运行CDK Stack)

要部署更新后的堆栈(stack),请运行下面的命令:

    cdk deploy --all # 部署所有资源到CDK环境
测试和验证

如果 CDK 部署成功的话,您会看到一个 aws eks update-kubeconfig 命令来为新创建的 EKS 集群配置 kubectl

    aws eks update-kubeconfig --name bedrock-eks-cluster --region us-east-1 --role-arn arn:aws:iam::1234567890:role/mastersRoleArn

注:此命令用于更新kubeconfig文件,以便使用指定的Amazon EKS集群。

你可以用以下命令来验证部署:



kubectl get all
1. 使用Route53 DNS的域名启动应用程序。(例如 example.com)
2. 确保登录屏幕出现,并使用Cognito用户池的凭据登录。

![](https://imgapi.imooc.com/6709d38009980ff414000955.jpg)

Cognito 登录界面

一旦验证通过,您将可以看到我们的GenAI App,您可以使用它来准备AWS认证考试MLA-C01,生成任何与考试相关的多项选择题和答案。

![](https://imgapi.imooc.com/6709d382098105c013321512.jpg)

GenAI 应用程序在 EKS 集群上运行

# 整理

要删掉所有资源,请运行
cdk destroy --all
运行这个命令会删除所有使用cdk创建的资源。

该命令会移除指定的资源并释放已分配的资源。

# 最后总结一下

在这系列的一部分中,我们成功地将Amazon Cognito集成到我们的Amazon EKS部署中,增强了我们GenAI应用的安全性和用户管理功能。敬请期待本系列的下一篇文章,我们将继续完善和优化我们的RAG方案。

# 回顾一下:要了解本系列之前的内容,参阅看看之前的博客帖子。 

(Note: After considering the suggestions, there's a slight redundancy in "参阅看看之前的博客帖子." Since we want to avoid unnecessary repetition and maintain a natural flow, it can be simplified to "看看之前的博客帖子." Therefore, the final version would be:)

# 回顾一下:要了解本系列之前的内容,看看之前的博客帖子。

* [第一部分:使用AWS-CDK构建Amazon OpenSearch Serverless向量数据库](https://vivek-aws.medium.com/rag-solution-using-amazon-bedrock-part-1-build-theamazon-opensearch-serverless-vector-db-using-1656663a302b)
* [第二部分:使用Bedrock Converse API构建MCQ编排器](https://vivek-aws.medium.com/rag-solution-using-amazon-bedrock-part-2-build-the-mcq-orchestrator-using-bedrock-converse-api-61c2b2ce3f20)
* [第三部分:使用ECS Fargate、Bedrock和OpenSearch Serverless自动化应用程序的设置](https://vivek-aws.medium.com/rag-solution-using-amazon-bedrock-part-3-automating-application-setup-with-ecs-fargate-bedrock-b3a55af9f0a4)
* [第四部分:在ECS Fargate、Bedrock和OpenSearch Serverless中集成Cognito身份验证](https://medium.com/rag-solution-using-amazon-bedrock-part-4-integrating-cognito-authentication-with-ecs-fargate-d70b279d4f00)
* [第五部分:增强GenAI应用程序的安全防护](https://medium.com/@vivek-aws/rag-solution-using-amazon-bedrock-part-5-enhancing-security-posture-of-the-genai-application-27c8376597a5)
* [第六部分:使用事件驱动架构增强文档索引功能以增强GenAI应用程序](https://medium.com/@vivek-aws/rag-solution-using-amazon-bedrock-part-6-enhancing-document-indexing-with-event-driven-770eaf167a0a)
* [第七部分:部署到Amazon EKS](https://vivek-aws.medium.com/rag-solution-using-amazon-bedrock-part-7-deploying-on-amazon-eks-bae8a56c0ba1)

# 简单的英语 🚀

 感谢你加入[_**In Plain English**_](https://plainenglish.io)社区!在您离开之前:

* 别忘了给作者点个赞👏,然后 **关注** 她吧!
* 关注我们哦:[**X**](https://twitter.com/inPlainEngHQ) | [**LinkedIn**](https://www.linkedin.com/company/inplainenglish/) | [**YouTube**](https://www.youtube.com/channel/UCtipWUghju290NWcn8jhyAw) | [**Discord**](https://discord.gg/in-plain-english-709094664682340443) | [**Newsletter**](https://newsletter.plainenglish.io/)
* 更多平台请访问:[**CoFeed**](https://cofeed.app/) | [**Differ**](https://differ.blog/)
* 了解更多请访问 [**PlainEnglish.io**](https://plainenglish.io)


这篇关于RAG解决方案在Amazon Bedrock中的第八部分:将Amazon Cognito与Amazon EKS集成在一起的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程