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

Serverless Framework でHello world

概要

Serverless Framework とはサーバレスなアプリケーションを作成、デプロイが簡単にできるツール。
AWS Lambda や Google Cloud Functions といったFaasの実装や、API Gateway の構成変更が容易にできる。
今回はAPI Gateway経由でAWS Lambdaを呼び出してみる。

環境構築

インストール

まずは Serverless Frameworkをインストール。

$ npm install serverless -g

インストールが完了したらデプロイする際に必要なAWSのユーザ情報を作成する。

IAMユーザの作成・登録

Serverless Framework をAWSで利用するには色々と権限を付与したユーザを用意する必要がある。
公式でセットアップ手順が記載されているのでその通りにユーザを作成する。

  1. AWSのIAM管理コンソールを開く
  2. "ユーザを追加"をクリックする
  3. 適当にユーザ名を入力する。ここでは"serverless-agent"とする。
  4. "プログラムによるアクセス"にチェックボックスを入れ"次のステップ"をクリック
  5. "既存のポリシーを直接アタッチ"から"ポリシーの作成を選択"
  6. JSONをクリックし公式で案内しているgistから内容をコピペして上書き
  7. ポリシーの確認をクリック
  8. 適当にポリシー名を入力する。ここでは"serverless-agent-policy"とする。入力したらポリシーの作成をクリック。
  9. ポリシーが作成されたらユーザを追加の画面に戻ってポリシーをリロード
  10. ポリシーから"serverless-agent-policy"を選択して"次のステップ"をクリック
  11. 次のステップ: 確認をクリック
  12. ユーザの作成をクリック
  13. ユーザの作成が成功したらアクセスキーIDとシークレットアクセスキーが表示されるので下記コマンドで Serverless Framework にユーザ情報を登録する。
$ serverless config credentials --provider aws --key <アクセスキーID> --secret <シークレットアクセスキー>

これで Serverless Frameworkからサーバレスアプリケーションをデプロイするための準備ができた。

アプリケーションの作成

今回はPython 3.7 でアプリケーション(といっても中身はHello world)を作る。
Serverless Framework はslsという短いコマンドから操作できるので、これを用いてアプリケーションを実装していく。

まずはサーバレスアプリケーションのプロジェクト作成。

$ sls create -t aws-python -p helloWorld

createオプションでプロジェクトを作成。
-t--templateの略でどの言語で実装するかを選択するオプション。
今回はPython を選択。
使用できる言語の一覧

-p--pathの略でプロジェクトのパス名を指定するオプション。

helloWorldディレクトリが作成されたら中を見てみる。
serverless.ymlにはアプリケーションの構成情報が定義されている。

service: aws-python3

provider:
  name: aws
  runtime: python3.7

functions:
  hello:
    handler: handler.hello

handler.pyにはserverless.ymlで指定したhello関数が定義されている。
中身は入力内容をそのままjsonとして返すコードになっている。

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

Lambdaの実装を書き換えてみる

handler.pyの中身を下記のように書き換える。
入力に関わらず"Hello Serverless!!"と返すようになる。

import json


def hello(event, context):
    body = {
        "message": "Hello Serverless!!"
    }

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

    return response

API Gatewayを作成する

次にserverless.ymlを下記のように編集する。

service: aws-python3

provider:
  name: aws
  runtime: python3.7

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get

helloエンドポイントに対するGetイベントが発生するとLambda関数を実行するようになる。

デプロイ

デプロイは下記のコマンドでできる。

$ sls deploy -v

デプロイが完了すると下記のような出力がされる。

Service Information
service: aws-python3
stage: dev
region: <AWSのデフォルトのリージョン>
stack: aws-python3-dev
resources: 10
api keys:
  None
endpoints:
  GET - https://<エンドポイント>.execute-api.us-east-1.amazonaws.com/dev/hello
functions:
  hello: aws-python3-dev-hello
layers:
  None

endpointsの部分が今回作成したLambdaのAPIエンドポイント。
期待通りデプロイされているか試しにcurlでgetリクエストを送ってみる。

$ curl -X GET https://vh3i1rl9nc.execute-api.us-east-1.amazonaws.com/dev/hello
{"message": "Hello Serverless!!"}

Serverless Frameworkを用いてHello worldを書くことができた。

削除

Hello worldを書きながらServerless Frameworkの基本的な挙動を確認することができた。
ただ、Hello worldといってもAWSのリソースを使っているため残しておくと課金が発生する。
なので今回作成したリソースはAWS上から削除しておく。

$ sls remove -v

参考にしたサイト

https://serverless.com/framework/docs/providers/aws/guide/credentials/
https://serverless.com/framework/docs/providers/aws/examples/hello-world/python/
https://dev.classmethod.jp/cloud/aws/serverless-first-serverlessframework/

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
ユーザーは見つかりませんでした