Google Cloud Platform でアクティビティログを有効にするには

# アクティビティログとは？

* Google API が呼び出された場合のログ
* API の実行状況が記載されている
* Google サポートチームにサポートを依頼する際に提出するように求められることがある

https://cloud.google.com/identity-platform/docs/activity-logging?hl=ja

# アクティビティログを有効にするには？

上記の参考ページには下記のように記載されている。

![Screen Shot 2022-01-23 at 8.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126139/178cd1c1-5553-f654-297d-de667c5099bb.png)

これ以外の方法は案内されていないので、REST APIを使用する方法を行うしかなさそう。
REST API を実行するコマンドとしては curl が推奨されているようだ。
UI から設定する方法を期待していると、突然コマンド実行を要求されるので驚くが、一つずつ見ていこう。

## REST API とは？

https://www.talend.com/jp/resources/rest-api/

REST API（RESTful API）とは、汎用性の高いWebサービスアプリケーション同士の通信を支援するAPIの1つの種類です。REST APIは、シンプルかつ柔軟で、互換性に優れているため、さまざまな種類のデータの取り扱いや、最も著名なアプリケーションとのやり取りに最適というメリットがあります。

## curl とは？

https://e-words.jp/w/CURL.html

cURLとは、主にUNIX系OSでよく利用されるコマンドおよびプログラムの一つで、様々なプロトコル（通信手順）を用いてURLで示されるネットワーク上の場所との間でデータの送受信を行うもの。

## 結局どうすれば？

* WindowsのコンソールまたはMacのターミナルを立ち上げる
* アクティビティログのページで紹介されていた下記のコマンドを実行する

```
curl -d "{'monitoring':{'requestLogging':{'enabled':true}}}" \
  -H 'Authorization: Bearer auth-token' \
  -X PATCH -H 'Content-Type: application/json' \
  https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/config? 
 updateMask=monitoring.requestLogging.enabled.
```

...で有効になるはず。

しかし、上記のコマンド文字列には、下記の情報を調べて置き換える必要がある。

* auth-token
* project-id

それぞれ取得方法を見ていこう。

## auth-token の取得方法

* Google Cloud Platform にアクセスする
    * https://cloud.google.com/
* Cloud Shell を起動する
    * ![Screen Shot 2022-01-23 at 8.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126139/79c5b721-af9c-d558-de58-af1974e246c0.png)
* Cloud Shell にて、`gcloud auth print-access-token` を実行する
* 下記のダイアログが開いた場合は、承認を選択する
    * <img width="320px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126139/e7e1b4d5-6918-0d14-6bf6-f9d1c54b6c1f.png">
* コマンド実行結果として返された文字列が auth-token である
* auth-token をコピーして、前述のコマンド文字列の `auth-token` の文字列と置き換える

## project-id の取得方法

* Google Cloud Platform にアクセスする
* ダッシュボードを選択する
* 下記のプロジェクト情報にプロジェクトIDが表示されている
    * <img width="320px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126139/ca218029-5191-0d52-69b2-36b9e94c9ced.png">
* プロジェクトIDの値をコピーして、前述のコマンド文字列の `project-id` の文字列と置き換える

## コマンドを実行してみる

ここまでの流れで、下記のコマンドに auth-token と project-id の情報が挿入されたはず。

```
curl -d "{'monitoring':{'requestLogging':{'enabled':true}}}" \
  -H 'Authorization: Bearer auth-token' \
  -X PATCH -H 'Content-Type: application/json' \
  https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/config? 
 updateMask=monitoring.requestLogging.enabled
```

コンソールを開いて、コマンドを実行する。

```
curl -d "{'monitoring':{'requestLogging':{'enabled':true}}}" -H 'Authorization: Bearer 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -X PATCH -H 'Content-Type: application/json' 
'https://identitytoolkit.googleapis.com/admin/v2/projects/sample-project/config?
updateMask=monitoring.requestLogging.enabled'


{
  "error": {
    "code": 403,
    "message": "Your application has authenticated using end user credentials from the Google 
Cloud SDK or Google Cloud Shell which are not supported by the identitytoolkit.googleapis.com. We 
recommend configuring the billing/quota_project setting in gcloud or using a service account 
through the auth/impersonate_service_account setting. For more information about service accounts 
and how to use them in your application, see https://cloud.google.com/docs/authentication/. If you 
are getting this error with curl or similar tools, you may need to specify 'X-Goog-User-Project' 
HTTP header for quota and billing purposes. For more information regarding 'X-Goog-User-Project' 
header, please check https://cloud.google.com/apis/docs/system-parameters.",

    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "SERVICE_DISABLED",
        "domain": "googleapis.com",
        "metadata": {
          "service": "identitytoolkit.googleapis.com",
          "consumer": "projects/xxxxxxxxxxxxx"
        }
      }
    ]
  }
}
```

403 エラーが返される。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/403

```
403 Forbidden

HTTP の 403 Forbidden クライアントエラーレスポンスコードは、サーバーがリクエストを理解したものの、認証が拒否された
ことを示します。

このステータスは 401 に似ていますが、この場合は再認証しても結果は変わりません。アクセスは恒久的に禁止されており、リソ
ースにアクセスする権限が不足しているなど、アプリケーションのロジックに結びついたものです。
```

どうやら、クライアント側（コマンド実行側）の問題でアクセスを拒否したということらしい。
レスポンスデータを見ると、`message` にエラー情報が記載されているので、読んでみる。

