LoginSignup
5
6

More than 5 years have passed since last update.

RESTAPIをLambda + API Gatewayで実装したい(serverlessで)

Last updated at Posted at 2016-11-24

serverless@1.2.1時点でのメモ
・Lambdaプロキシ統合を使用(LAMBDA_PROXY, Lambda Proxy)

serverlessって

AWSのlambda関数とその他サービスの連携を
ローカルで設定して、簡単にアップ出来たりする。

slsコマンドを使う。

インストール

npm install serverless -g

※npmコマンドがまだ入ってない時
npm(Node.js) インストール メモ

プロバイダアカウントの設定

AWSで:IAMユーザの作成

  1. IAMユーザを「serverless-admin」という名前で作成。

2.
「serverless-admin」
→アクセス許可
→ポリシーのアタッチ
→「AdministratorAccess」を追加

aws-cliのインストール

curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install awscli

## 確認
aws --version

aws-cliにIAMの資格情報を登録

aws configure

AWS Access Key ID [None]: IAMアクセスキーを入力
AWS Secret Access Key [None]: IAMシークレットキーを入力
Default region name [None]: ap-northeast-1
Default output format [None]:未入力でEnter

serverlessがデフォルトのAWSプロファイルを見れるようにする

cp ~/.aws/config ~/.aws/credentials

サービス作成

mkdir 名称 && cd 名称
sls create -t aws-nodejs

createコマンドで作成されるファイル群

ファイル 説明
event.json 作成した関数をテスト実行するときに使用するテストデータを格納。
handler.js Lamdaにアップする関数を記載する。
serverless.yml デプロイ先(API Gateway)のクラウドの設定
(プロバイダ、プラグイン、イベント)
を記載する。
環境変数も定義できる。

デプロイするまで

アップする関数を作成

APIGatewayで使うLambda用の関数を作る

ローカルでテストしたくても、
まず↓のデプロイ設定をしなくちゃだめ!

デプロイ設定

ymlファイルについては別ページにて記載。

とりあえず、ここで言えることはymlファイルは「半角スペースのインデントでネストを表現」するので、そこだけ注意。

例:serverless.yml
service: my-api

provider:
  name: aws
  runtime: nodejs4.3
  region: ap-northeast-1

functions:
  fn:
    handler: handler.hello
    memorySize: 128
    timeout: 10
    events:
      - http:
          path: index
          method: get

解説

設定 説明
service API Gatewayの名前を設定
(stage名-service名が登録される)
provider 下層にプロバイダの設定を記載
provider:name aws固定でおk
provider:runtime 関数で使用する言語設定?デフォでおk
provider:region ambdaとAPIGatewayを実装するリージョンを設定。東京なら「ap-northeast-1」
functions 下層に関数に関する設定を記載
functions:fn fnは仮。

LambdaFunction名にしたいものをfn箇所に記載。
(service名-stage名-fnが登録される)
functions:fn:handler 実際に動作させるhandler.jsの関数を指定。js名.関数名
functions:fn:memorySize Lambdaのメモリ設定
functions:fn:timeout Lambdaのタイムアウト設定
functions:fn:events 下層にイベントの詳細を記載
functions:fn:events[http] リクエストの詳細を下層に記載。
functions:fn:events[http:path] APIのパスを指定
functions:fn:events[http:method] リクエストメソッドを指定
(記載の際はインデント注意)
functions:fn:events[http:cors] corsの有効化を指定

Lambdaプロキシ統合の場合、
OPTIONSメソッドのみの対応。
その他のメソッドはレスポンスヘッダ直書きになる。

(記載の際はインデント注意)

作成した関数をローカルでテスト

sls invoke local -f Function名
sls invoke local -f Function名 -p jsonファイル名
※localを外せば本番のAPIを実行するよ(お金かかるはず)
オプション 解説
-f Function名 serverless.ymlに記載したFunction名を記載
-p jsonファイル Lambdaに渡すeventを定義したjsonファイルを指定

サービスのデプロイ(再デプロイも一緒)

sls deploy


デプロイやサービス削除で、S3に対し、ログの作成や更新を行う。
そのログを履歴として、serverlessとの連携を実現している?
S3の料金どないすんねん!
とか後から言われても知らないんだからねっ

サービスの削除

sls remove
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6