Skip to content

调试界面以及API部署

supinyu edited this page Jun 30, 2024 · 31 revisions

1、CDK部署

目前该CDK版本,可以部署调试界面,终端用户界面以及OpenSearch服务

1、准备工作

进行CDK安装需要依赖python,pip和npm环境。您可以使用可联网的本地开发环境或者Amazon EC2环境。本文以操作系统Amazon Linux 2023为例进行说明, 请登陆AWS console进入us-east-1, 并进入EC2 Instance的管理界面,如下:

image

点击Launch Instances, 输入EC2实例的名称,例如GenBI_installer,点击Browse more AMIs:

image

操作系统默认选择Amazon Linux 2023 AMI

在Instance type选项,选择实例t3.large,如下图

image

点击Create new key pair并保存以便后续SSH登陆使用,例如GenBI_installer.pem

image

存储空间默认设定20g,安全组保持默认:

image

点击Advanced details,在IAM instance profile,点击create new IAM profile:

image

点击“Create Role”:

image

选择AWS Serivie以及EC2作为Serivce or Use Case:

image

选择AdministratorAccess作为Permission Policy:

image

输入Role Name 为genbi_installer_role, 点击创建“Create Role”:

image

回到EC2 instance控制台在IAM Instance Profile处选取这个IAM Role "genbi_installer_role"

image

点击Launch,等待EC2实例初始化和启动,实例启动后,如下图:

image

1-2、CDK安装部署准备

使用“ec2-user”用户以及保存的key pair文件(例如GenBI_installer.pem)登录到该EC2实例,进入/home/ec2-user/目录. 该版本通常已经内置python3,先安装pip,git与npm等环境依赖

sudo yum install -y pip git npm docker

然后安装 AWS CDK

sudo npm install -g aws-cdk

npm install aws-cdk-lib

启动docker

sudo yum install docker -y

sudo service docker start

sudo chmod 666 /var/run/docker.sock

下载最新版本代码,执行如下命令:

git clone https://github.com/aws-samples/generative-bi-using-rag

cd generative-bi-using-rag/application && cp .env.template .env 

(注:中国区github有可能连接稳定性问题,您也可以将public repo的软件包手动从github下载下来)

1-2-1、设置调试界面的密码

配置登录的用户名和密码,部署代码之前,必须设置登录用户名和密码

修改如下文件

application/config_files/stauth_config.yaml

密码需要从明文转换成哈希过之后的密码,可以通过如下方式,获取

pip install streamlit-authenticator~=0.3.2

python3 generate_streamlit_password.py

输入需要转换的密码,就可以得到哈希过之后的密码,将改密码添加到,application/config_files/stauth_config.yaml文件中

please enter the password: abc

hashed_passwords:  xxxxxxxxxxxx

将xxxxxxxxxxxx,copy到password这个地方,如果想添加多个用户名,也可以在stauth_config.yaml这个文件进行配置

credentials:
  usernames:
    admin:
      email: [email protected]
      failed_login_attempts: 0 # Will be managed automatically
      logged_in: False # Will be managed automatically
      name: AWS
      password: # Set the password following instructions in README
cookie:
  expiry_days: 30
  key: some_signature_key # Must be string
  name: some_cookie_name
pre-authorized:
  emails:
    - [email protected]

1-3、CDK部署

将您的账号信息以及需要部署的Region ID导入到环境变量中,本workshop建议您将智能搜索方案部署在us-east-1:

export AWS_ACCOUNT_ID=XXXXXXXXXXXX
export AWS_REGION=xx-xx-x
cd generative-bi-using-rag/source/resources

cdk bootstrap

cdk deploy GenBiMainStack --require-approval never

部署完成之后,可以得到endpoint的地址

GenBiMainStack.AOSDomainEndpoint = XXXXX.us-east-1.es.amazonaws.com
GenBiMainStack.APIEndpoint = XXXXX.us-east-1.elb.amazonaws.com
GenBiMainStack.FrontendEndpoint = XXXXX.us-east-1.elb.amazonaws.com
GenBiMainStack.StreamlitEndpoint = XXXXX.us-east-1.elb.amazonaws.com

GenBiMainStack.StreamlitEndpoint 这个页面是系统的调试页面

GenBiMainStack.FrontendEndpoint 这个页面是针对普通用户的界面

2、手动部署-调试界面

如果上一步,CDK部署失败,可以尝试手动部署调试界面

2-1、创建ECR仓库

本文架构图中使用ECS服务,在手动部署服务之前,需要先创建一个ECR仓库

image

2-2、编译镜像

2-2-1、安装组件

编译镜像,您可以使用可联网的本地开发环境或者Amazon EC2环境。

