AWSサーバレスアーキテクチャーNo1:Lambda

AWSのホームページの初心者ハンズオンにある「サーバーレスアーキテクチャで翻訳 Web API を構築する 」の内容を自分のAWSアカウントでやってみました。

ハンズオンではAWSホームページで、10本の Youtube-video でもって、Serverless構成の基本を、実際の操作の様子で確認することができます。

今回の投稿では、この中から、以下の内容で6パートに分けてあげようと思っています。

  1. まず手始めに、AWS Lambda を単体で動かして見る。ファンクションとしてはログを出力するだけ
  2. 上記①の内容で、Amazon Translate を呼びだして、日本語を英語に翻訳してみます。
  3. Amazon API Gateway の Mock 機能を利用し、固定の JSON を返す Web API を作成してみます。
  4. Amazon API Gateway と AWS Lambda を連携して、上記②の日本語を英語に翻訳する Web API を構成してみます。
  5. Serverless構成でよく構成要素になるAmazon DynamoDB をセットアップしてみます。
  6. これまでの要素全取りの「API-GW+Lambda+DynamoDB」構成で動かして見ます。

ざっくりと基本構成を図で表してみて、最後まで行くと以下のような構成になります。
今回の投稿は、この構成の中から、Lambda のみ動かします。

Serverless構成

サーバーレスアーキテクチャーについては、その有効性が巷で話題となり、試してみたかったのですが、(一番最初からStudyしていたんですが)その割になかなかやれていなかったりしていました。先にセキュリティ、AI、仮想現実なんかやってたりして・・・

サーバーレスアーキテクチャーについて、ハンズオンでも概要をまとめていましたが、簡単に説明するとすると。

サーバレスアーキテクチャー

なぜにサーバーレスがもてはやされるのか?

開発者がやりたいことは何か?
エンドユーザに向けて、サービスを提供することだけである
サーバの管理もあるが、それはサービスを提供するための手続きに過ぎない
開発者にとって、実はいらない必要悪とは?
ビジネスの価値とならないが、避けては通れない必要な作業がたくさんある。
実際はやりたくないし、その頭痛のタネのために、プロジェクトが進まないことも多々・・
  ①サーバセットアップ  ②ミドルウエア、ランタイムのセットアップ
  ③セキュリティパッチ  ④耐障害性確保の検討
そこで登場!! サーバレスアーキテクチャーの有効性とは!!
①インフラのプロビジョニングや管理が不要 (つまり、楽ちん!!)
②負荷によって、自動的にスケール。初めから高い可用性 (つまり、安心!!頼りになる!!)
③従量課金で動かしただけの支払い (つまり、お財布に優しい!!すぐにやめることもできる!!)
ポイントは?
構成要素(OSなど)には触れない分、自由度は低いが、AWSに管理を任せて、機能の作り込みに集中できる!!

Lambda におけるコーディング&設定

対応⾔語:Java、Go、PowerShell、Node.js、C#、Python、Rubyなど

     サポートされていない⾔語は、カスタムランタイムを実装することで利⽤可能

ハンドラーで呼び出す関数を指定する → デフォルトでは lambda_function.lambda_handler(この後、設定します)

Lambda で設定できる項⽬

 確保するメモリの量
   ●128MB ~ 3,008MB (64MBごと)
   ● CPU能力は確保するメモリの量に比例
 タイムアウト値 最大で 900秒
 実行IAMロールを操作の中で付加できる(この後、付加します)

Lambda のイベントソースと呼び出しタイプ

 ●非同期呼び出し ファイルアップロードのイベント → S3 → Lambda

    Lambda へのリクエストが正常に受け付けられたかどうかのみを返却

 ●同期呼び出し  ブラウザ呼び出し → API-Gateway → Lambda

    Lambda の実行完了時にレスポンスを返却

Lambda Function のライフサイクル

  • Lambdaは呼び出されると、コンテナ上でプログラムが実行される
  • 1つのコンテナで同時に実行できるのは1つのリクエストまで
  • コンテナは再利用されるが、利用可能なコンテナがないときはコールドスタートされる

コールドスタートの場合

ウォームスタートの場合

それでは、まずは AWS Lambda を使って、単体でログを取るだけの実装をしてみます!!

Lambdaサービスの画面に遷移します。

Lambda Function を 「⼀から作成」 する

「関数の作成」をクリック

「一から作成」を選んで、ランタイムは「Python3.9」にして、「関数の作成」をクリック

設定タブをクリック
「編集」をクリック

確保するメモリの量、タイムアウト値の変更をする

初期表示
値を設定

今回は、メモリを「256MB」、タイムアウトを「10秒」で設定した。
また、先ほど自動追加されたロールを確認してみます。②の「・・・ロールを表示」をクリックします。

⾃動的に作成される IAM ロールについて確認する

IAMダッシュボードが新しいシートに追加される。ポリシー名を展開します。

「{}JSON」ボタンをクリックして、ポリシーを確認。CloudWatchLogs にログを出力できるロールが付加されている。

Lambda 関数をテスト実⾏する

元のLambdaに戻って、テストイベントの名前に「Test」と付けて、「テスト」をクリック

テストが実行された。
「Hello from Lambda!」と出力され、CloudWatchLogs にログ出力されたことが分かる。

ログを出すようにプログラムを修正して保存する

●上記のLambdaの内容に、ログ出力の機能を追加する

AWSホームページのマニュアル確認
APIリファレンスを確認

コードを変更して、ログ出力するようにした。

もう1度、テスト実⾏する

Deployして、「Test」をクリック

イベントの内容が出力されている。
さらに、「モニタリング」からログを確認

ログの確認をする

最新のログをクリック
こちらからも同様のログを確認できる。(内容展開して詳しく見れる)

今回は、Lambda の単体で、ログ出力機能を試してみました。

次回は、AWSのAIサービスである Amazon Translate を組み合わせてみます。