40
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Serverless FrameworkでAWS Lambdaをデプロイ

Last updated at Posted at 2018-08-17

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を構築する

40
27
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
40
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?