概要
前回の記事で、RDSにDBを作成してデータを追加しました。
今回は、その追加したデータをLambdaとAPI Gatewayを使って、APIで取得したいと思います。
著者はAWSについての詳しい知識は持っておりません。そのためこの記事には不正確な点があるかもしれません。もし間違いや改善点を発見しましたら、ご指摘いただけると幸いです。
動作環境・前提条件
【動作環境】
- OS: M1 macOS Ventura 13.1
- リージョン: 大阪(ap-northeast-3)
- RDS: MySQL 8.0.32
【前提条件】
- AWSのアカウントを作成していること
- 前回の記事でデータを追加していること
データをAPIで取得するまで
今回はAPIを使って、これらのデータをJSON形式で取得したいと思います。
具体的な手順は以下の通りです。
- Lambdaをローカル環境に作る
- データを取得するコードを書く
- コードをテストする
順次解説していきます。
STEP1 Lambdaをローカル環境に作る
最初にLambdaをローカル環境で作成していきます。
まずはDockerとAWS SAM CLIをインストールする必要があります。
具体的な手順はOSによって違うので、詳しくは以下の記事を参考にしてください。
以下はMacの手順です。
brew install docker
brew tap aws/tap
brew install aws-sam-cli
ちなみに僕はHomebrewでDockerをインストールしても、うまくいかなかったので、Desktop版をダウンロードしました。
インストールができたら、以下のコマンドを入力して、Lambda関数を作成します。
sam init
するといろいろ出てくると思うので、以下のように入力してください。
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Multi-step workflow
3 - Serverless API
4 - Scheduled task
5 - Standalone function
6 - Data processing
7 - Hello World Example With Powertools
8 - Infrastructure event management
9 - Serverless Connector Hello World Example
10 - Multi-step workflow with Connectors
11 - Lambda Response Streaming
12 - Lambda EFS example
13 - DynamoDB Example
14 - Machine Learning
Template: 1
Use the most popular runtime and package type? (Python and zip) [y/N]: N
Which runtime would you like to use?
1 - aot.dotnet7 (provided.al2)
2 - dotnet6
3 - dotnet5.0
4 - dotnetcore3.1
5 - go1.x
6 - go (provided.al2)
7 - graalvm.java11 (provided.al2)
8 - graalvm.java17 (provided.al2)
9 - java17
10 - java11
11 - java8.al2
12 - java8
13 - nodejs18.x
14 - nodejs16.x
15 - nodejs14.x
16 - nodejs12.x
17 - python3.9
18 - python3.8
19 - python3.7
20 - python3.10
21 - ruby2.7
22 - rust (provided.al2)
Runtime: 13
What package type would you like to use?
1 - Zip
2 - Image
Package type: 1
Select your starter template
1 - Hello World Example
2 - Hello World Example TypeScript
Template: 1
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: y
Project name [sam-app]: UserGetApp
UserGetApp
というフォルダが生成されていればOKです!
最後に、以下のコマンドでビルドしてください。
cd UserGetApp
sam build
STEP2 データを取得するコードを書く
ではここからは、MySQLからデータを取得するコードを書いていきます。
まず最初にアプリにMySQLをインストールする必要があります。
アプリ内のpackage.json
のあるフォルダに移動してください。(手順通りに進んでいれば、UserGetApp/hello-world/にあるはず!)
移動したら、以下のコマンドを入力してMySQLをダウンロードしてください。
npm install mysql2
package.json
を開いて、MySQLがダウンロードできていればOKです。
"dependencies": {
"axios": ">=0.21.1",
"mysql": "^2.18.1",
"mysql2": "^2.3.3"
},
ダウンロードができれば、app.mjs
を開いて以下のコードを入力してください。
import mysql from "mysql2/promise";
const connection = await mysql.createConnection({
host: 'DBのエンドポイント',
user: 'ユーザー名',
password: 'パスワード',
database: 'sample_database'
});
export const lambdaHandler = async (event, context) => {
const sql = 'SELECT * FROM User';
let response = {};
try {
const [result, field] = await connection.execute(sql);
response = {
statusCode: 200,
body: JSON.stringify(result)
};
} catch (error) {
console.log(error);
response = {
statusCode: 200,
body: JSON.stringify(error)
};
}
return response;
};
DBのエンドポイントやユーザ名などは、ご自身で設定した値を入力してください。
コードを変更したら、再度ビルドして下さい。
sam build
ビルドが成功したら、以下のようにLambda関数をデプロイします。
sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
Setting default arguments for 'sam deploy'
=========================================
Stack Name [UserGetApp]:
AWS Region [ap-northeast-1]: ap-northeast-3 // ここはご自身の使用しているリージョンで構いません。
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [Y/n]: Y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: Y
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: y
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: Y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
デプロイが成功したらOKです!
STEP3 コードをテストする
ご自身のコンソールから「Lambda」を選択して、Lambda画面へ移動して下さい。
デプロイが成功していれば、「UserGetApp」が作成されているはずです。
関数詳細画面へ移動したら、画面下の「テスト」タブをクリックし、以下のように設定して下さい。
- テスト名: Test
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
最後に「設定」タブをタップして、表示されたURLに飛んでみて下さい。
以下のようなJSONが表示されるはずです。
[
{
"id": 1,
"name": "A",
"age": 20
},
{
"id": 2,
"name": "B",
"age": 30
},
{
"id": 3,
"name": "C",
"age": 35
},
{
"id": 4,
"name": "D",
"age": 28
},
{
"id": 5,
"name": "E",
"age": 40
}
]
コード内のSQL文やURLのクエリを設定すれば、欲しいデータだけを取得することもできます。
まとめ
最初は完全に理解しようとせず、とりあえず手順だけ覚えて、徐々に理解を深めていきたいと思います。
参考にした記事