LINE Messaging APIのWebhook設定 with Cloud Run

## はじめに
子連れ旅行中の車内で遊べる「なぞなぞLINEbot」を作りました。今回は、Croud Runを使ってLINEのWebhook設定にチャレンジしたので、忘れないうちにまとめとこうと思います。

## 前提条件
下記の使用技術を用いたアプリを作成するために必要なモジュールのインストールやGitHubのリポジトリ、Dockerfileの作成は完了している状態です。

### 1. 概要
このプロジェクトでは、LINE Messaging APIを使用してユーザーからのリクエストに応答し、OpenAIを利用して謎とヒントを生成するLINEボットを構築します。バックエンドはFastAPIで実装し、Google Cloud Runにデプロイします。

### 2. 使用技術・ツール
Python: バックエンドの開発に使用。
FastAPI: Webフレームワーク。
Dockerfile: アプリケーションをコンテナ化。
Google Cloud Run: アプリケーションのホスティング。
GitHub: ソースコード管理。
LINE Messaging API: ボットのメッセージ処理に使用。
OpenAI API: 謎とヒントを生成。

## 設定の手順
### 1. **GitHub Secretsの設定**:

GitHub Secretsは、環境変数の一種で、APIキーやパスワードなどの機密情報をGitHubリポジトリ内で安全に保管する方法です。これを利用してGoogle Cloudのサービスアカウント鍵やプロジェクトIDを設定します。

### 設定手順：

1. **GitHubリポジトリに移動**：
    - 対象のリポジトリにアクセスします。
2. **Secretsの追加**：
    1. **リポジトリの「Settings」タブに移動**。
    2. 左側のメニューから「Secrets and variables」→「Actions」を選択。
    ![スクリーンショット 2024-09-29 17.40.11（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/f99c440d-973e-19b2-20fb-82704d900f66.png)

    3. 「New repository secret」ボタンをクリックし、新しいシークレットを追加。
    ![スクリーンショット 2024-09-29 17.44.08（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/8f92c6bf-7ea8-3703-4452-ec79d6af20f5.png)

3. **`GCP_SA_KEY`の追加**：
    - サービスアカウントの秘密鍵ファイル（JSON）を開き、全内容をコピーします。
    - GitHub Secretsで`GCP_SA_KEY`という名前で新しいシークレットを作成し、その内容を貼り付けます。
