使用工作负载身份联合从AWS调用Vertex AI
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
工作负载身份联合是谷歌云IAM的一项核心功能,它允许在谷歌云外部运行的工作负载将其自身的身份(例如AWS IAM角色)交换为短期的谷歌凭据,从而彻底告别传统的服务账号密钥文件。当通过像 n1n.ai 这样的企业级聚合网关路由AI请求时,消除长期静态密钥能够显著提升整体安全水位。
传统的服务账号密钥文件是一个长期存在的敏感机密:只要掌握这个JSON文件,任何人都可以获得该账号的全部权限,直到有人手动轮换或删除它。而工作负载身份联合则直接去掉了这个文件。谷歌云选择信任外部身份提供商,外部工作负载向谷歌安全令牌服务出示其身份证明,随后系统会返回一个短期有效的访问令牌。
对于AWS而言,身份证明是一个经过签名的 GetCallerIdentity 请求。工作负载使用其AWS凭据对请求进行签名,但并不将其发送给AWS;谷歌负责验证签名并从中读取调用者的ARN。诸如 n1n.ai 这样的平台正是依赖这种现代架构,在不牺牲合规性的前提下简化了多云集成流程。
认证方式对比分析
| 特性 | 服务账号密钥 | 工作负载身份联合 |
|---|---|---|
| AWS端存储的机密 | 保存在机密存储或Pod中的JSON密钥文件 | 无 |
| 凭据生命周期 | 直到被轮换或删除 | 短期令牌,自动刷新 |
| 轮换机制 | 手动,按密钥进行 | 不需要 |
| 适用对象 | 任何持有该文件的人 | 仅限拥有受信任AWS角色的工作负载 |
| 审计身份 | 服务账号 | AWS角色,或记录了角色作为委托人的服务账号 |
对于一个通过 n1n.ai 管理多提供商大模型调用的网关而言,移除哪怕一个长期机密也至关重要。凭据蔓延在AI技术栈中依然是一个常见风险,而妥善管理此类机器身份能够有效保护企业的基础设施。
谷歌云侧配置步骤
请在将要为Vertex AI付费的谷歌云项目中运行以下命令。首先,启用必需的API。sts.googleapis.com 负责执行令牌交换,而 iamcredentials.googleapis.com 仅在需要模拟服务账号时使用:
gcloud services enable aiplatform.googleapis.com sts.googleapis.com iamcredentials.googleapis.com \
--project=PROJECT_ID
接下来,创建一个工作负载身份池和一个信任您AWS账号的AWS提供商:
gcloud iam workload-identity-pools create POOL_ID \
--project=PROJECT_ID \
--location=global \
--display-name="Gateway on AWS"
gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
--project=PROJECT_ID \
--location=global \
--workload-identity-pool=POOL_ID \
--account-id=AWS_ACCOUNT_ID \
--attribute-mapping="google.subject=assertion.arn,attribute.aws_role=assertion.arn.extract('assumed-role/{role}/')" \
--attribute-condition="attribute.aws_role == 'BIFROST_ROLE_NAME'"
打印提供商的完整名称,该名称将用作配置中的audience(受众):
gcloud iam workload-identity-pools providers describe PROVIDER_ID \
--project=PROJECT_ID --location=global --workload-identity-pool=POOL_ID \
--format="value(name)"
AWS集成与网关配置
此流程中的IAM角色不需要任何特殊的AWS权限,因为 sts:GetCallerIdentity 始终是被允许的。在EKS上,可以使用IRSA或EKS Pod Identity。通过IRSA,为Kubernetes服务账号添加注解:
kubectl annotate serviceaccount KSA_NAME \
--namespace NAMESPACE \
eks.amazonaws.com/role-arn=arn:aws:iam::AWS_ACCOUNT_ID:role/BIFROST_ROLE_NAME
在 n1n.ai 上配置网关时,请在Vertex AI配置中使用 aws_workload_identity 块来无缝处理令牌交换:
{
"providers": {
"vertex": {
"keys": [
{
"name": "vertex-eks-key",
"value": "",
"models": ["*"],
"weight": 1.0,
"vertex_key_config": {
"project_id": "env.VERTEX_PROJECT_ID",
"region": "us-central1",
"aws_workload_identity": {
"audience": "//iam.googleapis.com/projects/123456789012/locations/global/workloadIdentityPools/eks-pool/providers/aws"
}
}
}
]
}
}
}
故障排除与验证
若要从Pod内部确认AWS侧工作正常,请执行:
kubectl exec -n NAMESPACE POD_NAME -- aws sts get-caller-identity
如果返回的ARN显示的是IAM用户或节点角色,而不是您期望的角色,请在调用模型端点之前修复该配置。配合高性能聚合器使用时,延迟可以轻松控制在 < 50ms 以内。
Get a free API key at n1n.ai