noriharu3 です。
業務で AWS の Lambda を使う機会があったので、簡単にまとめてみました。
Lambdaとは?
AWS Lambda は、サーバーのプロビジョニングや管理の必要なしにコードを実行できるコンピューティングサービスです。
簡単に言うと、「サーバーを構築しなくとも、コードを実行できるよ」ということです。
図*2でいうと、こちらがわかりやすいと思います。
Lambdaの嬉しいところ
では、Lambdaの嬉しいところ、メリットについて書いていきたいと思います。
インフラの管理が不要
インフラの管理といっても色々あると思います。 とりあえずセキュリティについて、次のことはAWS*3が責任をもって対応すると言ってくれています。
AWS Lambda については、AWS が基盤となるインフラストラクチャ、基盤サービス、 オペレーティングシステム、アプリケーションプラットフォームを管理します。
なので、セキュリティについて開発者は主に次だけしっかりやればいいことになります。
- IAMの権限
- コードのセキュリティ(脆弱性)
- 機密データの保管とアクセス管理
古いですが、セキュリティ以外では次のことを担保すると述べていますね。*4
– キャパシティ
– スケール
– デプロイ
– 耐障害性
– モニタリング
– ロギング
– セキュリティパッチの適用
なるほど。サーバーやOSの構築だけでなく、スケール管理、モニタリングなどもLambdaの標準サービスとして付帯している。 インフラのメンテナンス時間や定期的なダウンタイムもない。
たしかにこれは運用している人からしたら嬉しい。
使った分だけの支払い
実際に、LambdaとEC2の月額費用を比較してみましょう。
毎日0時にPythonコード(Lambdaで実行した場合の平均時間1分)を実行するものとします。 ※ 計算しやすくするため、1ヶ月は30日とする
Lambdaの場合
ちなみに、Lambda では、指定してメモリ量に比例した CPU パワーとその他のリソースが割り当てられます。 メモリはLambdaで指定できる上限の10240MB(10GB)で計算します。
Lambda に512 MB のメモリを割り当て、30回実行し、毎回の実行時間が 60 秒間だった場合、 1 か月のコンピューティング料金 合計コンピューティング (秒) = 30 × 60 秒 = 1,800 秒 合計コンピューティング (GB-秒) = 1,800 × 10,240 MB ÷ 1024 = 18,000 GB-秒 合計コンピューティング – 無料利用枠 = 1 か月の請求コンピューティング GB-秒 18,000 GB-秒 - 400,000 GB-秒の無料利用枠 < 0 1 か月のリクエスト料金 30 件のリクエスト – 1,000,000 件の利用無料枠のリクエスト < 0 合計月額料金 合計料金 = コンピューティング料金 + リクエスト料金 = 0 USD + 0 USD = 0 USD/月
この段階で、EC2の負け確定ですねw
負け戦ですが、EC2の料金はこちら*5を参照ください。
どういうことができるのか?苦手なのか?
できることがたくさんあると思いますが、公式の資料*6には下記が記載されていました。
- APIサーバーの代わり
- アラート通知 etc
Lambdaが適さないケース
Lambdaにもいくつか制約があるので注意です。気になったものは下記になります。
- 大量のリソースが必要となる処理
- Lambdaで指定できるメモリの上限*7は10240MB(10G)
- 900秒以上時間がかかる処理
- ペイロード*9が6MB以上のリクエストbodyまたはレスポンスbody
- OS、ネットワーク、ストレージレベルで制御したい
- 好みのOSを選定したい
Lambda関数開発
続いて、実際にLambdaで実行するコード(以下、Lambda関数)を作成し、動かしてみようと思います。
環境構築
公式*11を参考に、Docker と AWS SAM CLI をインストールします。 Windows,Mac,Linux で手順が異なるようなので、詳細は公式のドキュメントを見てください。以下、Macでの手順です。
$ brew install docker $ brew tap aws/tap $ brew install aws-sam-cli
また sam コマンドのリファレンスはこちら*12。
ローカルPCでLambda関数を作成する
sam init
コマンドで、アプリケーションのプロジェクトを作成します。
このLambda関数は、{"message":"hello world"}
というレスポンスを返します。
$ sam init Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 What package type would you like to use? 1 - Zip (artifact is a zip uploaded to S3) 2 - Image (artifact is an image uploaded to an ECR image repository) Package type: 1 Which runtime would you like to use? 1 - nodejs12.x 2 - python3.8 3 - ruby2.7 4 - go1.x 5 - java11 6 - dotnetcore3.1 7 - nodejs10.x 8 - python3.7 9 - python3.6 10 - python2.7 11 - ruby2.5 12 - java8.al2 13 - java8 14 - dotnetcore2.1 Runtime: 1 Project name [sam-app]: Cloning app templates from https://github.com/aws/aws-sam-cli-app-templates AWS quick start application templates: 1 - Hello World Example 2 - Step Functions Sample App (Stock Trader) 3 - Quick Start: From Scratch 4 - Quick Start: Scheduled Events 5 - Quick Start: S3 6 - Quick Start: SNS 7 - Quick Start: SQS 8 - Quick Start: Web Backend Template selection: 1 ----------------------- Generating application: ----------------------- Name: sam-app Runtime: nodejs12.x Dependency Manager: npm Application Template: hello-world Output Directory: . Next steps can be found in the README file at ./sam-app/README.md
sam build
コマンドでビルドし、実行できる状態にします。
$ sam build Building codeuri: hello-world/ runtime: nodejs12.x metadata: {} functions: ['HelloWorldFunction'] Running NodejsNpmBuilder:NpmPack Running NodejsNpmBuilder:CopyNpmrc Running NodejsNpmBuilder:CopySource Running NodejsNpmBuilder:NpmInstall Running NodejsNpmBuilder:CleanUpNpmrc Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Invoke Function: sam local invoke [*] Deploy: sam deploy --guided
ローカルPCでLambda関数を実行する
sam local start-api
コマンドで、API Gatewayを模したHTTPサーバーを作成し、擬似的なAPI Gatewayを経由した動作確認を行うことができます。
$ sam local start-api Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET] You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template 2021-03-05 17:50:58 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit) Invoking app.lambdaHandler (nodejs12.x)
別ターミナルで http://127.0.0.1:3000/hello
にアクセスします。
お、レスポンスが返ってきましたね。
$ curl http://127.0.0.1:3000/hello {"message":"hello world"}
AWSにデプロイする
sam deploy -g
コマンドで、AWSにデプロイします。
-g
オプションを付けると、デプロイ設定を対話的にすすめることができます。
$ sam deploy -g Configuring SAM deploy ====================== Looking for samconfig.toml : Not found Setting default arguments for 'sam deploy' ========================================= Stack Name [sam-app]: AWS Region [us-east-1]: ap-northeast-1 #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: y #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: y HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y Save arguments to samconfig.toml [Y/n]: y Looking for resources needed for deployment: Found! (以下長いので、省略)
API Gateway+Lambdaにリクエストを送ってみる
デプロイは完了しているので、後はリクエストを送るだけです。
$ curl https://**********.execute-api.ap-northeast-1.amazonaws.com/Prod/hello {"message":"hello world"}
まとめ
EC2と比較して、Lambdaを使うと大幅なコスト削減ができるかもしれないので、魅力ですね。 また、インフラの管理をAWSに任せることで、運用業務にかかるコストの削減も見込めます。
ただ、Lambdaにはいくつか制約があり、適さないサービスや処理があるので、選定する際は注意です。
また SAM CLI を使えば、AWSアカウント持っていなくても、さくっとローカルで Lambda 関数を動かすことができるので、興味のあるかたは是非やってみてください。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com
*1:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
*2:https://www.bit-drive.ne.jp/managed-cloud/column/images/column14/img_01.jpg
*3:https://d1.awsstatic.com/serverless-jp/Security%20Overview%20of%20AWS%20Lambda_JP.pdf
*4:https://d1.awsstatic.com/webinars/jp/pdf/services/20150701_AWS-BlackBelt-runcodeinthecloud.pdf
*5:https://aws.amazon.com/jp/ec2/pricing/on-demand/
*6:https://d1.awsstatic.com/webinars/jp/pdf/services/20150701_AWS-BlackBelt-runcodeinthecloud.pdf
*7:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-console.html
*8:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-console.html
*9:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html
*10:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html
*11:https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
*12:https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html