こんにちは、ふくちです。
タイトルの通り、良くわからんので調べてみます。
サービスアカウント≒AWSのIAMサービスロール
結論、普段AWSを使っている身からすると、多分こんな感じの認識でOKです。図にするとこんな感じ。

…なんかCloud RunとIAMロールの間に挟まってるやつがいますね。こいつがサービスアカウントです。公式ドキュメントの説明によると↓こうです。
サービス アカウントは、ユーザーではなく、アプリケーションや Compute Engine インスタンスなどのコンピューティング ワークロードで通常使用される特別なアカウントです。
アプリケーションをサービス アカウントとして認証する最も一般的な方法は、アプリケーションを実行しているリソースにサービス アカウントを関連付けることです。たとえば、サービス アカウントを Compute Engine インスタンスに関連付けると、そのインスタンスで実行されているアプリケーションがサービス アカウントとして認証されるようにできます。その後、サービス アカウントに IAM ロールを付与すると、サービス アカウントは(さらにはインスタンス上の)アプリケーションが Google Cloud リソースにアクセスできるようになります。
ここの説明でサービスアカウントに加えてIAMロールというのも出てきます。サービスアカウントがAWSのIAMロール相当じゃないんかい。わけがわからんのでもう少し調べてみます。
調べてみると、サービスアカウントはプリンシパルでありリソースでもあるという記述が出てきます。
サービス アカウントはプリンシパルです。これにより、サービス アカウントに Google Cloud リソースへのアクセス権を付与できます。
ただし、サービス アカウントはリソースでもあります。つまり、サービス アカウントにアクセスする権限を他のプリンシパルに付与できます。
まぁ1つずつ整理しましょう。
プリンシパル
まずプリンシパルは実行の主体です。AWSでもあった気がしてきますね。つまりその権限をもらって何かをする側。
例えばCloud RunからCloud Storageバケット内のオブジェクトの閲覧を許可する場合は、Cloud Runに紐づけたサービスアカウントに対してオブジェクト閲覧者のロール(roles/storage.objectViewer)を付与するような形。
なるほどつまり、AWSではリソースに直接IAMロール付与していますが、Google Cloudではサービスアカウントを挟まないといけないんですね。
で、どうやらIAMロールもAWSのIAMロールとは異なるらしいです。
Google CloudにおいてはIAMロールが既に権限を束ねているようで、どちらかというとAWSのマネージドポリシーに近そうです。
例えばこのCloud Run編集者というロールを確認してみます。

こんな感じで、ロールには直接権限が束ねられて設定されているようです。
なので、サービスアカウントが実質AWSのIAMロールであり、Google CloudのIAMロールは実質AWSのIAMポリシーという関係性のようです。
リソース
そしてリソースはプリンシパルから何かしらアクセスされる側のもの。先程の例で言えばCloud Storage側。プリンシパル(Cloud Run)に紐づくサービスアカウントにおいて、リソース(Cloud Storage)を、ターゲットに指定できるということ。
これと同じことがサービスアカウントでも起こります。つまり、このサービスアカウントを誰が使ってよいか、ということも定義できるということ。
roles/iam.serviceAccountUserを使えば、そのサービスアカウントをCloud Runなどに紐づけることができるようになります。
また、roles/iam.serviceAccountTokenCreatorを使えば、一時的にそのサービスアカウントの権限を借りることができるようになります。
まぁAWSでもIAMロールを別のリソースに紐づけたり、Assume Roleできたりしますもんね。それと同じイメージでしょうか。
サービスアカウントをコンソールで触ってみるぜ
Cloud Runだとこんな感じでサービスアカウントを設定できるらしいです。形式は<サービスアカウントID>@<プロジェクト情報>.iam.gserviceaccount.comみたいな形になるっぽいです。
で、このサービスアカウントに付与できるロールを指定します。自作したロール・マネージドロールどちらも設定できます。これがプリンシパルとして使う際の設定です。

もしくは、サービスアカウントユーザーロールとサービスアカウント管理者ロールというのを設定できます。これがリソースとして使う際の設定です。

厳密にはユーザーロールのところで、このサービスアカウントを誰に渡すか、を設定しています。これで指定されたユーザーが、このサービスアカウントをCloud Runなどに紐づけて良い、とされるようです。
また、管理者ロールのところで、このサービスアカウント自体を編集・無効化など管理して良いのは誰か、を設定しています。
まとめ
Google Cloudっていちいち書くのめんどいのでGCPに戻してほしい。




