Cloud RunでSecret Managerを使いたい

# はじめに
Cloud Runにて必要な権限を有したサービスアカウントのクレデンシャル情報(JSONファイル)を使用したい。
しかし、Gitにプッシュすることで自動デプロイしているので、JSONファイルを使用しようとすると、必然的にGitにJSONファイルをプッシュすることになってしまう。これは非常によろしくない…。
Secret Managerを使用することで解決できるみたいだが、詳しいやり方は転がっていなかったので、クラウド初心者の方でもできるように備忘録として残すことにします。

# やりたいこと
Cloud RunではCloud StorageやTranscoder APIを操作する権限が必要なので、そのサービスアカウントを用意。
サービスアカウントをCloud Runに紐づけ。
そしてそのサービスアカウントを参照し、各サービスを利用できるようにします。もちろんJSONファイルなしで。

### 余談
JSONファイルを利用する場合、envファイルにJSONファイルへのパスを以下のような形で記載し配置しておいて、envファイルを読み込むよう設定すれば、勝手にクレデンシャル情報を読み込んでくれるようになります。（[参考](https://googleapis.dev/python/google-api-core/latest/auth.html)）
~~~env:.env
GOOGLE_APPLICATION_CREDENTIALS = "JSONファイルのファイルパス"
~~~

# 実際に設定してみる
## サービスアカウントの作成
![スクリーンショット 2023-02-21 171355.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/0c873947-51cc-4561-80f1-197a4eeba664.jpeg)
「**IAMと管理**」から「**サービスアカウント**」選択、画面上部の「**+サービスアカウントを作成**」を選択します。

![スクリーンショット 2023-02-21 172335.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/da2e97b2-1e45-0aeb-ca07-ec3c26d75c63.jpeg)
「**サービスアカウント名**」と「**サービスアカウントID**」を入力します。
「**サービスアカウント名**」を入力すれば自動的にプロジェクト内でIDが被らないよう「サービスアカウントID」が保管されます。
何の用途で使うかわかりやすい名前にしましょう。
「**サービスアカウントの説明**」は任意ですのでスキップ可能です。

「**作成して続行**」します。

![スクリーンショット 2023-02-21 183212.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/5721d181-063a-75d2-89b0-9845f66d397f.jpeg)
続いて**ロールの割り当て**です。
ここで追加する必要はありません。IAM一覧からも追加可能です。
必要最低限のロールを割り当てましょう。

:::note warn
ロールを割り当てる際は必ず、「**Secret Managerのシークレットアクセサー**」を割り当ててください。
:::

③はスキップして「**完了**」します。

③の「**ユーザーにこのサービスアカウントへのアクセスを許可**」は、作成したサービスアカウント自体を制御するアカウントを絞る設定ができます。


![スクリーンショット 2023-02-21 173725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/216961ed-e810-853a-7cb9-f478a8a77418.jpeg)

作成されたことを確認します。
そして、対象のアカウントを選択し、画面上部の「**キー**」を選択します。

![スクリーンショット 2023-02-21 174037.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/bd012607-729d-9c46-7222-4729f28a00c4.jpeg)
「**鍵を追加**」→「**新しい鍵を作成**」します。キーのタイプは「**JSON**」を選択してください。
そうすると自動でダウンロードされます。
十分取り扱いには気を付けましょう。

これでサービスアカウント側の設定は以上です。

## Secret Managerの設定
![スクリーンショット 2023-02-21 174637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/36b86e33-28e7-3284-cecd-069961ce4980.jpeg)
Secret Managerを有効にし、「**シークレットを作成**」します。

![スクリーンショット 2023-02-21 174926.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/63f4577c-a757-9c2c-60df-2c1754710461.jpeg)
**名前**はわかりやすいものを。
**シークレットの値**はファイルを参照もしくは直接入力します。
今回は先ほどダウンロードしたJSONファイルをインポートします。中身をコピペでも問題ないです。

「**シークレットを作成**」します。

![スクリーンショット 2023-02-21 183532.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/dd4467e5-6568-95cd-9b01-d5666ffd66b3.jpeg)
作成されたことを確認します。

これでSecret Manager側の設定は以上です。

## Cloud Runの設定
![スクリーンショット 2023-02-21 183733.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/4beebfd3-bcc7-3641-c9c9-5638175b710a.jpeg)
対象のCloud Runを選択し、画面上部の「**新しいリブジョンの編集とデプロイ**」を選択します。

下の方に行くと「**シークレットの参照**」とあるので、こちらを設定します。

![スクリーンショット 2023-02-21 190020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/d04601d2-e24a-9ec9-1e7f-22a291bb2dfe.jpeg)

**シークレット**は先ほど作成したものを選択。

:::note warn
ここで権限エラーが出た場合は「付与」すれば問題ないです。
:::
**参照の方法**は「ボリュームとしてマウント」。

**マウントパス**はお好きなように設定してください。
今回は私が記事に書いたデプロイ方法で行っていますので、ファイルパスもそれに則って決めました。

https://qiita.com/ide_chaaan/items/c820867bb56737d7ce58

こうすることで、JSONファイルを設定したファイルパスで読み込むことができるという優れものなのです。

:::note warn
マウントパスの設定は、指定したパスの配下には何もないようにしてください。
「マウント」とあるので、指定したパスの配下にソースコード等があったりすると、参照できなくなってしまいますので注意してください。
:::

そしてここで生成されたパスは控えておいてください。

![スクリーンショット 2023-02-21 185032.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032307/9eeef7a8-1a04-c5d8-f8d8-069d4cb10f80.jpeg)
最後に上に戻り、「**セキュリティ**」タブを選択。
「**サービスアカウント**」を、Cloud Run用に作成したものに変更し、「**デプロイ**」します。

これでCloud Run側の設定は以上です。

## ソースコード上の設定
余談で説明した通り、envにJSONのファイルパスを指定すれば、勝手に読み込まれるという機能を活かし、envファイルにファイルとしてマウントしたクレデンシャルのパスを記載します。

~~~env:.env
GOOGLE_APPLICATION_CREDENTIALS = "/app/conf/credential/cloudrun-dev-credential"
~~~

最後にデプロイして設定完了です！
これで必要なリソースにアクセスできるようになりました！

# 最後に
ここまで読んでいただきありがとうございます:bow:
AWSのIAMと違ってロールを割り当てるだけでなく、サービスアカウントを使う際はクレデンシャル情報を参照しなければなりません。
GitHubにクレデンシャル情報は置きたくないと思うので、ぜひこちらを参考にCloud Runのリソースへのアクセス制御を設定してもらえれば幸いです。
是非ご指摘等あればお待ちしております。