見出し画像

[生成AI] 星占いAPIを自作する (後編)星占いAPIサーバーを構築する

割引あり

星占いAPIを自作する(後編)を始めます。まず初めに、前回記事(前編)を復習し、今回記事(後編)の概要を展望します。

前編の振り返りと後編の展望

(前編)星占いAPIデータ作成

前編の記事「星占いAPIデータを自動作成する」では、生成AIを活用して「星占いAPIデータ」を作成しました。全体運(1-5の数字)に対して、今日の運勢のテキストを自動作成する方法を詳しく説明しました。

4つの生成AIモデル「gpt-3.5-turbo」「gpt-4-turbo」「claude-3-opus-20240229」「gemini-pro」の出力結果を評価し、文字制限(200-220文字)の再現の高い「gpt-3.5-turbo」モデルを採用することにしました。

従来、このようなテキストデータを手作業で用意するのは大変な手間がかかります。しかし、生成AIを使えば、高品質なデータを短時間で安価に作成できます。APIで返却するデータを自動生成できるため、APIの開発に集中できるのは大きなメリットです。また、生成AIへのプロンプトを工夫することで、ユーザーニーズやサービスの方向性に合わせて、データの質をコントロールできる点も重要な利点の一つです。

(後編)星占いAPIの実装

後編となる本記事「星占いAPIサーバーを構築する」では、これらのデータを使ってAWS(Amazon Web Services)上に星占いAPIを構築していきます。クラウドサービスを活用することで、サーバーの調達や運用にかかる手間を大幅に削減できます。

AWSには、APIの開発に適した多くのサービスが用意されています。その中でも、サーバーレスに実行できるAWS LambdaとNoSQLデータベースのDynamoDBは、APIのバックエンドを手軽に構築できる強力な組み合わせです。さらに、API Gatewayを使えば、認証機能やCORS(Cross-Origin Resource Sharing)の設定など、APIに必要な機能を簡単に追加できます。

本記事では、以下の方法について解説します。

  • AWS LambdaとDynamoDBを使ってAPIのバックエンドを実装する方法

  • API GatewayでAPIの認証とCORS対応を行う方法

  •  ローカルの簡易アプリから実際にAPIを呼び出す方法

クラウドサービスとサーバーレスアーキテクチャを使ったモダンなAPI開発を体験できます。AWSを使ったサーバーレスなAPIの実装パターンが身につきます。小規模なウェブサービスの開発や、社内ツールの作成など、様々な場面で応用できる知識が得られるはずです。

記事概要

本記事では、AWS上に星占いAPIを構築する手順を5つのパートに分けて、詳しく説明します。次の図は、ユーザー、ウェブアプリ、API Gateway、Lambda、DynamoDBを構成要素として、それらの間のインタラクションを時系列に沿って表示したシーケンス図です。

図1 星占いAPIのシーケンス図

まず、第1部ではAPIの設計について確認します。リクエストとレスポンスのフォーマット、エンドポイントのURL、認証方式、エラーハンドリング、ドキュメントの整備など、APIを設計する上で重要な要素を確認します。

次に、第2部ではAWS Lambdaを使ってAPIのバックエンドを実装します。Lambda関数を作成し、Node.jsで星占いAPIのロジックを実装します。Lambda関数をzipファイルにまとめ、マネジメントコンソールからアップロードします。最後に、様々なケースでDynamoDBとの連携を確認するテストを行います。

第3部では、DynamoDBを使ってデータベースを構築します。テーブルを作成し、Node.jsでデータのインポートとクエリを実装します。Lambda関数とDynamoDBを連携させ、APIがデータベースから星占いの結果を取得できるようにします。Lambda関数の修正内容をzipファイルにまとめ、再度アップロードします。認証エラー、データインポート、星占い結果の返却など、DynamoDBとの連携を確認するテストを行います。

