commew / timelogger-api

時間記録アプリAPI
MIT License
2 stars 0 forks source link

[実装作業含む] Github Actions の設定 (本番デプロイのみ) #14

Closed HaruyaFujimoto closed 1 year ago

HaruyaFujimoto commented 1 year ago

https://github.com/commew/timelogger-api/issues/9#issuecomment-1435492778 こちらで色々決まり、その次のアクションとしてのタスク。

このタスクでやること

- github actions の設定
  - トリガーを決める
  - job の中で gcloud-cli を使えるようにする
  - 現在は検証環境のことは考えず、以下のフローとする
    - テスト (今はスキップでいいかも)
    - ビルド (github actions でコンテナイメージをビルド)
    - コンテナイメージを Artifact Registry へ push
    - Cloud Run へデプロイ
    - Artifact Registry からコンテナイメージを削除
HaruyaFujimoto commented 1 year ago

自分の GPC アカウントにてテストしながら作成中。
コンテナイメージを push するところでけっこう詰まっていたが、そこは今日解決した。(すごく嬉しい)
あとは Cloud Run のデプロイだけうまくいけばできそう。

github actions が難しいというより、GCP の Workload Identity 連携のところでなにかうまく行かない感じ。
Permissin 周りで、サービスアカウントの role の問題なのか Workload Identity の設定の仕方の問題なのか、問題の切り分けが難しい。
プロジェクトを立て直してまた試しながらやってみる。

HAYASHI-Masayuki commented 1 year ago

おつかれさまです! なかなかややこしいところのようですが、しっかり進めていただけているようで助かります! このまま行けちゃいそうな感じですが、どうしても厳しいことがあれば私(はあまり自信ないですが)もほかの方もサポートしていただけると思うので仰ってください。

HaruyaFujimoto commented 1 year ago

ちょっとタスクを持ちすぎてしまったのですが、こちらのタスクの状況を共有します。

自分の google アカウントでプロジェクトを新規作成し、以下のレポジトリで自動デプロイのテストをしながら進めていました。
https://github.com/HaruyaFujimoto/github-action-test

現状として、

という状態になっています。

wiki に github actions にて自動デプロイするまでの GCP 上で必要な操作と、
github actions をテストしながら書いていた際の進め方をまとめました。
自分でもまた試してみたいと思いますが、もし余裕があるようでしたらちらっと見てみてもらえると嬉しいです。

github actions で GCP の認証をする際に Workload Identity 連携を使うことにこだわって設定していたのですが、
別の認証でもよいと考えたらすぐに解決しそうだなぁという気もしつつ、 なんとかその方法でできたらいいなぁと思いつつ、
としていたら時間がだいぶ取られてしまいました。

一旦の進捗共有でした。

HAYASHI-Masayuki commented 1 year ago

進捗共有ありがとうございます! ドキュメントも書いていただけて、とても参考になります。 Workload Identity, 割とはまってる人多そうで、ちょっと大変そうですね。 私の方で試す余裕は正直しばらくなさそうなのですが、問題なければエラーメッセージなど共有いただければ、調査くらいはご協力できるかもしれません。 パーミッション回り……ということなので、たとえばこんなメッセージだったりしますかね?

Deployment failed with
ERROR: (gcloud.beta.run.deploy) PERMISSION_DENIED: Permission 'artifactregistry.repositories.get' denied on resource '//artifactregistry.googleapis.com/projects/api-project-222898232626/locations/us-central1/repositories/cloud-run-source-deploy' (or it may not exist).

https://github.com/google-github-actions/deploy-cloudrun/issues/370

HaruyaFujimoto commented 1 year ago

調べてみていただきありがとうございます!!! エラーメッセージについて共有させていただきます。

色々試した結果、行き着いたエラーメッセージが以下のものでした。

ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission

該当の step の全体のログとしてはこんな感じでした。

Run google-github-actions/deploy-cloudrun@v1
  with:
    service: ***
    image: ***:0af653f157308[2](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:2)94b[3](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:3)687c[4](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:4)7b01681a82424972f
    region: ***
    project_id: ***
    no_traffic: false
  env:
    WORKLOAD_IDENTITY_PROVIDER: ***
    SERVICE_ACCOUNT_EMAIL: ***
    IMAGE_URL: ***:0af6[5](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:5)3f157308294b3[6](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:6)8[7](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:7)c47b016[8](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:8)1a82424[9](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:9)72f
    SERVICE_NAME: ***
    REGION: ***
    PROJECT_ID: ***
    CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE: /home/runner/work/github-action-test/github-action-test/gha-creds-6c938f0bab7ea321.json
    GOOGLE_APPLICATION_CREDENTIALS: /home/runner/work/github-action-test/github-action-test/gha-creds-6c938f0bab7ea321.json
    GOOGLE_GHA_CREDS_PATH: /home/runner/work/github-action-test/github-action-test/gha-creds-6c938f0bab7ea321.json
    CLOUDSDK_CORE_PROJECT: ***
    CLOUDSDK_PROJECT: ***
    GCLOUD_PROJECT: ***
    GCP_PROJECT: ***
    GOOGLE_CLOUD_PROJECT: ***
