ワークロードIDを使用したGoogleCloud Java SDK?
Oct 08 2020
GKEクラスター内からストレージAPIを使用して認証する方法を理解しようとしています。
コード:
Storage storage = StorageOptions.newBuilder()
.setCredentials(ServiceAccountCredentials.getApplicationDefault())
.setProjectId(gcpProjectId)
.build().getService();
getApplicationDefault() これらの手段を使用してAPIで認証することが文書化されています。
- {@codeGOOGLE_APPLICATION_CREDENTIALS}環境変数が指す認証情報ファイル
- Google Cloud SDK {@code gcloud auth application-defaultlogin}コマンドによって提供される認証情報
- Google AppEngineの組み込み認証情報
- Google CloudShellの組み込み認証情報
- Google ComputeEngineの組み込み認証情報
アプリケーションはGCPワークロードID機能を使用しているため、アプリケーション(クラスター内)サービスアカウントには次の注釈が付けられます。
serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]
これで、ストレージアカウントの呼び出しは、次のエラーで失敗します。
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object.",
"reason" : "forbidden"
} ],
"message" : "Primary: /namespaces/my-project.svc.id.goog with additional claims does not have storage.objects.create access to the Google Cloud Storage object."
}
これにより、ワークロードIDが正しく機能していないと思います。デフォルトのサービスアカウントではなく、注釈付きのサービスアカウントのエラーメッセージを受け取ることを期待しています。
他にやるべきことはありますか?
回答
MoritzSchmitzv.Hülst Oct 09 2020 at 15:47
注釈が間違っています。の代わりに:
serviceAccount.annotations.iam.gke.io/gcp-service-account: [email protected]
それは違いない
iam.gke.io/gcp-service-account: [email protected]
エラーメッセージは、アプリがワークロードIDを使用していることも示しています。
java.io.IOException: Unexpected Error code 403 trying to get security access token from Compute Engine metadata for the default service account: Unable to generate access token; IAM returned 403 Forbidden: The caller does not have permission
This error could be caused by a missing IAM policy binding on the target IAM service account.
For more information, refer to the Workload Identity documentation:
https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#creating_a_relationship_between_ksas_and_gsas