第4部では、API Gatewayを使ってAPIを公開します。API Gatewayを作成し、API Keyによる認証を設定します。また、CROSエラーを防ぐための設定を行います。最後に、コマンドラインから「curl」コマンドを使って、API Gatewayを経由してAPIにアクセスできることを確認します。

第5部では、星占いAPIを使った簡易的なウェブアプリを作成します。HTMLとJavaScriptでアプリを実装し、フロントエンドのみで完結しています。ステータスコードを確認し、エラーの場合はアラートでユーザーに通知します。データが正常に取得できたら、今日の運勢などを表示します。

最後の第6部では、API公開後の運用について解説します。API開発は公開がゴールではなく、安定稼働、セキュリティ、パフォーマンス維持、ユーザーサポートなど、継続的な運用が必要です。さらに、バージョンアップや機能拡張など、将来を見据えた検討も重要となります。

付録として、星占いAPIのドキュメントを添付しています。APIドキュメントは、API利用者(アプリ開発者)が必要な情報を過不足なくまとめた文書です。英語版と日本語版の例を示します。

免責事項

本記事で提供するプログラムコードや手順は、あくまで参考例です。開発環境やAWSのバージョンの違いにより、記事通りに動作しない可能性があります。特に、AWSのサービスは頻繁にアップデートされるため、UIの変更や設定方法の変更などにより、記事の内容と異なる部分が出てくる可能性があります。本記事は、2023年5月時点の情報に基づいて作成されています。

また、本記事で提供するプログラムを実行した結果、発生した損害や問題について、著者は一切の責任を負いません。AWSの利用料金などは、読者ご自身の責任で管理してください。特に、DynamoDBやAWS Lambdaは、使用量に応じて課金されるサービスです。APIの呼び出し回数やデータ転送量によっては、高額な料金が発生する可能性がありますので、ご注意ください。

本記事で作成するAPIは、あくまでサンプルコードです。実際のサービスで使用する場合は、セキュリティ面や性能面でさらなる改善が必要です。特に、APIキーによる認証は、本格的なサービスで使用するには十分ではありません。必要に応じて、より強固な認証方式を検討してください。

AWSのアカウントやアクセスキーの管理は、読者ご自身の責任で行ってください。アクセスキーを紛失したり、第三者に漏洩したりすることがないよう、十分にご注意ください。

以上の点を予めご了承の上、本記事をご活用ください。本記事が、読者の皆様のAPI開発の一助となれば幸いです。


第1部 API設計の確認

第1部では、前編で設計した星占いAPIの仕様を確認します。APIを実装する前に、設計の要点を再度チェックすることで、APIの品質を確保します。確認する仕様は以下の通りです。

リクエストとレスポンスの設計

リクエストは、以下の形式でURLクエリパラメータを送信します。URLクエリパラメータは、「https://api.example.com/api-path/」のドメインの後に「?」記号で追加の情報を付加することができます。

?user_id=123&zodiac_sign_id=1&event_date=2024-05-01

このリクエストは、ユーザーID(123)の、zodiac_sign_id=1(牡牛座)の2024-05-01の日付の占い結果を要求しています。

  • user_id:ユーザーID

  • zodiac_sign_id:星座ID(1から12の整数)

  • event_date:占う日付(YYYY-MM-DD形式)

レスポンスは、以下のJSON形式で返却します。返却されたデータを解析することで、星占いの結果を取得することができます。

{
  "statusCode": 200, 
  "body": "[{\"work_luck\":1,\"general_luck\":1,\"todays_fortune\":\"今日の運勢は〇〇です。\",\"event_date\":\"2024-05-01\",\"financial_luck\":2,\"love_luck\":2,\"id\":1,\"zodiac_sign_id\":\"1\"}]" 
}

エンドポイントの設計

APIのエンドポイントは、「https://api.example.com/default/horoscope」とします。HTTPのGETメソッドでリクエストを送信し、必要なパラメータが含まれていない場合はエラーメッセージを返却します。

認証と認可の設計