/usr/bin/tar xz --warning=no-unknown-keyword --overwrite -C /home/runner/work/_temp/f028219a-49[10](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:10)-470c-b5a0-2d2e85cfae1f -f /home/runner/work/_temp/aad2e371-84c1-4298-8af2-a80b04e0f658
Successfully authenticated
Running: gcloud run deploy *** --quiet --image ***:0af653f[15](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:15)7308294b3687c47b0[16](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:16)81a82424972f --update-labels managed-by=github-actions,commit-sha=f[23](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:24)3f784edfb3727a053eccf32f99d1031ab26a8 --platform managed --format json --region *** --project ***
Error: google-github-actions/deploy-cloudrun failed with: failed to execute gcloud command `gcloud run deploy *** --quiet --image ***:0af653f157308294b3687c47b01681a8[24](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:25)24972f --update-labels managed-by=github-actions,commit-sha=f233f784edfb3727a053eccf32f99d1031ab[26](https://github.com/HaruyaFujimoto/github-action-test/actions/runs/4331530436/jobs/7563453745#step:4:27)a8 --platform managed --format json --region *** --project ***`: Deploying container to Cloud Run service [***] in project [***] region [***]
Deploying...
failed
Deployment failed
ERROR: (gcloud.run.deploy) PERMISSION_DENIED: The caller does not have permission

この過程では

ERROR: (gcloud.run.deploy) PERMISSION_DENIED: Permission 'iam.serviceaccounts.actAs' denied on service account 713018068059-compute@developer.gserviceaccount.com (or it may not exist).

のようなエラーがあり、その際には Workload Identity によって github actions に割り当てられるサービスアカウントが、
実行を行うアカウントに成りすますことに失敗したのかな?と思って、言われたロールを言われたアカウントに付与する対応をしました。

今困っているのはエラー内容が The caller does not have permission とあまり具体性がないというところで、
The caller とは何を示しているのか (どの IAM アカウント?他の要因?) はっきりわからないというところです。

全部の設定を見直すのも1度試してみたもののまだうまくいかず、またゼロから再挑戦した方がよさそうかもと思っていたところでした。
アカウント設定周りを再挑戦する際には、プロジェクトを新しく立て直して以下の手順を行っていました。 #setting-up-workload-identity-federation

これがなかなか大変なので、Workload Identity 連携にこだわりすぎない方がいいのかなと思い始めてきたところでした。

手順をトレースするのは時間も労力もなかなかかかってしまうので、軽く調べてみてもらえると嬉しいです。

HAYASHI-Masayuki commented 1 year ago

おつかれさまです。確かにこれだけだと、肝心のところがさっぱりわかりませんね……。 gcloud run deploy ...に失敗して、そのときのエラーがThe caller does not have permissionだった、以上のことがさっぱりです。ほかの方法で行けそうなら、そうした方がよさそうです。

The caller does not have permissionはGCP関係では割と一般的なエラーのようで、ググると解決策っぽいのもいろいろ出てきますが、どれも別々なので直接今回の件の参考にはならなそう。 https://www.google.com/search?q=%22The%20caller%20does%20not%20have%20permission%22

過程で出たエラーメッセージの方みたいに、具体的にどこにどの権限がない、みたいなことがわかればよかったんですが。

HaruyaFujimoto commented 1 year ago

ローカル環境から、サービスアカウントを使用しての gcloud run deploy を試してみたところ、
同様のエラー The caller does not have permission で失敗。
なのでデプロイにための使用しているサービスアカウント、Workload Identity 連携でなりすます先のアカウントにて
なにかしらの権限が足りていない様子。
Cloud Run のデプロイに必要な設定についてもう少し調べてみる。

HaruyaFujimoto commented 1 year ago

Cloud Run のデプロイに成功。
ローカルでサービスアカウントを試せたので https://cloud.google.com/run/docs/reference/iam/roles#additional-configuration ここにある権限について設定を見直したところ、無事にデプロイができた。
Artifact Registry からイメージを削除することも問題なく動作。
少しソースコードを調整したら github actions の設定ファイルは完了しそう。

HAYASHI-Masayuki commented 1 year ago

おつかれさまでした! デプロイに必要な権限が足りていなかったんですね。 引き続き調整の方もよろしくお願いします!

HaruyaFujimoto commented 1 year ago

github actions のワークフローを追加したブランチを作成。

残タスクリスト

HAYASHI-Masayuki commented 1 year ago

おつかれさまです! こうしてみると結構やることありますが、ここまで道筋が見えていれば、後一歩ですかね!? "軽量な Dockerfile" は個人的にはそこまでこだわらなくてもいいかな……とも思いますが、いい感じにできたら素敵ですね! 大したサポートはできないと思いますが、もし詰まるようなところあればいつでも相談してください。

HaruyaFujimoto commented 1 year ago

ありがとうございます!
コメント頂けるの助かります!
手順あるように見えますが、それぞれコンソールをちょっと触る〜だったり、cli のワンコマンドだったりするので、
そんなに時間かからずにできるかと思います!