見出し画像

ローコードでオリジナルのAPIを作る3つの方法まとめ

下記の2記事の続きです。
これまで、プログラミングを始めたい人が、開発環境を準備して、自分のWebサービスをインターネットに公開して、ChatGPTのAPIをつかってオリジナルのChatGPTクライアントを実装するところまでを解説してきました。

ここまでの技術があれば、既存のAPIを組み合わせて、アイデア次第でかなりいろいろなWebサービスを開発できると思います。
今回は、さらにもう一歩ステップアップして、オリジナルのAPIを開発する方法を紹介します。この技術を身につければ、拡張性とかセキュリティとかはともかく、思いついたアイデアはなんでも実装できるようになるはずです。

【初級】Zapierでつくる

Zapierとは

一番簡単なAPI開発手法として紹介したいのは、データ連携ツールのZapier(ザピアー)です。クラウドサービス間のデータ連携を自動化できるツールで、ノーコード界隈では有名なので、使っている方もいらっしゃるかもしれません。
例えば僕は「HubSpotの問い合わせフォームに入ってきた情報をSalesforceに転送する」という処理をZapierで作っています。

弊社の問い合わせフォームはHubSpotで作っていますが、問い合わせ内容はSalesforceに転送して処理しているのです。

さて、残念ながら有料プラン限定にはなってしまうのですが、実はZapierには、作ったフロー(Zap)をAPI化する機能があり、それがとても便利です。

ZapierでAPIをつくる

新しいZapをつくり、トリガーとして「Webhook」を選択してください。

残念ながらPremium限定…!

イベントは「Catch Hook」を選択して「Continue」。

「Trigger」を指定すると受け取るパラメーターを限定できるのですが、とりあえず無視して「Continue」。

すると、APIのURLが出てきます。このURLをたたくと、いま編集しているフローが動くということです。コピーしましょう。

ここでAPIに送り込みたいパラメータを定義します。例えば、コピーしたURLに、「?a=10&b=test」と付与してたたいてみました。すると、「このAPIにはa, bという2つのパラメーターを送るよ」という合図になります。値はサンプル値を適当に考えて設定します。

Zapierから応答が帰ってきますね。

その後、Zapierの画面に戻って「Test Trigger」を押すと、いま設定したパラメータがZapierで認識されています。

あとは、Zapierを使ったことがある方はなんとなくわかるはずです。このAPIがたたかれることをトリガーとして、いろんな処理を動かすことができます。
例えばこれは、「受け取った値をGoogleスプレッドシートに記録するAPI」です。

このように、ノーコードで簡単にAPIを自作できます。
Zapierの弱点は、条件分岐を作りにくいところです。ですから、複雑な処理を実装するというよりは、Reactで作ったシステムからスプレッドシートなどデータベースとなるツールにデータを送り込んだり、他のシステムを起動したりするAPIとして有効に使えます。


【中級】Google Apps Script(GAS)でつくる

GASとは

2つ目の方法は、Googleドライブの拡張機能として使えるGoogle Apps Script(GAS)です。特に、GoogleスプレッドシートをDBとして、そこにデータを書き込んだり、データを読み出したりするAPIを実装するのが便利です。

GASでAPIをつくる

新しいスプレッドシートを開いて、拡張機能>Apps Scriptを選びましょう。

これがGASの開発画面です。

API開発するためには、GET用とPOST用のテンプレートプログラムを持っておいて、これをコピペして使います。

//GETされたときに呼ばれる処理
function doGet(e) {
  //パラメータ「p」の値を取得
  var param = e.parameter.p;

  //スプレッドシートと連携する処理を書く

  //APIの応答を返却
  return ContentService.createTextOutput("{body:" + param + "}");
}
//POTされたときに呼ばれる処理
function doPost(e) {
  //パラメータ「p」の値を取得
  var param = e.parameter.p;

  //スプレッドシートと連携する処理を書く

  //APIの応答を返却
  return ContentService.createTextOutput("{body:" + param + "}");
}

「doGet」と「doPost」が違うだけですね。呼び出し側の要件に応じて使い分けます。

プログラムが書けたら、右上の「デプロイ」から「新しいデプロイ」を選択します。

  • 種類の選択:ウェブアプリ

  • 名前:適当につける

  • アクセスできるユーザー:全員

と指定してデプロイします。

デプロイが完了すると、APIのURLが出てきます。このURLをたたくと、doGetやdoPostが起動する、ということですね。

試してみましょう。出てきたURLの後ろに「?p=testmessage」を付与して叩きます。doGetのプログラムが動作していることがわかりますね。

【上級】AWS Lambdaでつくる

Lambdaとは

たいていの処理はGASでも実装できるのですが、処理が遅いとか、ログが出ないので運用が大変とか、細かい問題がいろいろあります。将来的に拡大していく計画があるAPIの場合は、もう少し運用しやすい形態で開発したいものです。

そこでおすすめなのが、AWSのローコードツール「Lambda(ラムダ)」です。PythonやJavaScriptで書いたプログラムをAPI化することができます。

LambdaでAPIをつくる

AWSにログインしたら、検索ウインドウから「Lambda」を検索します。
Lambdaの画面で、「関数の作成」ボタンを押しましょう。