APIキーによる認証とユーザーIDによる認可を採用します。利用者はAPIキーをリクエストヘッダーに含め、自分のユーザーIDをリクエストパラメータに含めます。APIサーバーは、APIキーとユーザーIDを検証し、権限を確認します。 以下は、APIキーとユーザーIDを使用した認証と認可の例です。

GET https://api.example.com/default/horoscope \ 
?user_id=123&zodiac_sign_id=1&event_date=2024-05-01 \ 
Headers: X-API-Key: abcdefghijklmnopqrstuvwxyz
  • X-API-Key:APIキー(リクエストヘッダーに含める)

  • user_id:ユーザーID(リクエストパラメータに含める)

エラーハンドリングとステータスコード

星占いAPIは、適切なステータスコードとエラーメッセージを返却します。

正常応答(200 OK)

{
  "statusCode": 200,
  "body": "[{\"work_luck\":1,\"general_luck\":1,\"todays_fortune\":\"今日の運勢は〇〇です。\",\"event_date\":\"2024-05-01\",\"financial_luck\":2,\"love_luck\":2,\"id\":1,\"zodiac_sign_id\":\"1\"}]" 
}

不正なリクエスト(400 Bad Request)

{
  "statusCode": 400,
  "error": "Invalid request",
  "message": "Missing required parameter: user_id"
}

認証エラー(401 Unauthorized)

{
  "statusCode": 401,
  "error": "Authentication failed",
  "message": "Invalid API Key"
}

権限エラー(403 Forbidden)

{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "User with ID xxxx does not have permission to access this resource."
}

リソースが見つからない(404 Not Found)

{
  "statusCode": 404,
  "error": "Resource not found",
  "message": "No horoscope data found for the specified date"
}

サーバーエラー(500 Internal Server Error)

{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "An unexpected error occurred"
}

ドキュメンテーションの整備

APIの概要、エンドポイントの説明、リクエストパラメータの説明、レスポンスの説明、リクエスト/レスポンスの例、認証方法の説明、エラーコードの説明、SDKとサンプルコードの提供など、APIの利用者が必要とする情報を提供します。

以上が、星占いAPIの設計の要点です。次のセクションでは、この設計に基づいて、APIの実装を進めていきます。

第2部 AWS Lambda

AWS Lambdaは、サーバーレスコンピューティングサービスであり、APIのバックエンドを実装するのに最適なプラットフォームです。Lambdaを使用することで、サーバーの管理やスケーリングに煩わされることなく、APIのロジックに専念できます。

Lambdaには以下のようなメリットがあります。

  1. サーバーレス:サーバーの管理やプロビジョニングを気にする必要がありません。Lambdaが自動的にスケーリングを処理します。

  2. イベント駆動:APIゲートウェイからのリクエストをトリガーとして、Lambdaを実行できます。リクエストがない時はリソースを消費しません。

  3. 柔軟なプログラミング言語:JavaScript(Node.js)、Python、Java、Go、C#など、多くのプログラミング言語をサポートしています。

  4. コスト効率:実際に使用した分だけ課金されるため、コスト効率に優れています。APIの利用頻度が低い場合に特に効果的です。

  5. 自動スケーリング:リクエストの量に応じて自動的にスケールアップ/ダウンするため、トラフィックの変動に柔軟に対応できます。

  6. セキュリティ:IAMロールを使用して、Lambda関数にきめ細かいアクセス権限を設定できます。

これらのメリットにより、AWS Lambdaは星占いAPIのバックエンドを実装するのに最適なサービスと言えます。次のセクションでは、実際にLambda関数を作成し、APIのロジックを実装していきます。

Lambdaのセットアップ

AWS Lambdaで星占いAPIを実装するために、まずAWSアカウントを作成します。アカウント作成手順は次の通りです。

  1. AWS公式サイト(https://aws.amazon.com/)にアクセスし、「アカウントを作成」ボタンをクリックします。

  2. 必要な情報(メールアドレス、パスワード、アカウント名)を入力し、アカウントを作成します。

  3. クレジットカード情報を登録します。無料利用枠の範囲内では料金は発生しませんが、アカウント作成時には登録が必要です。

  4. 電話番号を入力し、アカウントの確認を完了します。

アカウントを作成したら、次は、Lambdaをセットアップします。作成したアカウントで、AWSコンソールにログインします。検索フィールドに「lambda」と入力し、検索結果の「Lambda」のリンクを選択します。すると、「Lambda > 関数」の画面が表示されます。

図2 「Lambda > 関数」の画面

図2の画面が表示されたら、右上の「関数を作成」ボタンを選びます。

図3 関数の作成画面

関数の作成画面が開いたら、「一から作成」を選択します。関数名として「horoscope」と入力して、右下の「関数の作成」ボタンをクリックします。これで、Lambdaのセットアップは完了です。次は、Node.jsで星占いAPIのロジックを実装します。

星占いAPIロジックの実装は、ローカル開発環境でNode.jsプロジェクトを作成し、そのプロジェクトをAWSコンソールにアップロードする方法で行います。プロジェクト作成手順は次の通りです。

プロジェクトのセットアップ

1. お使いの開発環境に合わせたNode.jsインストーラーを公式サイトからダウンロードします。インストーラーを実行して、Node.jsを使えるようにします。Node.jsのバージョンはv20を推奨します。コマンドラインで、Node.jsがインストールされているか確認します。

% node -v
v20.12.2

2. 次に、プロジェクトを保存するディレクトリを作成します。本記事では、ユーザーディレクトリの下に「LambdaFunctions」という名前のフォルダーを作成し、その中に「horoscope」という名前のファルダーを作ります。このhoroscopeフォルダーの中にプロジェクトの全てのコードを保存します。

3. プロジェクトディレクトリに移動してから、npm initコマンドを実行して、新しいNode.jsプロジェクトを初期化します。

% cd ~/LambdaFunctions/horoscope
% npm init -y

4. 必要なNode.jsパッケージをインストールします。星占いAPIでは、DynamoDBとCSVパーサーを使用するため、次のパッケージをインストールします。

% npm install @aws-sdk/client-dynamodb csv-parser

以上で、プロジェクトのセットアップは完了です。次は、星占いAPIのロジックを作成します。先ほど作成したプロジェクトフォルダー(~/LambdaFunctions)をお使いのIDE(VS CodeやWebStormなど)で開きます。horoscopeフォルダーの中にindex.jsという名前のファイルを作成して、次に示すコードを記述します。

APIロジックの実装 index.js

exports.handler = async (event) => {
  console.log('event:', event);
  //ステータスコードの取得
  const statusCode = event.statusCode; // (1)

  // 認証エラー
  if (statusCode === 401) { // (2)
    return event;
  }

  // 認証OK
  // URLクエリパラメータの取得
  const zodiacSignId = event.queryStringParameters?.zodiac_sign_id; // ここから(3)
  const eventDate = event.queryStringParameters?.event_date;
  const userId = event.queryStringParameters?.user_id; // ここまで(3)

  // 必須パラメーターのチェック
  const missingParams = []; // ここから(4)
  if (!zodiacSignId) missingParams.push('zodiac_sign_id');
  if (!eventDate) missingParams.push('event_date');
  if (!userId) missingParams.push('user_id');

  if (missingParams.length > 0) {
    return {
      statusCode: 400,
      body: JSON.stringify({
        error: 'Invalid request',
        message: `Missing required parameter(s): ${missingParams.join(', ')}`
      })
    };
  } // ここまで(4)

  // user_idの権限チェック(必要に応して実装する)
  if (userId === 'hogehoge') { // ここから(5)
    return {
      statusCode: 403,
      body: JSON.stringify({
        error: 'Forbidden',
        message: `User with ID ${userId} does not have permission to access this resource.`
      })
    };
  } // ここまで(5)

  try {
    // 星占い結果を返却する
    return { // (6)
      "statusCode":200,
      "body":"[{\"financial_luck\":1,\"work_luck\":1,\"todays_fortune\":\"今日の運勢は〇〇です。\",\"general_luck\":1,\"zodiac_sign_id\":\"1\",\"love_luck\":2,\"id\":1,\"event_date\":\"2024-05-01\"}]"
    };
  } catch (err) {
    console.error(err);
    return { // (7)
      statusCode: 500,
      body: JSON.stringify({ message: "Error retrieving the horoscope." })
    };
  }
};

このコードは、第1部のAPIの仕様に基づいて、AWS Lambda関数の実装を進めています。このコードは、星占いAPIのバックエンドロジックを処理するJavaScriptコードです。主にAPI Gatewayからのリクエストをトリガーとして実行されることを想定しています。

(1)前段のプロセスから引き継がれたHTTPステータスコードを取得します。前段のプロセスは、API Gatewayを想定しています。

(2)で、認証エラーを処理しています。ステータスコードが401(Unauthorized)である場合、認証が必要または認証失敗していることを示し、処理をそこで終了させ、リクエストイベントをそのまま返します。

(3)は、URLクエリパラメータの取得コードです。event.queryStringParametersオブジェクトから、クエリストリングを介して渡されるパラメーター(zodiac_sign_id, event_date, user_id)を取得します。この際、オプショナルチェーン(?.)を使用して、queryStringParametersがnullまたはundefinedの場合にエラーを防ぎます。

(4)必須パラメーターのチェックを行います。欠けているパラメーターがある場合は、400エラー(Bad Request)を返し、エラーメッセージに欠けているパラメーター名を含めます。

(5)で、user_idに基づく権限チェックを行います。特定のユーザーID(ここでは'hogehoge')がアクセス権を持たない場合、403エラー(Forbidden)を返します。詳細な実装は、必要に応じて読者自身で行うことを想定しています。例えば、許可するuser_idのリストを作成し、そのリストに含まれないときは、403エラーを返す実装などが考えられます。

(6)正常なフローの終わりで、ハードコードされた星占い結果をJSON形式で返します。ステータスコードは200で、レスポンスボディに星占いデータを含めます。

(7)は、エラーハンドリングです。何らかのエラーが発生した場合(例えばデータベースアクセスエラー、外部API呼び出しエラーなど)、500エラー(Internal Server Error)を返し、エラーメッセージを含むレスポンスを生成します。

ただし、現時点ではデータベースとの連携は実装されておらず、星占いデータはハードコードされています。実際のデータベースとの連携は、第3部で実装する予定です。このコードは、APIの基本的な流れを示すために作成されたものであり、最終的な実装ではデータベースから取得した星占いデータを返却するように改良される予定です。

以上で、Lambda関数の解説を終わります。次は、このLambda関数をAWSコンソールにアップロードして、デバッグ(テスト)できるようにしましょう。初めに行うのは、プロジェクトをzipファイルに圧縮することです。次のコマンドを実行します。

APIロジックの実装 zipファイルに圧縮する

% cd ~/LambdaFunctions/horoscope
% zip -r function.zip .

上記のzipコマンドは、プロジェクト内のすべてのフォルダーとファイルをzip形式で圧縮して、function.zipという名前のファイルに書き出します。コマンドを実行して、function.zipファイルが作成されることを確認してください。次は、このzipファイルをAWSコンソールにアップロードします。

API ロジックの実装 zipファイルをアップロード

図4 .zipファイルをアップロード

AWSコンソールのLambda関数「horoscope」を開きます。「コード」タブの右上「アプロード先」から「.zipファイル」を選びます。

図5 zipファイルを選択

.zipファイルをアップロードのモーダルウインドウが開きます。アップロードボタンから、先ほどのセクションで圧縮したファイル「function.zip」を選びます。「保存」ボタンをクリックして、zipファイルをアップロードします。以上で、Node.jsプロジェクトをアップロードできました。

次は、Lambda関数のデバッグ(テスト)を行います。「テスト」タブからテストイベントを作成できます。

APIロジックの実装 テスト

このセクションでは、先ほどアップロードしたプロジェクトが正しく動作するかテストします。3つのテスト「success」「failure-UnAthorized」「failure-NotPermission」を行います。

テスト「success」

AWSコンソールでLambda関数「horoscope」を選びます。「テスト」タブから一つ目のテストを作成します。テスト名は「success」とし、星占い結果を取得できるSUCCESSイベントを作成します。イベントJSONには次のコードを記述します。

{
  "statusCode": 200,
  "queryStringParameters": {
    "user_id": "user_id_00001",
    "zodiac_sign_id": "1",
    "event_date": "2024-05-01"
  }
}

イベントJSONを記述したら、右上の「保存」ボタンでテストイベントを保存してから、「テスト」ボタンを選んで、テストを実行します。

図6 テスト「success」

数秒待つと、画面上部に「成功」の通知が表示されます。これで、コードエラーなく、テストが実行されたことが確認できました。次は、通知の「詳細」を選んで、テスト内容を確認します。

図7 テスト「sucess」のログ

ログ内容を確認すると、Node.jsプロジェクトで実装した占い結果が正しいJSON形式で返却されていることが確認できます。これで、テスト「success」は完了です。 次は、テスト「failure-Unauthorized」で、認証エラーイベントをテストします。

テスト「failure-Unauthorized」

先ほどと同じ手順で、テスト名「failure-Unauthorized」を作成し、次のイベントJSONを記述します。statusCodeの値が401になっています。

{
  "statusCode": 401,
  "error": "Authentication failed",
  "message": "Invalid API Key"
}

テストイベントを「保存」してから、「テスト」を実行します。

図8 テスト「failure-Unauthorized」

上部に「成功」の通知が表示されます。コードはエラーなく実行できました。実行内容を確認するために、通知部分の「詳細」を選びます。

図9 テスト「failure-Unauthorized」ログ

テスト「failure-Unauthorized」ログを確認すると、401 Unauthorizedが正しいJSON形式で返却できています。これで、テスト「failure-Unauthorized」は完了です。最後に、テスト「failure-NotPermission」でユーザー権限エラーをテストします。

テスト「failure-NotPermission」

先ほどと同じ手順で、テスト名「failure-NotPermission」を作成し、次のイベントJSONを記述します。queryStringParameters.user_idの値が「hogehoge」になっています。

{
  "statusCode": 200,
  "queryStringParameters": {
    "user_id": "hogehoge",
    "zodiac_sign_id": "1",
    "event_date": "2024-05-01"
  }
}

テストイベントを「保存」してから、「テスト」を実行します。

図10 テスト「failure-NotPermission」

上部に「成功」の通知が表示されます。コードはエラーなく実行できました。実行内容を確認するために、通知部分の「詳細」を選びます。

図11 テスト「failure-NotPermission」ログ

テスト「failure-NotPermission」ログを確認すると、「403 Forbidden」が正しいJSON形式で返却できています。これで、テスト「failure-NotPermission」は完了です。

以上で、3つのテストすべてを完了し、APIロジックの基本形が実装できたことが確認できました。次の第3部では、DynamoDBを使用してデータベースとの連携を実装し、より完全な星占いAPIを構築していきます。そうすることで、星座と日時を検索ワードとして、占い結果を取得できるように改造します。

第3部 DynamoDB

DynamoDBは、AWSが提供するフルマネージド型のNoSQLデータベースサービスです。スキーマレスな設計により、柔軟なデータモデリングが可能で、スループットとストレージのスケーリングを自動的に行ってくれます。また、高い可用性と耐久性を備えており、ミッションクリティカルなアプリケーションにも適しています。

星占いAPIでは、DynamoDBを使用して、星座や日時に基づく占い結果を保存・取得します。Lambda関数とDynamoDBを連携させることで、APIのバックエンドをサーバーレスアーキテクチャで実現できます。

本記事では、以下の手順でLambda関数とDynamoDBを連携させていきます。

  1. DynamoDBテーブルの作成

  2. Lambda関数からDynamoDBへのアクセス設定

  3. Lambda関数の実装

  4. テストとデバッグ

これにより、星占いAPIのバックエンドをサーバーレスで効率的に構築できるようになります。それでは、まずDynamoDBテーブルの作成から始めていきましょう。

DynamoDBテーブルの作成

AWSコンソールにログインして、左上の検索フィールドに「dynamodb」と入力し、「DynamoDB」を選びます。

図12 DynamoDBダッシュボード

DynamoDBダッシュボードが開いたら、「テーブルの作成」を選びます。

図13 テーブルの作成

テーブルの作成画面が開きました。以下の設定を行います。各項目は次の役割を持っています。

パーティションキーとは、DynamoDBテーブル内のデータを分割するための主キーです。パーティションキーの値に基づいて、データが異なるパーティション(物理的な記憶領域)に格納されます。これにより、大量のデータを効率的に管理し、アクセスすることができます。パーティションキーは必須であり、一意である必要があります。

ソートキーとは、パーティションキー内のデータを並べ替えるための補助的なキーです。ソートキーを使用すると、パーティションキー内のデータを特定の順序で格納し、効率的にクエリや範囲スキャンを行うことができます。ソートキーはオプションであり、パーティションキーと組み合わせて複合主キーを形成します。

  • テーブル名:Horoscopes

  • パーティションキー:zodiac_sign_id

  • ソートキー:event_date

設定が終わったら、「テーブルの作成」で確定します。

図14 DynamoDBテーブルリスト

DynamoDBテーブルリストが表示されたら、「Horoscopes」テーブルを選びます。

図15 DynamoDBテーブルのarnをコピー

Horoscopesテーブルの一般的な情報から、「Amazonリソースネーム(arn)」をコピーします。このarn(文字列)は、Lambda関数をDynamoDBを連携させるために必要です。Lambda「horoscope」に戻って、DynamoDBへのアクセス権限を設定します。

LambdaにDynamoDBへのアクセス権限を付与

図16 Lambda関数の実行ロール

Lambda関数の「設定 > アクセス権限」セクションを開きます。実行ロール「horoscope-role-xxxx」のリンクをクリックします。すると、Lambdaにデフォルトで設定されているIAM(horoscope-role-xxxx)を編集することができます。

図17 IAM許可ポリシーの追加

IAMの設定画面が開きます。DynamoDBへのアクセス許可を追加するために、「許可を追加 > インラインポリシーを作成」を選びます。

図18 IAMのポリシーエディタ

ポリシーエディタが開きます。「JSON」を選んで、次のJSONを貼り付けます。このポリシーは、DynanoDBへの読み込み、書き込み、テーブルのアップデートをLambdaに許可します。"Resource"キーの値は、先ほどコピーしたDynamoDBのarnを貼り付けることで、特定のテーブル(Horoscopes)のみ上記ポリーシーが適用されます。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": [
				"dynamodb:GetItem",
				"dynamodb:PutItem",
				"dynamodb:UpdateItem",
				"dynamodb:BatchWriteItem",
				"dynamodb:Query",
				"dynamodb:Scan",
				"dynamodb:UpdateTable"
			],
			"Resource": "arn:aws:dynamodb:xxxxxxxx:table/Horoscopes"
		}
	]
}

以上で、DynamoDBのセットアップは完了です。次は、Lambda関数のコードを修正して、星座と日付によって、星占い結果を取得できるようにします。まず、DynamoDBにデータをインポートする「importData.js」をローカルの「LambdaFunctions/horoscope」フォルダーに作成します。次のコードを記述します。

データベース実装 importData.js

ここから先は

30,839字 / 22画像

この記事が気に入ったらチップで応援してみませんか?