今回は特殊な要件で作業していたので、珍しいエラーを引きました。0から構築した場合は発生しないのでケースは多くないと思いますがメモとして残しておきます。
概要
GAEとDatastoreを利用したGoのサンプルプログラムがありました。これをバージョンアップ・修正しデプロイしようとしたところ、表題のエラーになりました。
$ gcloud app deploy --project {プロジェクトID} --version {バージョン} .
...
(デプロイは成功する)
デプロイしたプログラムの動作確認のためにブラウザからアクセスすると、下記のエラーメッセージが表示されます。
rpc error: code = PermissionDenied desc = Missing or insufficient permissions.
権限不足というエラーメッセージと、下記のstackoverflowのポストを見て、なにかしらの権限が不足しているのではないかと思い調べましたが、違うところに原因がありました。
https://stackoverflow.com/questions/61651865/getting-error-message-rpc-error-code-permissiondenied-desc-missing-or-ins
原因と対処法
サンプルプログラムの中にGCPのプロジェクトIDがハードコードされており、別のプロジェクトにデプロイしようとしたところエラーが発生していたことがわかりました。ハードコードされた部分を修正し、今回のデプロイ対象のプロジェクトIDを指定することでエラーが解消されました。
また、デプロイ対象と異なるプロジェクトIDをプログラム内で指定すると、同じエラーがGoogle CloudFunctionsでも発生しました。
プログラムの中にプロジェクトIDをハードコードしていると、今回のような場合に気づくのが難しいため、環境変数からプロジェクトIDを読みこむようにプログラムを修正するのが望ましいです。GAEの場合、 GOOGLE_CLOUD_PROJECT
という環境変数に実行環境のGCP プロジェクトIDが入るので、プログラム内でプロジェクトIDを直接指定するのではなく、os.Getenv("GOOGLE_CLOUD_PROJECT")のような形でプロジェクトIDを読むようにします。
https://cloud.google.com/appengine/docs/standard/go/runtime#environment_variables