本文以操作系统Amazon Linux 2023为例进行说明, 请登陆AWS console进入us-west-2(默认选择本区域), 并进入EC2 Instance的管理界面,然后以ec2-user用户登录

sudo su - ec2-user
# 对于组件

sudo yum install docker python3-pip git -y

# 安装aws cli

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

unzip awscliv2.zip

sudo ./aws/install

sudo ln -s /usr/local/bin/aws /usr/bin/aws

# 安装docker-compose

sudo pip3 install --ignore-installed docker-compose

# 修复docker的python包装器7.0 SSL版本问题

pip3 install docker==6.1.3 

# 修复requests版本升级导致的问题

pip3 install requests==2.31.0

# 配置组件
sudo systemctl enable docker

sudo systemctl start docker

sudo usermod -aG docker $USER

# 刷新当前用户的组成员身份

newgrp docker

然后下载代码

# 克隆代码
git clone https://github.com/aws-samples/generative-bi-using-rag.git

# 在.env文件里配置环境变量
cd generative-bi-using-rag/application && cp .env.template .env 

2-2-3、登录密码设置

配置登录的用户名和密码,部署代码之前,必须设置登录用户名和密码

修改如下文件

application/config_files/stauth_config.yaml

密码需要从明文转换成哈希过之后的密码,可以通过如下方式,获取

pip install streamlit-authenticator~=0.3.2

python3 generate_streamlit_password.py

输入需要转换的密码,就可以得到哈希过之后的密码,将改密码添加到,application/config_files/stauth_config.yaml文件中

please enter the password: abc

hashed_passwords:  xxxxxxxxxxxx

将xxxxxxxxxxxx,copy到password这个地方,如果想添加多个用户名,也可以在stauth_config.yaml这个文件进行配置

credentials:
  usernames:
    admin:
      email: [email protected]
      failed_login_attempts: 0 # Will be managed automatically
      logged_in: False # Will be managed automatically
      name: AWS
      password: # Set the password following instructions in README
cookie:
  expiry_days: 30
  key: some_signature_key # Must be string
  name: some_cookie_name
pre-authorized:
  emails:
    - [email protected]

2-2-4、OpenSearch密钥设置

由于需要使用OpenSearch进行向量检索,所以需要创建OpenSearch实例,POC建议使用m5.large.search,生产环境,建议使用r6g.2xlarge.search

创建完成之后,需要将host、用户名、密码一起上传到AWS Secrets Manager中

具体示例如下

密钥名称

  • opensearch-host-url

  • 密钥键值

  • 密钥键:host,密钥值:search-xxxx-xxxxx.aos.us-west-2.on.aws(不带http)

  • 密钥名称

    • opensearch-master-user
  • 密钥键值

    • 密钥键:username,密钥值,xxxx
    • 密钥键:password,密钥值,xxxx

image

2-2-5、BedRock访问权限

确保您已在us-west-2(美国西部(俄勒冈州))区域的AWS控制台中为Anthropic Claude模型和Amazon Titan嵌入模型启用了模型访问。

image

BedRock的访问,可以使用IAM Role或者AK/SK两种方式进行访问

  • IAM 方式

