何を作るか
- 翻訳API
- サーバーレスで実施
- API Gatewayでリクエストを受け付け、Lambdaを呼び出す
- Lambdaの中でTranslateを呼び出して翻訳結果を取得
- 翻訳結果をAPI Gatewayに返し、レスポンスとする
- 翻訳履歴をDynamoDBに保存
- サーバーレスで実施
なぜサーバーレスなのか
- ビジネスに直接はつながらないけどやらないといけないことを楽にする
- インフラのプロビジョニングや管理が不要
- 自動でスケール
- 高い可用性
- 価値に対する支払い
- サーバーを起動した時間ではなく、リクエストされた分だけ課金
- 自由度を取るならEC2、管理の手間の少なさを取るならLambda、中間を取るならContainer Services
AWS Lambdaの概要
AWS Lambdaとは
- サーバーのプロビジョニング/管理なしでプログラムを実行可能
- 開発者はコードを書くことにより集中できる
- リクエストベースの料金体系
- 実行回数 + 実行時間
- 「ハンドラ」で呼び出す関数を指定する
- デフォルトではlambda_function_lambda_handler
- AWS Lambdaで設定できる項目
- 確保するメモリの量
- 128MB ~ 3008MB
- CPU能力は確保するメモリの量に比例
- タイムアウト値
- 最大900秒
- 実行IAMロール
- 確保するメモリの量
イベントソースを呼び出しタイプ
- 非同期/同期呼び出し
- 呼び出し元のリソースによって変わる
- 例
- S3からLambdaを呼び出す場合、Lambdaへのリクエストが正常に受け付けられたかのみ返却
- API GatewayからLambdaを呼び出す場合、Lambdaの実行完了時にレスポンス返却
- 例
- 呼び出し元のリソースによって変わる
ライフサイクル
- Lambdaは呼び出されるとコンテナ上でプログラムが実行される
- コールドスタートとウォームスタート
- 利用可能なコンテナがない場合(初めて呼び出された時など)はコールドスタート = コンテナ生成処理
- コンテナを再利用できる場合はウォームスタート
- 1つのコンテナで同時に実行できるのは1つのリクエストまで
Lambdaを実際に触ってみる(単体)
- テンプレートもたくさん用意されている
- 他サービスへの送信先や他サービスからのトリガー元も追加できる
- メモリやタイムアウトの変更方法
- 設定→一般設定
- ロールについてはデフォルトにするとLogの権限が付いてくる
- テスト方法
- テスト
- イベントJSONからテストデータを指定可
- ログの記録方法
- 注意点
- コードを保存したら、「Deploy」を押下すること
- そうしないとコードを実行しても以前のものが反映される
- これで時間を溶かしたので戒め
- そうしないとコードを実行しても以前のものが反映される
- コードを保存したら、「Deploy」を押下すること
Lambdaを実際に触ってみる(他サービスと連携)
- AWS SDK for Python3(Boto3) のTranslateの使い方
- 設定→アクセス権限から、現在のLambdaに許可されている権限(ロール)を見ることができる
API Gatewayの概要
API Gatewayとは
- サーバーをプロビジョニング/管理することなくAPIを作成・管理できるマネージドサービス
- 可用性、スケーリング、APIキー管理等を任せられる
- REST APIとWebSocketに対応
- リクエストベースの料金体験
- 実行回数 + キャッシュメモリ量 + データ転送量
- まず、リソース(URLパス)×メソッド(GET、POST、DELETE…)を定める
- それぞれに対して、APIのフローを定義する
- フロー一覧
- メソッドリクエスト
- リクエストを受けたときに何をするか定義
- 認証設定
- 受け付けるクエリパラメーター
- 必須とするHTTPヘッダの設定
- リクエストを受けたときに何をするか定義
- 統合リクエスト
- バックエンドに渡す際どう変換するか
- XMLをJSONに変えたり
- プロキシ統合 = 変換せずにパススルーすることも可能
- バックエンドの種別を選択する
- Lambda
- HTTP
- Mock
- バックエンドとしてコンピューティングリソースを動かすのではなく、決まった値を返せるようにできる
- AWSサービス
- VPCリンク
- バックエンドに渡す際どう変換するか
- 統合バックエンド
- 裏側で処理を行うコンピューティングリソース
- 統合レスポンス
- メソッドレスポンス
- メソッドリクエスト
- フロー一覧
- それぞれに対して、APIのフローを定義する
- その他の機能
- バージョニング
- APIキーと使用料プラン
- ログとモニタリング
モックデータを返すAPIを作ってみる
- APIエンドポイントタイプのエッジ最適化を選ぶと、世界中で呼び出す要件を満たせる
- モックで固定データを返すときは「統合レスポンス」からマッピングテンプレートを選ぶ
- ステージした後、作成したAPIのパスのメソッドをクリックすると、URLが表示される
- API Gatewayで統合レスポンスを設定する方法
- Lambdaのテストのテンプレートで「API Gateway AWS Proxy」を選ぶと、どのようなヘッダーでリクエストをすればよいかがわかる
DynamoDBの概要
DynamoDBとは
- フルマネージド型のNoSQLデータサービス
- インストール作業不要
- 3つのAZに保存されるので信頼性高
- 性能要件に応じて、スループットキャパシティを定義する
- AutoScalingやオンデマンドキャパシティと言った設定も可能
- ストレージの容量制限なし
- 料金体系
- 設定したR/Wキャパシティユニット + ストレージ利用料 + オプション機能料金
DynamoDBの用語
- 主キー = Partition Key (+ Sort Key)
- アイテム(レコード)を登録していく
- 各アイテムはアトリビュート(カラム)を持つ
- 主キー以外のアトリビュートは不揃いであっても問題ない
- 2種類のSecondary Indexを利用できる
- Local Secondary Index
- Sort Key以外に絞り込み検索するKeyを持てる
- Global Secondary Index
- Partition Key属性の代わりとなる、Partition Keyをまたいで検索するためのインデックス
- Local Secondary Index
- キャパシティユニット
- Read
- 1ユニットにつき、最大4KBのデータを1秒に1回読み込み可能
- Write
- 1ユニットにつき、最大1KBのデータを1秒に1回書き込み可能
- 余裕をもって設定すべし
- 例:ピーク時は1KB以下のデータが秒間80回書き込まれる
- →Writeキャパシティは100にする
- 例:ピーク時は1KB以下のデータが秒間80回書き込まれる
- Read
Dynamo DBにおけるデータの操作方法
- HTTPベースのAPIで操作
- データ作成
- PutItem
- BatchWriteItem
- 更新
- UpdateItem
- 対象ItemのKeyを指定
- UpdateItem
- 単一データの取得
- GetItem
- 対象ItemのKeyを指定
- GetItem
- 複数データの取得
- Query
- 対象ItemのKeyを指定
- Scan
- テーブルまたはセカンダリインデックスの全てのアイテムを取得
- Query
- データ作成
テーブルを作ってみる
- PythonとDynamoDBの連携方法
- DynamoDBのテーブルのデータを見る方法
- テーブルアイテムの探索
その他重要事項
- Lambdaにコードを書く際、グローバルスコープに記述すると、コンテナが再利用された際(=ウォームスタート)に再利用される
- ローカルスコープの場合は再利用されない
- 例外処理も大事