```
Your application has authenticated using end user credentials from the Google Cloud SDK or Google 
Cloud Shell which are not supported by the identitytoolkit.googleapis.com. We recommend 
configuring the billing/quota_project setting in gcloud or using a service account through the 
auth/impersonate_service_account setting. For more information about service accounts and how to 
use them in your application, see https://cloud.google.com/docs/authentication/. If you are 
getting this error with curl or similar tools, you may need to specify 'X-Goog-User-Project' HTTP 
header for quota and billing purposes. For more information regarding 'X-Goog-User-Project' 
header, please check https://cloud.google.com/apis/docs/system-parameters.
```

機械翻訳をすると、

```
アプリケーションはGoogle Cloud SDKまたはGoogle Cloud Shellのエンドユーザー認証情報を使用して認証されています
が、これらはidentitytoolkit.googleapis.comではサポートされていません。gcloud の billing/quota_project 設定
を構成するか、auth/impersonate_service_account 設定でサービス アカウントを使用することをお勧めします。サービス
アカウントについての詳細と、アプリケーションでの使用方法については、https://cloud.google.com/docs/authentication/ を参照してください。
curl などでこのエラーが発生する場合、クォータと課金のために 'X-Goog-User-Project' HTTP ヘッダを指定する必要があ
る場合があります。X-Goog-User-Project'
ヘッダに関する詳細は、https://cloud.google.com/apis/docs/system-parameters を参照してください。
```

X-Goog-User-Project ヘッダを指定する必要がありそうだ。
しかし、値に何を設定すべきか分からない。
色々、検索していくと、下記に情報を投稿してくださった方がいた。

https://qiita.com/nii_yan/items/3bcd2940e15486b4c6e2

```
billingの設定が通ってないのか、ヘッダーに X-Goog-User-Project: my-project を入れることで解決
```

my-project とは？と思ったが、project-id の値を入れれば良さそう。
curl コマンドに下記を追加。

```
-H "X-Goog-User-Project: <project ID>"
```

curl コマンドを実行。
どうやら、成功したっぽい。

```
xxxxxxxxxxxxx@xxxxxxxxxxxxx ~ % curl -d "{'monitoring':{'requestLogging':{'enabled':true}}}" -H 
"X-Goog-User-Project: sample-project-id" -H 'Authorization: Bearer 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -X PATCH -H 'Content-Type: application/json' 'https://identitytoolkit.googleapis.com/admin/v2/projects/sample-project-id/config?updateMask=monitoring.requestLogging.enabled'
{
  "name": "projects/xxxxxxxxxxxxx/config",
  "signIn": {
    "phoneNumber": {
      "enabled": true
    },
    "hashConfig": {
      "algorithm": "SCRYPT",
      "signerKey": "xxxxxxxxxxxxx",
      "saltSeparator": "Bw==",
      "rounds": 8,
      "memoryCost": 14
    }
  },
  "notification": {
    "sendEmail": {
      "method": "DEFAULT",
      "callbackUri": "https://xxxxxxxxxxxxx.firebaseapp.com/__/auth/action",
      "dnsInfo": {
        "customDomainState": "NOT_STARTED",
        "domainVerificationRequestTime": "1970-01-01T00:00:00Z"
      }
    },
    "sendSms": {
      "smsTemplate": {
        "content": "%LOGIN_CODE% is your verification code for %APP_NAME%."
      }
    },
    "defaultLocale": "en"
  },
  "quota": {},
  "monitoring": {
    "requestLogging": {
      "enabled": true
    }
  },
  "multiTenant": {},
  "authorizedDomains": [
    "localhost",
    "xxxxxxxxxxxxx.firebaseapp.com",
    "xxxxxxxxxxxxx.web.app"
  ],
  "subtype": "FIREBASE_AUTH",
  "client": {
    "apiKey": "xxxxxxxxxxxxx",
    "permissions": {},
    "firebaseSubdomain": "xxxxxxxxxxxxx"
  },
  "mfa": {
    "state": "DISABLED"
  },
  "blockingFunctions": {}
}
```

* 上記のレスポンスのJSONデータの下記の部分がアクティビティログの有効状態を表しているらしい。

```
  "monitoring": {
    "requestLogging": {
      "enabled": true
    }
  },
```

* 課金の問題もあるので、アクティビティログの取得が不要になったら、コマンドの下記の部分を `'enabled':false` にして、コマンドを実行しておくこと。

```
curl -d "{'monitoring':{'requestLogging':{'enabled':false}}}" ...
```

そうすると、先ほどのJSONデータの部分が下記のようになるので、アクティビティログは無効になったと判断できる。

```
  "monitoring": {
    "requestLogging": {},
```

# まとめ

* アクティビティログを取得するための情報として、まず auth-token と project-id が必要
* auth-token は Google Cloud Platform で Cloud Shell を開き、下記のコマンドを実行すると取得できる
    * `gcloud auth print-access-token`
* project-id は Google Cloud Platform のダッシュボードから参照できる
* PC のコンソールを開き、下記のコマンドにそれぞれ情報を埋め込んだものを実行すると、アクティビティログが有効に設定される
    * `<auth-token>`、`<project-id>`（project-id は2ヶ所）をそれぞれ置き換えること

```
curl -d "{'monitoring':{'requestLogging':{'enabled':true}}}" \
  -H 'Authorization: Bearer <auth-token>' \
  -H 'X-Goog-User-Project: <project-id>'
  -X PATCH -H 'Content-Type: application/json' \
  https://identitytoolkit.googleapis.com/admin/v2/projects/<project-id>/config?updateMask=monitoring.requestLogging.enabled
```