最近色々と忙しく、約1か月ぶりの投稿になります。
今回の内容は、Node.js(Express)で作成したAPIを、AWSのLambdaで環境構築を行うという内容です。
そこまで難しくは無いのですが、権限の部分で少し躓いたので、次回からは躓かないように記事を書いていきます。
はじめに
まず初めに必要なパッケージをインストーしておきましょう!
npm i @vendia/serverless-express express
ローカル環境構築
次に、以下のようにプロジェクト直下にファイルを作成していきましょう。
touch app.js server.js lambda.js
const express = require("express");
const app = express();
// ルーティングの設定
app.get("/", (req, res) => {
return res.send("Hello");
});
// 他にルーティングなどの設定を行っていたらここに書いてください
module.exports = app;
const app = require("./app");
const port = 3000;
// HTTPサーバを起動する
app.listen(port, () => {
console.log(`listening at http://localhost:${port}`);
});
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
const server = serverlessExpress.createServer(app)
exports.handler = (event, context) => serverlessExpress.proxy(server, event, context)
このように設定したら、まずはローカルで動くかの検証をしてください。
node server
ここで動かなかったらLambdaにアップロードしてもエラーが起きるので、今一度ご確認ください。
Lambdaへアップロード
権限
ここまできたらあとはデプロイすだけなのですが、人によっては権限のエラーの種類が違うと思うので、必要な権限を書いておきます。
・AmazonS3FullAccess
・CloudWatchLogsFullAccess
・AmazonAPIGatewayAdministrator
・AWSCloudFormationFullAccess
・AWSLambda_FullAccess
serverless.yml
サーバーレスでデプロイするにはserverless.yml
を作成し、以下のように設定してください。
touch serverless.yml
service: example
provider:
name: aws
runtime: nodejs12.x
region: ap-northeast-1
package:
exclude:
- .git/**
- test/**
- README.md
functions:
exampleFunction:
handler: lambda.handler
events:
- http: ANY /
- http: 'ANY {proxy+}'
デプロイ
npx serverless deploy
EndpointのURIが表示されればOK
権限を追加してもエラーが出る場合
上の権限を追加してもエラーが出る場合以下の2つを試してください。
まず、エラー名にCreatRole
やPutRolePolicy
の権限がありません的なエラーが発生した場合は「IAM」から今デプロイしようとしているユーザーを選択。
「アクセス権限」の「インラインポリシーの追加」をクリック。
「JSON」タブを選択し、以下のコードをコピペ。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OperationRole",
"Effect": "Allow",
"Action": [
"iam:AttachRolePolicy",
"iam:CreateRole",
"iam:PutRolePolicy"
],
"Resource": "*"
}
]
}
「ポリシーの確認」をクリックし、名前は適当に入力。
デプロイする前に以下のコマンドを入力
npx serverless remove
この時にエラーが起きたら、AWSコンソールから手動で消去してください。
npx serverless deploy
AWSは権限周りが色々と面倒くさいですね。
でも権限にうるさいのは逆にありがたいことなのかも??
こんな感じで実装することができました!
以上、「【2021年6月最新版】ExpressをserverlessでAPI GatewaykaraLambdaを使ってWeb APIを使用する方法」でした!
Thank you for reading