无法使用经过身份验证的访问权限访问 Google 运行 服务
Can't access Google Run service with authenticated access
我在具有访问点 URL https://reporting-intake-service-XXX-uc.a.run.app
的 GCP 项目上有一个云 运行 服务。服务本身使用 Pub/Sub 来推送消息。
更新: 我已经确认问题出在服务中的 Pub/Sub 调用,而不是对服务本身的访问。
Docker 文件
FROM python:3
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD python3 intake.py
intake.py
import logging
from flask import Flask, request
from google.cloud import pubsub_v1
app = Flask(__name__)
@app.route("/", methods=["POST"])
def intake():
try:
report = request.data
publish_message(report)
return "Thanks"
except Exception as e:
logging.error(e)
return "ERROR"
def publish_message(report):
publisher = pubsub_v1.PublisherClient()
future = publisher.publish("projects/my-project/topics/reporting", report)
logging.info(future.result())
if __name__ == "__main__":
app.run(port=8080, host="0.0.0.0", debug=True)
错误信息:
status = StatusCode.PERMISSION_DENIED
details = "User not authorized to perform this action."
我尝试过的:
运行使用服务帐户权限设置 VM:
- 云运行调用者
- 计算实例管理员 (v1)
- Pub/Sub 管理员
要测试的命令:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-identity-token)" -d "{'\id\': \'ThIS IS SOME DATA\'}" https://reporting-intake-service-XXX-uc.a.run.app
回复:
ERROR
https://cloud.google.com/run/docs/authenticating/service-to-service#acquire-token
https://cloud.google.com/run/docs/authenticating/service-to-service#set-up-sa
好的,我解决了。
事实证明,云 运行 服务是使用默认计算服务帐户 ###-compute@developer.gserviceaccount.com
创建的。
Cloud Run > click on service > REVISIONS > SECURITY
附加到 ###-compute@developer.gserviceaccount.com
的 IAM 原则已删除(出于安全目的由我删除)。所以我在 Cloud 运行 上创建的底层服务无法访问 PubSub。
我在这个 sh*t 上花了太多时间。
要明确这是在“需要身份验证”模式下。
我在具有访问点 URL https://reporting-intake-service-XXX-uc.a.run.app
的 GCP 项目上有一个云 运行 服务。服务本身使用 Pub/Sub 来推送消息。
更新: 我已经确认问题出在服务中的 Pub/Sub 调用,而不是对服务本身的访问。
Docker 文件
FROM python:3
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD python3 intake.py
intake.py
import logging
from flask import Flask, request
from google.cloud import pubsub_v1
app = Flask(__name__)
@app.route("/", methods=["POST"])
def intake():
try:
report = request.data
publish_message(report)
return "Thanks"
except Exception as e:
logging.error(e)
return "ERROR"
def publish_message(report):
publisher = pubsub_v1.PublisherClient()
future = publisher.publish("projects/my-project/topics/reporting", report)
logging.info(future.result())
if __name__ == "__main__":
app.run(port=8080, host="0.0.0.0", debug=True)
错误信息:
status = StatusCode.PERMISSION_DENIED
details = "User not authorized to perform this action."
我尝试过的:
运行使用服务帐户权限设置 VM:
- 云运行调用者
- 计算实例管理员 (v1)
- Pub/Sub 管理员
要测试的命令:
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-identity-token)" -d "{'\id\': \'ThIS IS SOME DATA\'}" https://reporting-intake-service-XXX-uc.a.run.app
回复:
ERROR
https://cloud.google.com/run/docs/authenticating/service-to-service#acquire-token
https://cloud.google.com/run/docs/authenticating/service-to-service#set-up-sa
好的,我解决了。
事实证明,云 运行 服务是使用默认计算服务帐户 ###-compute@developer.gserviceaccount.com
创建的。
Cloud Run > click on service > REVISIONS > SECURITY
附加到 ###-compute@developer.gserviceaccount.com
的 IAM 原则已删除(出于安全目的由我删除)。所以我在 Cloud 运行 上创建的底层服务无法访问 PubSub。
我在这个 sh*t 上花了太多时间。
要明确这是在“需要身份验证”模式下。