　　[サービスアカウントの秘密鍵ファイル（JSON）の作成・確認方法](https://qiita.com/se1987/items/2b39780dafcf99d93584)

4. **`GCP_PROJECT_ID`の追加**：
    - Google Cloud ConsoleでプロジェクトIDを確認します。
    - 同じくGitHub Secretsで`GCP_PROJECT_ID`という名前で新しいシークレットを作成し、プロジェクトIDを入力します。
    ![スクリーンショット 2024-09-29 18.05.48（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/e8c1b140-c290-2fac-45ae-21f8c69e77aa.png)
    #### ※IAMの設定
    プロジェクトのIAM設定は以下の画像のロールが設定する必要があります。
    ![スクリーンショット 2024-09-14 20.11.41（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/a33ecd94-485f-7f01-15bf-22e743678052.png)


### 2. **Dockerイメージの準備**:

GitHub Actionsでは、DockerイメージをビルドしてGoogle Cloud Artifact Registryにプッシュする設定が含まれています。これにはリポジトリ名（`REPO_NAME`）の設定が重要です。

### Artifact Registryでリポジトリの作成 設定手順：

1. **適切なリポジトリ名の設定**：
    - Google Cloud Artifact Registryに、Dockerイメージを保存するリポジトリ（`REPO_NAME`）を作成します。画像では`REPO_NAME`=`buttler`で設定されています。
    ![スクリーンショット 2024-09-28 21.49.22（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/e4591376-1fca-4e29-3b7b-975584239e4e.png)
    - Google Cloud Consoleで「Artifact Registry」→「リポジトリの作成」をクリックし、`backend`,のイメージ用にリポジトリを作成します。
    ![スクリーンショット 2024-09-28 21.49.40（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/5fde395a-7d03-c928-0761-cb23d217bd64.png)
2. **GitHub Actions内のイメージタグ更新**：
    - `REPO_NAME`をそれぞれのリポジトリ名に置き換えます（例：`frontend`, `backend`, `firebase-functions`）。
    - イメージのフルパスは`us-central1-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME`になります。

### 3. **Cloud Runのサービス作成**:

Cloud Runでは、各アプリケーション（フロントエンド、バックエンド、Firebase Functions）が独立したサービスとしてデプロイされます。これらのサービス名は、GitHub Actionsで定義され、正確に指定する必要があります。LINEボットの場合は、バックエンドのデプロイのみでサービスの利用が可能です。

### 設定手順：

1. **Cloud Runにサービスを作成**：
    - Google Cloud Consoleにアクセスし、「Cloud Run」を選択。
    - 「サービスの作成」をクリックし、`backend-service`という名前で各サービスを作成します。
    ![スクリーンショット 2024-09-28 21.52.36（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/30a99fec-d53c-7d81-e4bb-fdb36914fc21.png)
    ![スクリーンショット 2024-09-28 21.52.49（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/d1a94f80-36b4-01ab-8fd5-ddfc2442906f.png)
     ![スクリーンショット 2024-09-28 21.53.15（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/4809f9dd-939e-cc3a-9d92-7006737984a3.png)
     ![スクリーンショット 2024-09-28 21.54.14（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/669f56d6-f589-be70-1850-16ffdc065711.png)
     ![スクリーンショット 2024-09-28 21.54.38（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/d446f102-7110-1889-1c45-3d3fcb4b8213.png)
     ![スクリーンショット 2024-09-28 21.55.19（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/b00c0141-f2bc-7aa4-3191-da1b19a7679d.png)

    - `us-central1`リージョンを選択し、下記の画像の通り設定します。
    ![スクリーンショット 2024-09-28 21.55.56（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/0d5399d3-3f14-628b-ed9e-f3c1c958449b.png)

    
2. **GitHub Actionsのサービス名と一致させる**：
    - `cloudbuild.yaml`ファイル内のサービス名（`backend-service`）がCloud Runで作成したサービス名と一致しているか確認します。
    ```
    name: Deploy to Cloud Run

    on:
      push:
        branches:
          - main # 本番環境用のブランチ
          - dev # 作業ブランチ
    
    jobs:
      deploy:
        runs-on: ubuntu-latest

    steps:
      - name: Check out the repository
        uses: actions/checkout@v2

      - name: Set up Google Cloud SDK
        uses: google-github-actions/setup-gcloud@v1
        with:
          version: "latest"
          service_account_key: ${{ secrets.GCP_SA_KEY }}
          project_id: ${{ secrets.GCP_PROJECT_ID }}

      # バックエンドのビルドとプッシュ
      - name: Build and Push Backend Image
        run: |
          docker build -t us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/REPO_NAME/backend ./backend
          docker push us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/REPO_NAME/backend

      # Cloud Runへのデプロイ - バックエンド
      - name: Deploy to Cloud Run - Backend
        uses: google-github-actions/deploy-cloudrun@v2.7.1
        with:
          service: backend-service
          region: us-central1
          image: us-central1-docker.pkg.dev/${{ secrets.GCP_PROJECT_ID }}/REPO_NAME/backend
    ```

    [なぞなぞbotリポジトリ](https://github.com/se1987/nazonazo_line_bot.git)

### 4. **Webhookの設定**:

- LINE デベロッパーコンソールにログインしてMessaging API設定のWebhook URLを設定します。
[Messaging APIコンソール](https://account.line.biz/login?redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F "Messaging APIコンソール")
[公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/getting-started/ "公式ドキュメント")
    ![スクリーンショット 2024-09-28 21.58.30（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/800c8422-4552-6100-09e1-ed838ffee168.png)
    ![スクリーンショット 2024-09-28 21.58.35（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535387/32020442-654c-9f95-c710-93cc662f6dbd.png)

最後までお読みいただきまして、ありがとうございます！
誤り等ありましたら、ご教示くださると幸いです。