Help us understand the problem. What is going on with this article?

Serverless FrameworkでAWS Lambdaをデプロイ

More than 1 year has passed since last update.

Serverless Framework

Serverless FrameworkはAWS LambdaやAmazon APIGatewayなどを利用したサーバーレスなアプリケーションを構築や管理・デプロイするためのツールです。
設定ファイルを作成してコマンドを実行することで、LambdaやAPIGatewy、DynamoDB、S3などのAWSサービスを構築・管理することができます。
さらに、作成したプロジェクトをGithubなどに公開することで、Lambda関数のコードの管理を行えることや、他のAWSアカウントでも使用できるためAWS環境の共有を行うこともできます。
開発用のアカウントから、本番用のアカウントへの移行をコマンドで簡単に行うことができます。
今回はServerless Frameworkを用いてAWS Lambdaをデプロイします。

環境

npmはNode.jsをインストールした際に同時にインストールされます。Nodeの管理はanyenvを使用しています。
また、AWS コマンドラインインターフェイス(AWS CLI)もインストールします。

anyenvのndenvを使ってnode.jsのバージョンを管理する

AWS CLIのインストール

  • OS : macOS High Sierra
  • OpenSSL : 2.2.7
  • node : 10.5.0
  • npm : 6.1.0
  • AWS CLI : 1.15.24

Serverless Frameworkのインストール

slfというディレクトリを作成し、環境を構築します。

$ mkdir slf
$ cd slf
$ npm init
$ ls
  package.json

依存ライブラリやプロジェクトの基本情報を記述する「package.json」が作成されます。
このjsonファイルを共有することで、他の環境でもnpmを使用して依存ライブラリをインストールすることが可能になります。

$ npm install -g serverless
$ serverless --version
  1.30.0

npm install -g serverlessでインストールします。serverless --versionでバージョンが表示されれば正しくインストールされています。

AWSアカウントの設定

公式サイトにAWSアカウントのセットアップ方法が書かれています。AWSアカウントが作成されている前提で進めます。

$ serverless config credentials --provider aws --key "your access key id" --secret "your secret access key"
  Serverless: Setting up AWS...
  Serverless: Saving your AWS profile in "~/.aws/credentials"...
  Serverless: Success! Your AWS access keys were stored under the "default" profile.

serverless config credentialsコマンドでAWSアカウントの設定を行います。--providerで使用するサービス(今回はAWS)を指定します。AWS IAMで作成した認証情報を、--keyでアクセスキーIDを、--secretシークレットアクセスキーを指定します。
aws configureで設定した情報を確認することができます。

Lambda関数の作成

Lambdaのプロジェクトを作成しましす。使用する言語はPython3.6です。

$ serverless create --template aws-python3 --name slf-sample
$ ls
handler.py        package-lock.json serverless.yml
node_modules      package.json
ファイル 用途
event.json Lambda関数のテストでハンドラー関数の引数eventに渡されるテストデータ
handler.py Lambda関数が呼び出す関数。実際にLambdaの実装を行う。
serverless.yml 各種設定ファイル。Lambdaの設定、エンドポイントの設定、リソースの設定、トリガーの設定、などを記述する。
handler.py
import json


def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

    # Use this code if you don't use the http event with the LAMBDA-PROXY
    # integration
    """
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }
    """

Pythonのファイルには、引数のeventの内容をJSON形式で表示する処理が書かれています。
このLambdaをデプロイしていきます。

Lambdaのデプロイ

デプロイ先のリージョンの設定

serverless.yml
# you can overwrite defaults here
#  stage: dev
#  region: us-east-1

デプロイ先のリージョンはデフォルトでes-east-1バージニア北部に指定されているので、regionキーの値をap-northeast-1で東京に変更する。

serverless.yml
# 使用するクラウドサービス(AWS)と言語(Pytho3.6)を指定
provider:
  name: aws
  runtime: python3.6

# ステージを指定。開発と本番環境を切り分けることができます。
  stage: dev
# デプロイするリージョンを指定
  region: ap-northeast-1

IAM Roleの設定

AWSアカウントで作成したIAM RoleをLambdaに設定することができます。
IAM RoleのロールARNをserverless.ymlroleキーに記述します。

serverless.yml
# 使用するクラウドサービス(AWS)と言語(Pytho3.6)を指定
provider:
  name: aws
  runtime: python3.6

# ステージを指定。開発と本番環境を切り分けることができます。
  stage: dev
# デプロイするリージョンを指定
  region: ap-northeast-1
# Lambdaに適用するIAM Roleを指定
  role: "your IAM Role ARN"

Lambdaのデプロイ

$ serverless deploy -v

serverless deploy -vでデプロイすることができます。関数単位でデプロイする場合は
serverless deploy function -f "your lambda function"で可能です。

lambda.png

図のようにAWSのコンソール画面に、設定ファイルで指定したLambdaが作成されていればデプロイ成功です。

Lambdaの実行

$ serverless invoke -f hello -d '{"test":"test"}'
{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {\"test\": \"test\"}}"
}

serverless invokeコマンドでLambdaの実行を行えます。
-fオプションには実行する関数名を指定できます。serverless.ymlファイルのfunctionリソースに設定されている関数名を指定することができます。

serverless.yml
# Lambdaを構築
functions:
  # 関数名を指定
  hello:
    # handler関数を指定
    handler: handler.hello

event引数にパラメーターを指定する際には、-dコマンドで指定します。
出力にはhandler.pyhello関数の戻り値が出力されていることが確認できます。

サービスの削除

$ serverless remove

デプロイしたサービスをローカルからserverless removeコマンドで削除出来ます。

まとめ

今回はServerless Frameworkの環境構築から、AWS Lambda関数の作成・デプロイ・実行までを行いました。
次回は、Lambda関数のトリガーの設定や、連携サービスの設定などを行いたいと思います。

Serverless FrameworkでAPIGateway・Lambda・DynamoDBを構築する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした