見出し画像

開発日記(2024/05/14)今度こそGCP(Google Cloud Platform)とLINEボットを繋いでみる。

さて、前回はCurlでAPIを叩くまでしかできなかったので、今回はGCPから実行できるように、つまりNode.jsで実行できるようしたいと思います。初めてなので、まずローカルで試してからGCPで実行というステップでいきたいと思います。何事もステップバイステップが大事ですよね。

下記の記事を参考に、まずはnode.jsの標準モジュールを用いてHTTPリクエストが通るか確認。

無事にレスポンスが返ってくる。

素晴らしい。この調子でLINEにリクエストを送りたい。

ということでGPT先輩に教えをこく。

素人感まるだしで恥をしのんでお聞きする。

授けていただいたコードがこちら。まずライブラリをインストール。

npm install axios

で、下記のjsファイルを作成する。

const axios = require('axios');

const token = 'ここにトークンが入ります';
const userId = 'ここにIDが入ります';

const data = {
  to: userId,
  messages: [
    {
      type: 'text',
      text: 'Hello, world1'
    },
    {
      type: 'text',
      text: 'Hello, world2'
    }
  ]
};

axios.post('<https://api.line.me/v2/bot/message/push>', data, {
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${token}`
  }
})
.then(response => {
  console.log('Success:', response.data);
})
.catch(error => {
  console.error('Error:', error.response ? error.response.data : error.message);
});

すごい・・・一発で通った・・・

せっかくだから何か面白いテストメッセージにすればよかった。

調子にのって頼りまくる。。。

崇めると精度が高まると聞きました。

教えに従ってさくっとGoogle Cloud SDKのセットアップを終える。

CLIで実行できるならそれに越したことはないですよね。

デプロイ用にpackage.jsonファイルを作成。

{
  "name": "line-bot-function",
  "version": "1.0.0",
  "dependencies": {
    "axios": "^0.21.1"
  }
}

続いてindex.jsファイルを作成。ポイントは”exports.sendLineMessage”で一連の処理を関数として宣言?してるとこですかね。

const axios = require('axios');

exports.sendLineMessage = (req, res) => {
  const token = 'ここにトークンが入ります';
  const userId = 'ここにIDが入ります';

  const data = {
    to: userId,
    messages: [
      {
        type: 'text',
        text: 'Hello, world1'
      },
      {
        type: 'text',
        text: 'Hello, world2'
      }
    ]
  };

  axios.post('<https://api.line.me/v2/bot/message/push>', data, {
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${token}`
    }
  })
  .then(response => {
    res.status(200).send('Success: ' + JSON.stringify(response.data));
  })
  .catch(error => {
    res.status(500).send('Error: ' + (error.response ? error.response.data : error.message));
  });
};

これでデプロイしたところ、エンドポイントにアクセスしたらメッセージ送信が成功。本日の目的(GCPとLINEボットを繋いでみる。)は達成。

正直、ローカルで実行する場合とGCP上のエンドポイントにアクセスしたときに実行されることの違いはよく分かっておらず・・・なぜ後者の場合は関数としてエクスポートする必要があるのかについてGPT先生に聞いたところ次の回答。

ローカル環境でコードを実行する場合と、Google Cloud Functions(GCF)上でエンドポイントにアクセスしたときにサーバー上で実行される場合の違いについて説明します。

ローカル環境での実行

ローカル環境でコードを実行する場合:

1. 直接実行:
  - コードを直接実行できます。Node.jsスクリプトをターミナルやコマンドプロンプトで実行します。
  - 例えば、`node script.js`というコマンドでスクリプトを実行します。

2. 一連の処理を順番に実行:
  - Node.jsプロセスが開始され、コードが順番に実行されます。
  - コードが完了すると、Node.jsプロセスは終了します。

GCF上での実行

GCF上でエンドポイントにアクセスしたとき:

1. 関数としての宣言:
  - GCFでは、関数としてエクスポートされるモジュールを作成する必要があります。これはHTTPリクエストやイベントによってトリガーされる関数です。
  - 例えば、`exports.functionName = (req, res) => { ... }`の形式で関数をエクスポートします。

2. イベント駆動:
  - GCFはイベント駆動型のアーキテクチャです。関数はHTTPリクエストやPub/Subイベント、Firebaseイベントなどによってトリガーされます。
  - トリガーされると、指定された関数が実行されます。関数がリクエストを処理し、レスポンスを返します。

関数として宣言する必要性

1. トリガーとレスポンス:
  - GCFでは、関数は特定のトリガーによって実行される必要があります。HTTPトリガーの場合、関数はHTTPリクエストを受け取り、HTTPレスポンスを返す必要があります。
  - ローカルでの実行と違って、GCF上では関数がリクエストを受け取り、レスポンスを返すという形式にすることで、クラウドサービスが関数の実行を管理しやすくなります。

2. スケーラビリティ:
  - GCFでは関数がトリガーされるたびにインスタンスが作成されるため、コードがスケーラブルになります。ローカル環境ではプロセスが1つしかないため、並行処理が困難です。

3. セキュリティと管理:
  - 関数として宣言することで、GCFは関数の実行環境を管理し、必要なリソースを自動的にスケールします。また、セキュリティやアクセス制御もGCFが管理するため、コードを安全に実行できます。

まとめ

- ローカル実行は、開発中のデバッグや小規模なタスクに適しています。スクリプトを直接実行し、ローカル環境のリソースを使用します。
- GCF実行は、イベント駆動型でスケーラブルなアーキテクチャに適しています。関数として宣言することで、HTTPリクエストなどのイベントに応じて関数が実行され、クラウド環境でのスケーリングやセキュリティ管理が行われます。

この違いを理解することで、ローカル環境での実行とGCF上での実行の目的や用途に応じて適切な方法を選択できます。

なるほどな〜かしこいな〜。要は、エンドポイントへのアクセスをトリガーとして関数を実行するにあたり、これが処理だよ!ということを明示的にしておくということなのかしら。(わかってない・・・)

肯定いただく。嬉しい。

次はいよいよ、ASCから受け取った値をセットしてLINEにメッセージを送るをやりたいと思います。(つづく)

ご覧いただきありがとうございます。とても嬉しいです。