⌨️

今から始めるLambda①「概要・関数の作成」

2021/10/20に公開
2

はじめに

今回はタイトルにもある通りAWS Lambdaについて自分の学習メモも兼ねて記事にしたいと思います。

※初心者による、初心者向けの記事ですので文中の認識間違いなどの指摘をいただけますと幸いです。

前提

  • MacOS
  • Dockerが利用できる
  • AWSのアカウントは作成済み
  • JSの知識がある

AWS Lambdaとは

https://aws.amazon.com/jp/lambda/

上記のページには以下のような記載があります。

AWS Lambda はサーバーレスコンピューティングサービスで、サーバーのプロビジョニングや管理、ワークロード対応のクラスタースケーリングロジックの作成、イベント統合の維持、ランタイムの管理を行わずにコードを実行できます。Lambda を使用すれば、実質どのようなタイプのアプリケーションやバックエンドサービスでも管理を必要とせずに実行できます。コードを ZIP ファイルまたはコンテナイメージとしてアップロードするだけで、Lambda はあらゆる規模のトラフィックに対して、自動的かつ正確にコンピューティング実行能力を割り当て、受信リクエストやイベントに基づいてコードを実行します。コードは、200 種類を超える AWS のサービスおよび SaaS アプリケーションから自動的にトリガーするよう設定することも、ウェブやモバイルアプリケーションから直接呼び出すよう設定することもできます。Lambda 関数をお気に入りの言語 (Node.js、Python、Go、Java など) で記述し、サーバーレスツールと AWS SAM や Docker CLI などのコンテナツールの両方を使用して、関数をビルド、テスト、デプロイできます。

自分はGCPには多少は覚えがある人間なので、あちらで言うところのCloud Functions的なものだと理解しています。

もっと雑に噛み砕くと、サーバレス(ランタイムを用意する等の環境構築は必要なし)でプログラムを実行できAPI Gatewayや各種DBのトリガーと絡めることで、アプリケーションのバックエンドとして利用できるもの、ということです。

Cloud Functionsでもそうですが、使用できる言語に制限があり、以下のものが使用できます。

使用できる言語

  • Java
  • Go
  • PowerShell
  • Node.js
  • C#
  • Python
  • Ruby

さらに拡張を入れることで、以下の言語も使えるようになるようです。

拡張を入れることで使用できる言語

  • C++
  • COBOL
  • Rust
  • Erlang
  • Elixir
  • PHP

料金

https://aws.amazon.com/jp/lambda/pricing/

同じくAWSEC2などは起動時間中はずっと料金が発生するのに対してLambdaはリクエスト数と実行時間に対して課金されます。

後述のランタイムのスペック(メモリ等)によって多少変動しますが、公式ページの使用例に以下のようなものがあります。

関数に 512 MB のメモリを割り当て、x86 ベースのプロセッサで 1 か月に 3,000,000 回実行し、毎回の実行時間が 1 秒間だった場合、料金は以下のようになります。

1 か月のコンピューティング価格は 1 GB-秒につき 0.00001667 USD で、無料利用枠は 400,000 GB-秒です。
合計コンピューティング (秒) = 3,000,000 × (1 秒) = 3,000,000 秒
合計コンピューティング (GB-秒) = 3,000,000 × 512 MB ÷ 1024 = 1,500,000 GB-秒
合計コンピューティング – 無料利用枠 = 1 か月の請求コンピューティング GB-秒
1,500,000 GB-秒 – 400,000 GB-秒の無料利用枠 = 1,100,000 GB-秒
1 か月のコンピューティング料金 = 1,100,000 × 0.00001667 USD = 18.34 USD

1 か月のリクエスト料金は 1,000,000 件のリクエストにつき 0.20 USD で、無料利用枠は 1 か月に 1,000,000 件です。
合計リクエスト – 無料利用枠 = 1 か月の請求リクエスト
3,000,000 件のリクエスト – 1,000,000 件の利用無料枠のリクエスト = 2,000,000 件の請求リクエスト
1 か月のリクエスト料金 = 2,000,000 × 0.2 USD ÷ 1,000,000 = 0.40 USD

合計料金 = コンピューティング料金 + リクエスト料金 = 18.34 USD + 0.40 USD = 18.74 USD/月

この設定でだいたい2000円/月です。
個人でちょっとしたものを開発するなら、リクエスト数もより少なくなりそうなので安価で使用できると思います。

上記の例でもある通り、無料枠が定められていて、 「100万リクエスト/月」と「40万 GB-秒」 の実行時間が無料枠として扱われます。

注意:無限ループすると請求が莫大に

無料枠もあるためお試しで触る分にはタダですが、注意点があります。
Lambda中で無限ループが発生すると、リクエストや実行時間が延々と伸び続けてとんでもない料金の請求が来たりします。

俗に言う「クラウド破産」というやつです。

https://kotororo.net/2018/03/はじめてのクラウド破産体験lambdaのトリガーにs3を設定するときに気を付けること/

https://blog.mmmcorp.co.jp/blog/2019/12/25/lambda-cloud-bankruptcy/

対処法としては、無限ループに起因する過剰な請求にいち早く気づくためにアラートを設定するなどがあります。

https://qiita.com/Soh1121/items/fbd9e13cd050bcefbe55

個人にしろ法人にしろ、この設定は初期段階でやっておくと事故を防ぐことができるため、おすすめです。

Lambdaを動かしてみる

それでは早速Lambdaを動かしてみましょう。
今回は簡単なJSのコードを動かしてみようと思います。

関数の作成

AWSのダッシュボードから【すべてのサービス】を選択し、その中の【コンピューティング】のセクションから【Lamada】を選択します。

すると以下のような画面が表示されると思うので【関数の作成】を押下します。

続いて設定画面が表示されます。
ここでは【関数名】と【ランタイム】を設定しましょう。
以下のようなイメージです。

問題なければ【関数の作成】を押下します。
すると、エディタのような画面が表示されてコードが記載されています。
簡易的なレスポンスを返却する関数です。

index.js
exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

試しに【Test】を押して実行してみましょう。
以下のようなレスポンスが画面に表示されます。

{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}

関数の変更(デプロイ)

次に、この関数を書き換えてみましょう。
以下のようにランダムでレスポンスが異なる関数に書き換えてみます。

index.js
exports.handler = async (event) => {
    const result = Math.floor(Math.random()*2);
    const statusCode = result? 200 : 500;
    const body = result? 'Success!' : 'Internal Server Error...';
    const response = {
        statusCode,
        body: JSON.stringify(body),
    };
    return response;
};

変更をした後に【Test】を押してみてもレスポンスは先ほどと変わらないと思います。
変更した分を反映させるにはデプロイが必要となります。
※その場合、ステータスがChanges not deployedとなっています。

【Test】の隣の【Deploy】を押下してみましょう。
ステータスが緑色のChanges deployedに変わったかと思います。

この状態で【Test】を押下すると、レスポンスが変更後のコードのものに変わります。

まとめ

今回はAWS Lambdaの概要と、簡単な関数作成、コンソールから関数の変更およびデプロイを行いました。

とはいえ実際にはローカル環境でVScodeなどを用いて関数を作成し、それをLambdaにデプロイするケースがほとんどだと思います。

そちらについてはまた別記事で紹介したいと思います。

今回の内容が役立てば幸いです。

Discussion

bluepostbluepost

恐縮ですが、ラムダの綴りは「Lamda」ではなく「lambda」です...。