はじめに
- Serverless Conf Tokyoの自分の登壇の中でも触れてますが、ServerlessでやってるとコードやBuild+Deployの管理がバラバラになり、メンテナンス性が欠如しがちです。
 - そこら辺のソリューションをフレームワークとして提供してくれるのがServerless Frameworkです
 - License は、MIT Licenseです。
 - 本記事ではセットアップとHello Worldをやってみます。次記事でもう少し深掘りしますので。
 - Serverless Frameworkでは、LambdaのTemplateとして、以下が用意されています。今回は弊社内で一番知られているjava-mavenを採用します。
- aws-nodejs
 - aws-python
 - aws-java-maven
 - aws-java-gradle
 - aws-scala-sbt
 - aws-csharp
 
 - 因みに、Lambdaはjava遅いって思ってる方は以下のスライドを読みましょう。
http://www.slideshare.net/keisuke69/tune-up-aws-lambda 
環境のセットアップ
Serverless Frameworkのインストール
- npmから一発です。
 
$ node -v
v5.12.0
$ npm install -g serverless
$ serverless —version
1.5.1
AWS CLIのセットアップ
- AWS CLIを叩くのでインストールします。(インストール済の場合は読み飛ばしてください)
 
$ pip install awscli
- 管理者権限のIAMユーザを用意して、ユーザ情報をセットします。
 
$ aws configure
AWS Access Key ID [None]:(Access Key)
AWS Secret Access Key [None]:(Secret Key)
Default region name [None]: ap-northeast-1
Default output format [None]:json
Serverless FrameworkでDeploy
Serviceの作成
- 以下のコマンドでテンプレートを作成します。
 
$ serverless create --template aws-java-maven --path myService
・
・
Serverless: Successfully generated boilerplate for template: "aws-java-maven"
Serverless: NOTE: Please update the "service" property in serverless.yml with your service name
STS(Eclipse)にインポート
- STSを起動して、Project Explorer -> 右クリック -> Maven -> Existing Maven Projectsで先程作成した「myService」フォルダを選択します。
 
serverless.yml の修正 + Build
- serverless.ymlのL20 周辺の設定を以下のように指定します。
 
serverless.yml
provider:
  name: aws
  runtime: java8
  stage: prod
  region: ap-northeast-1
- プロジェクトを右クリック -> Run As -> Maven Install でビルドします。
 - target配下にhello-dev.jarが出来上がります。
 
Deploy その1(Lambdaのみ)
- Serveress Frameworkでは、以下のコマンド一発でLambdaのセットアップ、JarのアップロードをCloudFormationを使って実行してくれます。
 
$ cd myService
$ serverless deploy -v
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (1.98 MB)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - aws-java-maven-prod
・
・
Serverless: Stack update finished...
Service Information
service: aws-java-maven
stage: prod
region: ap-northeast-1
api keys:
  None
endpoints:
  None
functions:
  aws-java-maven-prod-hello: arn:XXXXXXXX
- 
今までのコンソールでLambdaセットアップして、Jarアップロードしてみたいな作業がががです。
 - 
invokeコマンドでLambdaが反応するか確認します。
 
$ echo '{"key1":"value1","key2":"value2","key3":"value3"}' > event.json
$ serverless invoke --function hello -p event.json
{
    "statusCode": 200,
    "body": "{\"message\":\"Go Serverless v1.x! Your function executed successfully!\",\"input\":{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\"}}",
    "headers": {
        "X-Powered-By": "AWS Lambda & serverless"
    },
    "isBase64Encoded": false
}
Deploy その2(API Gateway+Lambda)
- 上記では、endpoints が無いのでAPI Gateway+Lambdaとなるよう、設定を変更して、再度Deployします。
 - 先程のserverless.ymlのL51 周辺のfunction句のコメントアウトを外します。
 
serverless.yml
functions:
  hello:
    handler: com.serverless.Handler
    events:
      - http:
          path: users/create
          method: get
- 再度Deployします。
 
$ serverless deploy -v
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (1.98 MB)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - aws-java-maven-prod
・
・
Service Information
service: aws-java-maven
stage: prod
region: ap-northeast-1
api keys:
  None
endpoints:
  GET - https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/prod/users/create
functions:
  aws-java-maven-prod-hello: arn:XXXXXXXX
- endpointに向けてリクエストして、反応するか確認します。
 
$ curl https://XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/prod/users/create
{"message":"Go Serverless v1.x! Your function executed successfully!","input":{"resource":"/users/create","path":"/users/create","httpMethod":"GET","headers":{"Accept":"*/*","CloudFront-Forwarded-Proto":"https","CloudFront-Is-Desktop-Viewer":"true","CloudFront-Is-Mobile-Viewer":
・
・
Stackの削除
- 以下のコマンドで、上記で作成したCloudFormationのStackごと削除できます。
 
$ serverless remove
Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
.....................
Serverless: Stack removal finished...
まとめ
- これで、もっともっとServerlessが楽しくなりそうです。
 - 近日中にもう少し深掘りしたネタを投稿する予定です。
 
