serverlessでLambdaのローカル開発環境を整える

serverlessフレームワークを使ってローカル環境で作成したNode.jsをLambda関数としてデプロイ


##環境


```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.6
BuildVersion:	15G1212

$ brew -v
Homebrew 1.1.11
Homebrew/homebrew-core (git revision 0e1e; last commit 2017-03-11)

$ node -v && npm -v
v6.9.2
3.10.9
```

##やったこと

何はともあれServerlessのインストール

```
$ npm install serverless -g
```

AWS CLIのインストール

```
$ brew install awscli
$ aws
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: too few arguments

```

AWS CLIの設定
Access Keyで設定する場合

* 事前にIAMでグループ権限とユーザーに対するグループ追加を行う必要あり

```
$ aws configure
AWS Access Key ID [None]: ABCABCABCABCABCABC12
AWS Secret Access Key [None]: BCDBCDBCDBCDBCDBCDBCD+123+EFGEFGEFG45678
Default region name [None]: us-east-1
Default output format [None]: json
```

※AWS リージョンコード一覧
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

確認

AWC CLIが使えるかの確認をします。
ここでは、EC2のインスタンス一覧表示コマンドを投げました。
(結果は何もないのでからのjsonが返ってくる。

```
aws ec2 describe-instances
{
    "Reservations": []
}
```


##使ってみる

プロジェクト作成

まずはプロジェクトを作成
公式ドキュメントにある、node.jsテンプレートを使用し、プロジェクトを作成

```
$ serverless create --template aws-nodejs --path serverless-test
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/d_ojima/Documents/serverless-test"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.8.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"
```
それっぽいロゴが表示されます。
テンション上がりますね:watermelon:

内容を確認

```
$ cd serverless-test/ && tree .
.
├── handler.js
└── serverless.yml

0 directories, 2 files

```

デプロイ

handler.jsにサンプルが書かれている状態なので、このままデプロイしてみます。

```
$ serverless deploy -v
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
CloudFormation - CREATE_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-test-dev
CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_IN_PROGRESS - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_COMPLETE - AWS::S3::Bucket - ServerlessDeploymentBucket
CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - serverless-test-dev
Serverless: Stack create finished...
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (583 B)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - CREATE_COMPLETE - AWS::CloudFormation::Stack - serverless-test-dev
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-test-dev
CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroup
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecution
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunction
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionmQpsI2bHdSCO39nFrbUuIDXStzt10M9R68vwOUGdtc
CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionmQpsI2bHdSCO39nFrbUuIDXStzt10M9R68vwOUGdtc
CloudFormation - CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersionmQpsI2bHdSCO39nFrbUuIDXStzt10M9R68vwOUGdtc
CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - serverless-test-dev
CloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - serverless-test-dev
Serverless: Stack update finished...
Service Information
service: serverless-test
stage: dev
region: us-east-1
api keys:
  None
endpoints:
  None
functions:
  hello: serverless-test-dev-hello

Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:932608639237:function:serverless-test-dev-hello:1
ServerlessDeploymentBucketName: serverless-test-dev-serverlessdeploymentbucket-1gve57f768zkr

```

ブラウザからAWSコンソールを確認すると

serverlessでデプロイしたLambda関数が確認できました:airplane:
![スクリーンショット 2017-03-11 18.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/79414/ae5724e4-a2ec-8099-d3cc-23b0bbb90ada.png)

また、serverlessではCloudFormationの機能を利用しているため、同時にIAMロールS3バケットなども作成されていました。


##雑感

とりあえず環境構築ということで、serverlessの触り中の触りを試してみた。
今後は、外部パッケージを使ったラムダ関数の作成、API Gatewayとの連携などを試してみたい。