概要
n番煎じ? 許してください。
初めてServerless Frameworkを使ったので、それを使ってAWSにLambdaをデプロイするまでのメモ書き。
Serverless Frameworkのインストール
前提
- node.jsのv4以上がインストールされている必要がある(serverless.com : AWS - Installation)
- 以下のコマンドで確認
$ node -v
v8.10.0
問題なければServerless Frameworkをインストール
$ npm install -g serverless
完了したら以下のコマンドを叩いてみる
$ serverless
Commands
* You can run commands with "serverless" or the shortcut "sls"
.
.
.
(省略)
エイリアスもあるので以下のコマンドでも同じ
$ sls
Commands
* You can run commands with "serverless" or the shortcut "sls"
.
.
.
(省略)
概要っぽいものがずらっと出てくればOK
そのほか、以下のコマンドでバージョン確認など
$ sls -v
1.26.1
IAMの作成
デプロイするのにアクセスキーIDとシークレットアクセスキーが必要なので、それを作成。
IAMユーザー追加して、「AdministratorAccess」のポリシーを付与。
AWSマネジメントコンソールからぽちぽちしました。
厳密には以下のような状態になってます。
- グループ作成
- グループに「AdministratorAccess」のポリシーを付与
- IAMユーザー作成
- グループにユーザーを追加
AWSCLI
インストール
作成したIAMユーザーの「アクセスキーID」「シークレットアクセスキー」を設定するために、AWSCLIをインストール。
Homebrewでできる。
$ brew install awscli
完了したら以下のコマンドで確認してみる
$ aws --version
aws-cli/1.14.60 Python/3.6.4 Darwin/16.7.0 botocore/1.9.13
プロファイルの設定
以下のコマンドを叩くと、いろいろ聞かれる
$ aws configure
アクセスキーIDを入力してエンター
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxxxxxx
シークレットアクセスキーを入力してエンター
AWS Secret Access Key [None]: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
デフォルトで呼び出しを実行する対象のリージョンを入力してエンター(ap-northeast-1 : 東京)
Default region name [None]: ap-northeast-1
デフォルトの出力形式は空のままエンターでスルー
json、text、tableから選ぶが、指定しなければjsonになる
Default output format [None]:
設定内容はこの2つのファイルに保存されてる
~/.aws/
├ config
└ credentials
また、slsコマンドでも設定できるとのこと
serverless.com : AWS - Config Credentials
上記はdefaultの設定をしているが、名前をつけて複数のプロファイルの設定もできる
AWS Documentation : 名前付きプロファイル
プロジェクト
やっと準備できた...のでプロジェクト作っていく
作成
$ mkdir testProject
$ cd testProject
$ sls create -t aws-python3
-t は どのランタイムかを指定で、以下のようなものを指定する
- aws-nodejs
- aws-nodejs-typescript
- aws-python
- aws-python3
あとはこっちでオプション一覧確認してみてください
serverless.com : AWS - Create
createを実行すると以下のようなファイルが作成される
./
├ .gitignore
├ handler.py
└ serverless.yml
- handler.py
- Lambdaファンクション。作成時点では HelloWorld 的な中身になってる。
- serverless.yml
- 設定ファイル。ファイルの中身やらリファレンスやら読んで適切に設定しよう。
ローカル実行
ドキュメント見ると、Python、Node、Javaならローカルで実行できるっぽい(2018/03/30 時点)
Currently, invoke local only supports the NodeJs, Python & Java runtimes.
コマンド叩いてみる
$ sls invoke local -f hello
{
"statusCode": 200,
"body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {}}"
}
データも渡せる
$ sls invoke local -f hello -d "hoge"
{
"statusCode": 200,
"body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": \"hoge\"}"
}
こんなのも
$ sls invoke local -f hello -d '{"foo":"bar"}'
{
"statusCode": 200,
"body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {\"foo\": \"bar\"}}"
}
jsonファイルも
{
"aaaaa": "AAAAA",
"bbbbb": {
"ccccc": "CCCCC",
"ddddd": "DDDDD"
}
}
$ sls invoke local -f hello -p ./data.json
{
"statusCode": 200,
"body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {\"aaaaa\": \"AAAAA\", \"bbbbb\": {\"ccccc\": \"CCCCC\", \"ddddd\": \"DDDDD\"}}}"
}
デプロイ
$ sls deploy
serverless.ymlに書いた設定でデプロイされる
Lambdaの実行
デプロイしたLambda関数を実行する
$ sls invoke -f hello
こっちもデータ渡せる
$ sls invoke -f hello -d "hoge"
$ sls invoke -f hello -d '{"foo":"bar"}'
$ sls invoke -f hello -p ./data.json
リソースの削除
これだけでデプロイしたリソースを削除してくれる
$ sls remove
ローカルにあるのもいらないなら適当に $ rm -r testProject
みたいな感じで消しちゃえばいいと思います