AWSサーバレスアーキテクチャーNo1:Lambda
AWSのホームページの初心者ハンズオンにある「サーバーレスアーキテクチャで翻訳 Web API を構築する 」の内容を自分のAWSアカウントでやってみました。
ハンズオンではAWSホームページで、10本の Youtube-video でもって、Serverless構成の基本を、実際の操作の様子で確認することができます。
今回の投稿では、この中から、以下の内容で6パートに分けてあげようと思っています。
- まず手始めに、AWS Lambda を単体で動かして見る。ファンクションとしてはログを出力するだけ
- 上記①の内容で、Amazon Translate を呼びだして、日本語を英語に翻訳してみます。
- Amazon API Gateway の Mock 機能を利用し、固定の JSON を返す Web API を作成してみます。
- Amazon API Gateway と AWS Lambda を連携して、上記②の日本語を英語に翻訳する Web API を構成してみます。
- Serverless構成でよく構成要素になるAmazon DynamoDB をセットアップしてみます。
- これまでの要素全取りの「API-GW+Lambda+DynamoDB」構成で動かして見ます。
ざっくりと基本構成を図で表してみて、最後まで行くと以下のような構成になります。
今回の投稿は、この構成の中から、Lambda のみ動かします。
サーバーレスアーキテクチャーについては、その有効性が巷で話題となり、試してみたかったのですが、(一番最初から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の内容に、ログ出力の機能を追加する
コードを変更して、ログ出力するようにした。
もう1度、テスト実⾏する
Deployして、「Test」をクリック
ログの確認をする
今回は、Lambda の単体で、ログ出力機能を試してみました。
次回は、AWSのAIサービスである Amazon Translate を組み合わせてみます。