如何将一键式 Identity Aware Proxy (IAP) 与 Cloud Run 搭配使用

1. 简介

概览

此 Codelab 将向您详细介绍如何从 Cloud Run 启用 Identity-Aware Proxy,以及如何通过路由到 IAP 进行身份验证来保护要连接到 Cloud Run 服务的流量。通过在 Cloud Run 中启用 IAP,您可以一键路由来自所有入站流量路径(包括默认 run.app 网址和负载平衡器)的流量。

在此 Codelab 中,您将部署 hello 容器服务。只有已使用 IAP 列入许可名单的用户才能使用该服务。

如需了解其他已知限制,请参阅 Cloud Run 上的 IAP 文档

学习内容

  • 如何为 Cloud Run 启用一键式 IAP
  • 如何通过 IAP 向用户身份授予对 Cloud Run 服务的访问权限

2. 准备工作

启用 API

在开始使用此 Codelab 之前,请通过运行以下命令启用以下 API:

gcloud services enable \
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com \
    iap.googleapis.com \
    run.googleapis.com \
    cloudresourcemanager.googleapis.com

3. 创建环境变量

设置将在此 Codelab 中全程使用的环境变量

export PROJECT_ID=<YOUR_PROJECT_ID>
export REGION=<YOUR_REGION>

export SERVICE_NAME=iap-example
export SERVICE_ACCOUNT_NAME=iap-example-sa
export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" --format="value(projectNumber)")

4. 部署启用了 IAP 的服务

运行以下命令创建服务账号(用作 Cloud Run 服务身份):

gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
  --display-name="IAP codelab CR identity"

部署启用了 IAP 的 hello 容器映像。

gcloud beta run deploy ${SERVICE_NAME} \
    --image=us-docker.pkg.dev/cloudrun/container/hello \
    --region=${REGION} \
    --service-account $SERVICE_ACCOUNT_NAME@${PROJECT_ID}.iam.gserviceaccount.com \
    --no-allow-unauthenticated \
    --iap

注意:如果您现在尝试访问该应用,会看到 You don't have access 错误页面。在下一步中,您将通过 IAP 向用户授予访问权限。

5. 配置 IAP 访问权限控制

创建 IAP 服务代理

gcloud beta services identity create --service=iap.googleapis.com --project=${PROJECT_ID}

向 IAP 服务账号分配 Cloud Run Invoker 角色

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-iap.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

通过 IAP 允许特定用户或群组访问,从而向用户授予访问权限

EMAIL_ADDRESS=<YOUR_EMAIL>

gcloud beta iap web add-iam-policy-binding \
    --resource-type=cloud-run \
    --service=${SERVICE_NAME} \
    --region=${REGION} \
    --member=user:${EMAIL_ADDRESS} \
    --role=roles/iap.httpsResourceAccessor \
    --condition=None

注意:如果愿意,您还可以在成员参数中使用 group:your-group@example.com。

6. 测试应用

验证对应用的访问权限

获取示例 Cloud Run 服务的网址。

gcloud run services describe ${SERVICE_NAME} --region ${REGION} --format 'value(status.url)'

在浏览器中打开该网址,您应该会看到“It's Running! 恭喜,您已成功将容器映像部署到 Cloud Run”

验证是否已移除对应用的访问权限

您可以通过运行以下命令移除对该应用的访问权限。

gcloud beta iap web remove-iam-policy-binding \
    --resource-type=cloud-run \
    --service=${SERVICE_NAME} \
    --region=${REGION} \
    --member=user:${EMAIL_ADDRESS} \
    --role=roles/iap.httpsResourceAccessor

请等待几分钟,让 IAM 政策传播。现在,尝试在浏览器中打开该网址,您会看到 You don't have access 错误页面。

7. 恭喜!

恭喜您完成此 Codelab!

建议您查看 Cloud Run IAP 文档。

所学内容

  • 如何为 Cloud Run 启用一键式 IAP
  • 如何通过 IAP 向用户身份授予对 Cloud Run 服务的访问权限

8. 清理

为避免意外产生费用,例如,如果 Cloud Run 服务的意外调用次数超出了免费层级的 Cloud Run 调用配额,您可以删除在第 6 步中创建的 Cloud Run 服务 iap-example

如需删除 Cloud Run 服务,请前往 Cloud Run Cloud 控制台 (https://console.cloud.google.com/run),然后删除 iap-example 服务。

如需删除整个项目,请前往管理资源,选择您的项目,然后选择“删除”。如果您删除该项目,则需要在 Cloud SDK 中更改项目。您可以通过运行 gcloud projects list 来查看所有可用项目的列表。