需要在ECR任务执行的时候,添加IAM Role,IAM Role的示例如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:*Item",
                "dynamodb:*Table",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:**YOURACCOUNTID*:table/*",
            "Effect": "Allow"
        },
        {
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-west-2:**YOURACCOUNTID*:secret:*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "bedrock:InvokeModel",
                "bedrock:InvokeModelWithResponseStream"
            ],
            "Resource": "arn:aws:bedrock:us-west-2:**YOURACCOUNTID*:foundation-model/*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "cognito-identity:*",
                "cognito-idp:*"
            ],
            "Resource": [
                "arn:aws:cognito-identity:us-west-2:**YOURACCOUNTID*:identitypool/*",
                "arn:aws:cognito-idp:us-west-2:**YOURACCOUNTID*:userpool/*"
            ],
            "Effect": "Allow"
        }
    ]
}

国内用户权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "dynamodb:*Table",
                "dynamodb:*Item",
                "dynamodb:Scan",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws-cn:dynamodb:cn-north-1:**YOURACCOUNTID**:table/Nlq*"
            
        },
        {
            "Sid": "SecretsManagerAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws-cn:secretsmanager:cn-north-1:**YOURACCOUNTID**:secret:*"
        }

    ]
}

2-2-6、配置环境变量

  • OpenSearch配置
OPENSEARCH_TYPE=service       # 设置OpenSearch类型
AOS_AWS_REGION=us-west-2      # 设置OpenSearch region
AOS_INDEX=uba                 # 设置索引名称
AOS_INDEX_NER=uba_ner         # 设置索引名称
AOS_INDEX_AGENT=uba_agent     # 设置索引名称
  • Embedding设置

需要设置Embedding的模型名称和维度值

EMBEDDING_DIMENSION=1536
BEDROCK_EMBEDDING_MODEL=amazon.titan-embed-text-v1
  • AWS region配置
BEDROCK_REGION=us-west-2
RDS_REGION_NAME=us-west-2
AWS_DEFAULT_REGION=us-west-2
DYNAMODB_AWS_REGION=us-west-2
  • 密钥配置

如果使用AK/SK访问BedRock,需要提前存储好AK/SK,到AWS Secrets Manager中

如果使用IAM Role,请删除BEDROCK_SECRETS_AK_SK变量

# leave blank if you use default ak/sk profile. Other wise provide the profile name for profile used for bedrock
BEDROCK_SECRETS_AK_SK=bedrock-ak-sk
OPENSEARCH_SECRETS_URL_HOST=opensearch-host-url
OPENSEARCH_SECRETS_USERNAME_PASSWORD=opensearch-master-user

整理之后的配置文件如下:

OPENSEARCH_TYPE=service
AOS_AWS_REGION=us-west-2
AOS_INDEX=uba
AOS_INDEX_NER=uba_ner
AOS_INDEX_AGENT=uba_agent

BEDROCK_REGION=us-west-2
RDS_REGION_NAME=us-west-2
AWS_DEFAULT_REGION=us-west-2
DYNAMODB_AWS_REGION=us-west-2

EMBEDDING_DIMENSION=1536
BEDROCK_EMBEDDING_MODEL=amazon.titan-embed-text-v1

# If you need to use ak/sk to access bedrock, please configure bedrock's ak/sk to Secrets Manager, Examples are as follows

# BEDROCK_SECRETS_AK_SK=bedrock-ak-sk

BEDROCK_SECRETS_AK_SK=

OPENSEARCH_SECRETS_URL_HOST=opensearch-host-url
OPENSEARCH_SECRETS_USERNAME_PASSWORD=opensearch-master-user

将上述的配置,存放到.env中

2-2-7、编辑镜像

我们已经创建了ECR仓库,然后可以查看推送命令

截屏2024-06-27 22 41 04

进行第2步,打包镜像的时候,需要使用下面的命令进行替换

platform根据目标运行平台选择 不写默认会遵从构建机的平台

# run on linux ec2/lambda/ecs(amd64)
# docker buildx build --platform linux/amd64 --network host -t genbi-deploy .

最后将镜像推动到ECR中

image

2-3、ECS部署

2-3-1、创建ECS集群

其中,Infrastructure 类型建议选择AWS Fargate (serverless)

image

2-3-2、创建Task

image

Task roles 的时候,我们需要添加相关的Role权限

截屏2024-06-28 09 05 05

我们可以在IAM中创建一个新的Role

image

相关的权限如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:*Item",
                "dynamodb:*Table",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:**YOURACCOUNTID*:table/*",
            "Effect": "Allow"
        },
        {
            "Action": "secretsmanager:GetSecretValue",
            "Resource": [
                "arn:aws:secretsmanager:us-west-2:**YOURACCOUNTID*:secret:*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "bedrock:InvokeModel",
                "bedrock:InvokeModelWithResponseStream"
            ],
            "Resource": "arn:aws:bedrock:us-west-2:**YOURACCOUNTID*:foundation-model/*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "cognito-identity:*",
                "cognito-idp:*"
            ],
            "Resource": [
                "arn:aws:cognito-identity:us-west-2:**YOURACCOUNTID*:identitypool/*",
                "arn:aws:cognito-idp:us-west-2:**YOURACCOUNTID*:userpool/*"
            ],
            "Effect": "Allow"
        }
    ]
}

Image URL 从ECR中copy得到

image

创建任务完成

image

2-3-3、创建使用该任务定义的服务

在导航窗格中,选择集群。在 Services(服务)选项卡上,选择 Create(创建)。在 Deployment configuration(部署配置)下,指定应用程序的部署方式。

  • 在 Task Definitions(任务定义)中,选择您在上一步骤中创建的任务定义。
  • 对于 Service name(服务名称),为您的服务输入一个名称。
  • 对于 Desired tasks(所需任务),选择最新的版本
image image

安全组可以重新创建,开放80和8501端口

image

Services创建完成

image

最后可以页面地址

image

2-3-4、访问Web UI调试页面

在浏览器中打开网址: http://your-ecs-public-ip:8501

注意:使用 HTTP 而不是 HTTPS。

输入设置的用户名和密码

username: admin password:

2-4、准备数据库链接

需要用户准备好数据库链接,RDS MySQL,Amazon Redshift,PostgreSQL

Clone this wiki locally