RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【AWS Lambda まとめ】ローカル開発からAWS環境で実際に動かしてみる

f:id:tech-rakus:20210309132037p:plain

noriharu3 です。

業務で AWS の Lambda を使う機会があったので、簡単にまとめてみました。

Lambdaとは?

AWSのドキュメント*1には、次のように記載されています。

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秒以上時間がかかる処理
    • Lambdaで指定できるタイムアウトの上限は900秒*8(15分)。900秒以上かかると、Lambdaはエラーを返します。
  • ペイロード*9が6MB以上のリクエストbodyまたはレスポンスbody
    • リクエストbodyまたはレスポンスbodyのペイロードが6MB以上あった場合、Lambdaはエラーを返します。
  • OS、ネットワーク、ストレージレベルで制御したい
  • 好みのOSを選定したい

Lambda関数開発

続いて、実際にLambdaで実行するコード(以下、Lambda関数)を作成し、動かしてみようと思います。

  1. 環境構築
  2. ローカルPCでLambda関数を作成する
  3. ローカルPCでLambda関数を実行する
  4. AWSにデプロイする
  5. API Gateway+Lambdaにリクエストを送ってみる

環境構築

公式*11を参考に、Docker と AWS SAM CLI をインストールします。 WindowsMacLinux で手順が異なるようなので、詳細は公式のドキュメントを見てください。以下、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 関数を動かすことができるので、興味のあるかたは是非やってみてください。


当社ではエンジニア中途採用に力を入れております。
もし、当社の雰囲気・技術内容等にご興味を持たれましたら以下サイトの募集職種をお気軽にご確認ください!

◆エンジニア中途採用サイト
career-recruit.rakus.co.jp

どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。

◆カジュアル面談お申込みフォーム
forms.gle

まずは会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加いただくと良いと思います。

◆イベント情報
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.