设置持久化存储
如果您在云端托管Label Studio,建议在与部署相同的云服务中为上传的任务数据、用户图片等设置持久化存储。
根据您的部署方式选择相关步骤。如果使用Docker Compose,请选择您希望用作持久存储的云服务:
- 设置Amazon S3用于在亚马逊网络服务(AWS)中部署Label Studio。
- 设置Google云存储(GCS)用于在Google云平台中部署Label Studio。
- 设置 Microsoft Azure 存储 用于在 Microsoft Azure 中部署 Label Studio。
设置 Amazon S3
将Amazon S3设置为在AWS中托管或使用Docker Compose部署的Label Studio的持久化存储。
创建S3存储桶
首先按照《Amazon Simple Storage Service用户指南》中的步骤创建S3存储桶。
备注
如果您希望对存储在S3存储桶中的数据进行静态加密,可以按照《Amazon Simple Storage Service用户指南》中的步骤为Amazon S3存储桶设置默认服务器端加密。
为S3存储桶配置CORS
备注
如果您打算使用直接文件上传功能并存储音频、视频、CSV等媒体文件,则需要完成此步骤。
设置对您存储桶的跨域资源共享(CORS)访问权限。请参阅Amazon S3用户指南中的配置跨域资源共享(CORS)。使用或修改以下示例:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"x-amz-server-side-encryption",
"x-amz-request-id",
"x-amz-id-2"
],
"MaxAgeSeconds": 3600
}
]
配置S3存储桶
创建S3存储桶后,设置必要的IAM权限以授予Label Studio访问您的存储桶的权限。您可以通过以下四种方式管理对S3存储桶的访问:
- 设置一个带有OIDC提供商的IAM角色(推荐)。
- 使用访问快捷键。
- 设置一个IAM角色,无需OIDC提供者。
- 使用Docker Compose访问密钥。
选择相关选项卡并按照您所需选项的步骤操作:
备注
要使用此方法设置IAM角色,您必须为集群配置并部署OIDC提供商。请参阅Amazon EKS用户指南中的为集群创建IAM OIDC提供商。
按照步骤在Amazon EKS用户指南中为您的服务账户创建IAM角色和策略。
使用以下IAM策略,将
替换为您的存储桶名称:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::/*" ] } ] }使用集群OIDC提供商作为身份提供商,创建一个IAM角色作为Web身份:
- 从您的IAM控制台创建一个新的角色。
- 选择Web身份选项卡。
- 在身份提供商下拉菜单中,选择您EKS的OpenID Connect提供商URL,并将
sts.amazonaws.com作为受众。 - 将新创建的权限附加到角色并为其命名。
- 检索下一步所需的角色ARN。
创建IAM角色后,将其作为注释添加到您的
ls-values.yaml文件中。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):global: persistence: enabled: true type: s3 config: s3: bucket: "" region: "" folder: "" app: serviceAccount: annotations: eks.amazonaws.com/role-arn: arn:aws:iam:::role/ rqworker: serviceAccount: annotations: eks.amazonaws.com/role-arn: arn:aws:iam:::role/
创建一个具有编程访问权限的IAM用户。详情请参阅AWS身份和访问管理用户指南中的在AWS账户中创建IAM用户。
创建用户时,对于设置权限选项,选择直接附加现有策略。
选择创建策略并附加以下策略,将
替换为您的存储桶名称:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::/*" ] } ] }创建用户后,请将用户名和访问密钥保存在安全的地方。
使用新创建的访问密钥ID和密钥更新您的
ls-values.yaml文件,替换和。 可选地,您可以通过指定folder参数选择文件夹(默认为""或省略此参数):global: persistence: enabled: true type: s3 config: s3: accessKey: "" secretKey: "" bucket: "" region: "" folder: ""
备注
可选地,您可以使用现有的Kubernetes密钥和密钥。
- 使用您的AWS访问密钥创建Kubernetes密钥:
kubectl create secret generic--from-literal=accesskey= --from-literal=secretkey= - 使用新创建的Kubernetes密钥更新您的
ls-values.yaml文件:global: persistence: enabled: true type: s3 config: s3: accessKeyExistingSecret: "" accessKeyExistingSecretKey: "accesskey" secretKeyExistingSecret: "" secretKeyExistingSecretKey: "secretkey" bucket: "" region: ""
要在EKS中不使用OIDC创建IAM角色,请按照以下步骤操作。
在AWS控制台界面中,前往EKS > 集群 >
YOUR_CLUSTER_NAME> 节点组。选择已部署Label Studio的
YOUR_NODE_GROUP名称。在详情页面,找到并选择Node IAM角色ARN选项,然后选择直接附加现有策略。
选择创建策略并附加以下策略,将
替换为您的存储桶名称:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::/*" ] } ] }添加IAM策略后,配置您的
ls-values.yaml文件。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):global: persistence: enabled: true type: s3 config: s3: bucket: "" region: "" folder: ""
创建一个具有编程访问权限的IAM用户。详情请参阅AWS身份和访问管理用户指南中的在AWS账户中创建IAM用户。
创建用户时,对于设置权限选项,选择直接附加现有策略。
选择创建策略并附加以下策略,将
替换为您的存储桶名称:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::" ] }, { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::/*" ] } ] }创建用户后,请将用户名和访问密钥保存在安全的地方。
更新您的
env.list文件,将和替换为您新创建的访问密钥ID和密钥。可选地,您可以使用STORAGE_AWS_FOLDER指定一个文件夹(默认为""或省略此参数):STORAGE_TYPE=s3 STORAGE_AWS_ACCESS_KEY_ID="" STORAGE_AWS_SECRET_ACCESS_KEY=" " STORAGE_AWS_BUCKET_NAME=" " STORAGE_AWS_REGION_NAME=" " STORAGE_AWS_FOLDER=""
设置Google云存储
将Google Cloud Storage (GCS)设置为在Google Cloud Platform (GCP)或Docker Compose中托管的Label Studio的持久化存储。
创建GCS存储桶
- 首先创建一个存储桶。参考Google云存储指南中的创建存储桶。例如,创建一个名为
heartex-example-bucket-123456的存储桶。 - 当为存储桶选择访问控制方法时,请选择统一访问控制。
- 创建一个IAM服务账号。详情请参阅Google Cloud Storage指南中的创建和管理服务账号。
- 选择预定义的存储对象管理员IAM角色添加到服务账户,以便该账户可以创建、访问和删除存储桶中的对象。
- Add a condition to the role that restricts the role to access only objects that belong to the bucket you created. You can add a condition in one of two ways:
- Select Add Condition when setting up the service account IAM role, then use the Condition Builder to specify the following values:
- 条件类型:
Name - 运算符:
Starts with - 值:
projects/_/buckets/heartex-example-bucket-123456
- 条件类型:
- 或者,使用通用表达式语言 (CEL) 来指定IAM条件。例如,设置如下:
resource.name.startsWith('projects/_/buckets/heartex-example-bucket-123456')。参阅Google Cloud Storage指南中的IAM条件概述中的CEL条件。
- Select Add Condition when setting up the service account IAM role, then use the Condition Builder to specify the following values:
为GCS存储桶配置CORS
备注
如果您打算使用直接文件上传功能并存储音频、视频、CSV等媒体文件,则需要完成此步骤。
设置对您存储桶的CORS访问权限。请参阅Google云用户指南中的配置跨源资源共享(CORS)。使用或修改以下示例:
echo '[
{
"origin": ["*"],
"method": ["GET","PUT","POST","DELETE","HEAD"],
"responseHeader": ["Content-Type","Access-Control-Allow-Origin"],
"maxAgeSeconds": 3600
}
]' > cors-config.json
将以下命令中的YOUR_BUCKET_NAME替换为您实际的存储桶名称,以更新存储桶的CORS设置:
gsutil cors set cors-config.json gs://YOUR_BUCKET_NAME
配置GCS存储桶
您可以通过工作负载身份或访问密钥将Label Studio连接到您的GCS存储桶。
创建存储桶并设置IAM权限后,将Label Studio连接到您的GCS存储桶。您可以通过以下三种方式连接到存储桶:
- 使用工作负载身份(Workload Identity)允许GKE中的工作负载通过模拟您创建的服务账号来访问GCS存储桶(推荐)。
- 创建服务账号密钥以便在Google Cloud外部使用该服务账号。
- 创建一个服务账号密钥以用于Docker Compose。
备注
确保您的GKE集群已启用工作负载身份并满足必要前提条件。请参阅Google Kubernetes Engine指南中的使用工作负载身份。
设置以下环境变量,将您创建的服务账号指定为
GCP_SA变量,并根据需要替换<>中的其他引用:GCP_SA=APP_SA="serviceAccount: .svc.id.goog[ / -lse-app]" WORKER_SA="serviceAccount: .svc.id.goog[ / -lse-rqworker]" 在您的Kubernetes集群服务账户与创建的GCS服务账户之间建立IAM策略绑定,允许Label Studio应用及其相关rqworkers的K8s服务账户模拟另一个服务账户。从命令行运行以下命令:
gcloud iam service-accounts add-iam-policy-binding ${GCP_SA} \ --role roles/iam.workloadIdentityUser \ --member "${APP_SA}" gcloud iam service-accounts add-iam-policy-binding ${GCP_SA} \ --role roles/iam.workloadIdentityUser \ --member "${WORKER_SA}"绑定服务账号后,更新您的
ls-values.yaml文件以包含服务账号和其他配置的值。更新projectID、bucket,并将替换为部署相关的实际值。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):global: persistence: enabled: true type: gcs config: gcs: projectID: "" bucket: "" folder: "" app: serviceAccount: annotations: iam.gke.io/gcp-service-account: "" rqworker: serviceAccount: annotations: iam.gke.io/gcp-service-account: ""
您可以使用自己创建的服务账号密钥,或者如果已有Kubernetes密钥和密钥对,请按照以下步骤来使用它们。
创建新的服务账户密钥
从用户界面创建服务账号密钥并下载JSON文件。按照Google Cloud身份与访问管理指南中的创建和管理服务账号密钥步骤操作。
下载完服务账号密钥的JSON文件后,在您的
ls-values.yaml文件中更新或创建对JSON、项目ID和存储桶的引用。 可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):global: persistence: enabled: true type: gcs config: gcs: projectID: "" applicationCredentialsJSON: "" bucket: "" folder: ""
使用现有的Kubernetes密钥和密钥
使用您的GCS服务账号JSON文件创建一个Kubernetes密钥,将
替换为服务账号JSON文件的路径:kubectl create secret generic--from-file=key_json= 使用新创建的Kubernetes密钥更新您的
ls-values.yaml文件:global: persistence: enabled: true type: gcs config: gcs: projectID: "" applicationCredentialsJSONExistingSecret: "" applicationCredentialsJSONExistingSecretKey: "key_json" bucket: ""
从用户界面创建服务账号密钥并下载JSON文件。按照Google Cloud身份与访问管理指南中的创建和管理服务账号密钥步骤操作。
下载完服务账号密钥的JSON文件后,在您的
env.list文件中更新或创建对JSON、项目ID和存储桶的引用。 可选地,您可以通过指定STORAGE_GCS_FOLDER来选择文件夹(默认为""或省略此参数):STORAGE_TYPE=gcs STORAGE_GCS_BUCKET_NAME="" STORAGE_GCS_PROJECT_ID=" " STORAGE_GCS_FOLDER="" GOOGLE_APPLICATION_CREDENTIALS="/opt/heartex/secrets/key.json" 将步骤1中下载的JSON文件放置在与
env.list文件相同的目录中。在
docker-compose.yml文件中为app.volumes路径添加以下条目:- ./service-account-file.json:/opt/heartex/secrets/key.json:ro
设置 Microsoft Azure 存储
创建一个Microsoft Azure存储容器,用作Label Studio的持久化存储。
创建存储容器
- 创建一个Azure存储账户。详情请参阅Microsoft Azure产品文档中的创建存储账户。
备注
请确保将库存单位(SKU)设置为Premium_LRS,并将kind参数设为BlockBlobStorage。此配置将使用固态硬盘(SSD)而非标准机械硬盘(HDD)作为存储介质。若将该参数设置为基于HDD的存储选项,您的实例可能会运行过慢甚至出现故障。
在Azure Portal的存储账户 > 访问密钥部分查找生成的密钥,或通过运行以下命令获取:
az storage account keys list --account-name=${STORAGE_ACCOUNT}按照Microsoft Azure产品文档中使用Azure门户上传、下载和列出Blob的步骤在您的存储账户中创建存储容器,或运行以下命令:
az storage container create --name\ --account-name \ --account-key " "
为Azure存储桶配置CORS
备注
如果您打算使用直接文件上传功能并存储音频、视频、CSV等媒体文件,则需要完成此步骤。
设置对您存储桶的CORS访问权限。请参阅Azure用户指南中的配置跨域资源共享(CORS)。使用或修改以下示例:
<Cors>
<CorsRule>
<AllowedOrigins>*</AllowedOrigins>
<AllowedMethods>GET,PUT,POST,DELETE,HEAD</AllowedMethods>
<AllowedHeaders>x-ms-blob-content-type</AllowedHeaders>
<ExposedHeaders>x-ms-*</ExposedHeaders>
<MaxAgeInSeconds>3600</MaxAgeInSeconds>
</CorsRule>
<Cors>
配置Azure容器
您可以通过Kubernetes中的账户密钥或Docker Compose中的账户密钥,将Label Studio连接到您的Azure容器。请选择与您的Label Studio部署相关的选项。
使用您创建的YOUR_CONTAINER_NAME、YOUR_STORAGE_ACCOUNT和YOUR_STORAGE_KEY更新您的ls-values.yaml文件。
可选地,您可以通过指定folder来选择文件夹(默认为""或省略此参数):
global:
persistence:
enabled: true
type: azure
config:
azure:
storageAccountName: "<YOUR_STORAGE_ACCOUNT>"
storageAccountKey: "<YOUR_STORAGE_KEY>"
containerName: "<YOUR_CONTAINER_NAME>"
folder: ""
如果您已有现有密钥,可以直接使用它来创建Kubernetes密钥。
- 使用您的Azure访问密钥创建Kubernetes密钥:
kubectl create secret generic--from-literal=storageaccountname= --from-literal=storageaccountkey= - 使用新创建的Kubernetes密钥更新您的
ls-values.yaml文件:global: persistence: enabled: true type: azure config: azure: storageAccountNameExistingSecret: "" storageAccountNameExistingSecretKey: "storageaccountname" storageAccountKeyExistingSecret: "" storageAccountKeyExistingSecretKey: "storageaccountkey" containerName: ""
在您的env.list文件中更新您创建的YOUR_CONTAINER_NAME、YOUR_STORAGE_ACCOUNT和YOUR_STORAGE_KEY。
可选地,您可以通过指定STORAGE_AZURE_FOLDER来选择文件夹(默认为""或省略此参数):
STORAGE_TYPE=azure
STORAGE_AZURE_ACCOUNT_NAME="<YOUR_STORAGE_ACCOUNT>"
STORAGE_AZURE_ACCOUNT_KEY="<YOUR_STORAGE_KEY>"
STORAGE_AZURE_CONTAINER_NAME="<YOUR_CONTAINER_NAME>"
STORAGE_AZURE_FOLDER=""