関数の新規作成画面では、以下の部分を設定します。

  • 関数名:自由に名前をつけます

  • ランタイム:「Node.js 16.x」を選びます。
    ※最新は「18.x」なのですが、プログラムの文法が少し変わりました。しかし、公式ヘルプは16.x時代の文法で書かれていたりして難しいので、あえて旧バージョンを選択。

  • 実行ロール:「AWSポリシーテンプレートから新しいロールを作成」→ポリシーテンプレートとして「DynamoDB」を選択します。ロール名は自由に設定します。ここでLambda以外のサービスとの接続設定を行っています。

  • 関数URLを有効化:ONにします。自動的にAPIとしての呼び出しURLが発行されます。

  • 認証タイプ:とりあえずNONEに設定します。将来的に個人情報など重要な情報をあつかうときは、ちゃんと設定します。

  • オリジン間リソース共有(CORS)を設定:ONにします。これをONに設定しないと、Reactのプログラムから呼び出したときにエラーが発生します。

デフォルトで、「Hello from Lambda!」と返却するAPIのプログラムが書かれています。

設定>関数URLを開くと、このプログラムをAPIとして呼び出すURLが書かれています。

ブラウザで関数URLをたたくと、確かに「Hello from Lambda!」と返ってきます。

あとはプログラムを自由に書き換えるだけです。
パラメーターの受け取り方が重要ですね。

//GETパラメータを受け取る。event['queryStringParameters']['パラメータ名']
exports.handler = async (event) => {
  // TODO implement
  const response = {
    statusCode: 200,
    body: JSON.stringify('parameter is ' + event['queryStringParameters']['p']),
  };
  return response;
};
//POSTパラメータを受け取る。
exports.handler = async (event) => {
  //まずは要求のJSONを取り出す
  const eventbody = JSON.parse(event['body']);

  //JSONからパラメータの値を取り出す
  const response = {
    statusCode: 200,
    body: JSON.stringify('parameter is ' + eventbody['p']),
  };
  return response;
};


DyanamoDBとLambdaを接続する

AWSにはDBのサービスが複数ありますが最も使いやすいのはDynamoDBです。使いやすいポイントとしては、GUIで項目を追加したり削除したりできることです。AWSの他のDBは、SQLを書かないと操作できません。

DynamoDBは、かなり直感的に操作できます。
新しいデータを管理したい場合には、左メニューから「テーブル」>「テーブルの作成」ボタンを押します。

パーティションキーは必須項目です。「ID」など、データの1つ1つで、必ず一意になる項目を用意しなければなりません。

テーブルを作成したら、左メニュー「項目を探索」で値の追加・更新・削除ができます。最終的には全部Lambdaから登録することになるはずですが、テスト用のデータなどを手投入して、いろいろ検証するのに便利ですね。

DynamoDBのテーブルが準備できたら、あとはLabmdaからDynamoDBにアクセスする処理を書きます。

基本的なDB操作処理をテンプレートプログラムとして使いまわすのが良いでしょう。

//検索
function scanDynamo(params) {
    return new Promise((resolve) => {
        dynamo.scan(params, (err, data) => {
            if(err){
                console.log('dynamo_err:', err);
            } else {
                resolve(data);
            }
        });  
    });
}

//更新
function updateDynamo(params) {
    return new Promise((resolve) => {
        dynamo.update(params, (err, data) => {
            if(err){
                console.log('dynamo_err:', err);
            } else {
                resolve(data);
            }
        });  
    });
}

//追加
function putDynamo(params) {
    return new Promise((resolve) => {
        dynamo.put(params, (err, data) => {
            if(err){
                console.log('dynamo_err:', err);
            } else {
                resolve(data);
            }
        });  
    });
}

たとえば、こんな風に使います。

var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
  // TODO implement

  //1.検索条件の指定
  let getuserparams = {
      TableName : 'icp_users',               //検索するテーブル名
      FilterExpression: '#key1 = :user_id',  //検索する項目名
      ExpressionAttributeNames:{             //検索条件(key1=user_idと設定)
          '#key1':'user_id',
      },
      ExpressionAttributeValues: {           //「user_id」の値を指定
          ':user_id': event['queryStringParameters']['user_id'],
      }
  };

  //2.検索を実行
  let getuser = await scanDynamo(getuserparams);
  
  const response = {
    statusCode: 200,
    body: JSON.stringify(getuser),
  };
  return response;
};

function scanDynamo(params) {
    return new Promise((resolve) => {
        dynamo.scan(params, (err, data) => {
            if(err){
                console.log('dynamo_err:', err);
            } else {
                resolve(data);
            }
        });  
    });
}

これは、「icp_users」というDyanamoのテーブルから、「user_id = GETのパラメータで受け取ったuser_idの値」となるレコードを取得して返却するプログラムです。
これを書いて「Deploy」ボタンを押したら、関数URLにパラメータ「?user_id=~」をつけて叩きます。

このように応答が帰ってきました。

あとは1と2の部分を書き換えれば、いろいろなDB操作ができます。ここで難しいのが、1の部分ですね。一般的なSQLとはまったく違う文法で、かなりクセがあります。
公式ドキュメントに、検索、更新、追加それぞれの例が書かれているので、これを見ながら作ります。難しいですが、1回動かせばコツがつかめると思います。


まとめ

APIを自作できるようになると、開発の幅が大きく広がります。ローコードツールを駆使して、いろんなAPIを作ってみてください!


この記事が気に入ったらサポートをしてみませんか?