LoginSignup
30
29

More than 5 years have passed since last update.

Serverless Frameworkならすぐ出来るよね AWSでサーバーレス(API+Lambda[java]を簡単セットアップ)

Last updated at Posted at 2017-01-23

はじめに

  • Serverless Conf Tokyo自分の登壇の中でも触れてますが、ServerlessでやってるとコードやBuild+Deployの管理がバラバラになり、メンテナンス性が欠如しがちです。
  • そこら辺のソリューションをフレームワークとして提供してくれるのがServerless Frameworkです:beer:
  • 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

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が楽しくなりそうです。
  • 近日中にもう少し深掘りしたネタを投稿する予定です。
30
29
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
30
29