GCP Cloud SQL ユーザ認証に待望のGroup IAM AuthがGAしてた

# 対象者(読むと嬉しくなるかもしれない人)
- GCP Cloud SQLを使っているが、開発者は個別ユーザではなくアプリケーションユーザ、あるいは共通ユーザで接続している。
  (ログイン、操作した個人がログに記録されず、問題があった際に個人を特定できない等のセキュリティリスクが存在している)
- 個人ユーザを組み込みルユーザで登録していて運用が面倒だと感じている。
  (データベース毎に個別にパスワード管理するのは開発者側の負担にもなります)
- IAM authenticationを使用しているがグループアドレスではなく個人のアドレスを登録している

こんな感じでパスワード入力無しで接続できるようになります。
![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1313152/e95d7ba3-7713-3a09-64c3-891b13d8374b.gif)

# まえがき
こんにちは。先日GCP Cloud SQL PostgreSQL & MySQL に(個人的に)とてつもなく嬉しいアップデートが来ていました。それがこちら[IAM group authentication is now generally available (GA)](https://x.com/gcpweekly/status/1816904853622284620)です。

これまでCloud SQLを利用する際には個人のGoogleアカウントIAM認証を用いて認証することができていましたが、これにはチームや組織に新しいメンバーが参加するたびに対象のDBにユーザを追加する必要があるという運用上の面倒臭さがありました。今回のアップデートではGroup IAMでの認証機能が追加されたことで、グループアドレスにその方が追加されるだけで自動的にデータベースへのアクセス権限も割り振られるようになりました。


# 実装
非常に簡単でterraformも既に[対応](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/sql_user#:~:text=resource%20%22google_sql_user%22%20%22iam_group_user%22%20%7B%0A%20%20name%20%20%20%20%20%3D%20%22iam_group%40example.com%22%0A%20%20instance%20%3D%20google_sql_database_instance.main.name%0A%20%20type%20%20%20%20%20%3D%20%22CLOUD_IAM_GROUP%22%0A%7D) しています。
- google_sql_user
```
resource "google_sql_user" "iam_group_user" {
  name     = "iam_group@example.com"
  instance = google_sql_database_instance.main.name
  type     = "CLOUD_IAM_GROUP"
}
```

IAM Auth自体が初めての方は `cloudsql.iam_authentication` のflagもonにしておきましょう。
- google_sql_database_instance
```
resource "google_sql_database_instance" "main" {
  name             = "main-instance"
  database_version = "POSTGRES_15"
  region           = "us-central1"

  settings {
    tier = "db-f1-micro"
      database_flags = [
        { name = "cloudsql.iam_authentication", value = "on" }
      ]
    }
}
```
また、デフォルトではcloudsqlsuperuserの権限が付与されていますので、必要に応じてDB内で権限を絞る等の対応が必要です。

# 接続
パスワードの認証はGoogle IAM認証で行われるので認証時、ユーザはパスワードを意識する必要がありません。ただし、IAM認証を用いて接続する際には、以下のようなコマンドで認証をproxyさせる必要があり、InstanceNameやProjectIdを入力してあげる必要があり大変面倒です。
```
$ cloud-sql-proxy -instances=[project id]:[region]:[instance name]=tcp:5432 -enable_iam_login
$ psql "host=localhost dbname=postgres user=taro.yamada@example.com"
```

そこで、接続を簡単にする[ツール](https://github.com/s-okayama/cloudsql)を作りました。

インタラクティブにプロジェクトやインスタンス、データベースを選択してcloud-sql-proxyを実行してくれます。

```
# You can set sub-command "--port" like this. → $ cloudsql connect --port 12345
$ cloudsql connect
Use the arrow keys to navigate: ↓ ↑ → ← 
? Select Project: 
    project-prd
  ▸ project-dev
✔ project-dev

? Select Project:project-dev 
  ▸ project-dev:asia-northeast1:stg-hoge-db-fecdf019
    project-dev:asia-northeast1:stg-postgres-0e80e42e
    project-dev:asia-northeast1:stg-mysql-db-8347a466
    project-dev:asia-northeast1:stg-metabase-db-3413a639
 ✔ project-dev:asia-northeast1:stg-postgres-db-0e80e42e

? Select Database:
  ▸ postgres
    test-db 
Connecting Instance
2022/11/06 21:21:45 Cloudsql proxy process is running in background, process_id: 65464
Can connect using:
psql -h localhost -U yamada.taro@gmail.com -p 5432 -d postgres
```

# あとがき
[2年前に個人ユーザ認証について検討した記事を投稿](https://qiita.com/tp7hayct/items/6889927c62ba0735411b) してからIAM認証を導入してみて2年が経過しましたがとても便利だと感じています。データベース管理者側、開発者側ともに色々な手間から開放されますし、セキュリティも向上しますので是非試してみてください。

# IDEでの接続
2年前にはIDEはcloudsqlに対応していなかったのですが、記事を書いている途中で気になって調べてみると何やらIntellijで対応していそうな[ドキュメント](https://cloud.google.com/code/docs/intellij/connect-sql-database?hl=ja) を見つけました。
~~これから自分も試してみて、うまくいったら更新してみますね。~~
追記：試してみましたが、あくまで通信をProxyするだけで肝心のIAM認証は行ってくれないようですね。