概要
AWSにてWebAPIをサーバレスで構築するハンズオンです。
ハンズオンの内容
- AWSコンソールからAPIGatewayにてモックAPIを構築する
- AWSコンソールから手動でAPIGatewayとLambdaを構築する
- SAM(Serverless Application Model)により自動でAPIGatewayとLambdaを構築する
(※時間が足りれば)
事前準備
- AWSアカウント登録
- AWS CLIインストール
- SAM CLIインストール
AWSCLIのインストール
下記ページからWindowsのMSIをダウンロードして、インストールお願いします。
https://aws.amazon.com/jp/cli/
コマンドプロンプトにて下記コマンドを実行し、バージョンが表示されればOK
$ aws --version
aws-cli/1.16.212 Python/3.6.0 Windows/10 botocore/1.12.202
```
## SAMCLIのインストール
下記ページからWindowsのMSIをダウンロードして、インストールお願いします。
https://aws.amazon.com/jp/serverless/sam/
コマンドプロンプトにて下記コマンドを実行し、バージョンが表示されればOK
$ sam --version
SAM CLI, sam --version 0.19.0
# 1. AWSコンソールからAPIGatewayにてモックAPIを構築する

AWSマネジメントコンソールからログイン
https://console.aws.amazon.com/console/home
## [APIGateway]
### API作成
今すぐはじめるを選択
1. 「REST」を選択
2. 「新しいAPI」を選択
3. API名:"test"
4. エンドポイントタイプ:「リージョン」
5. APIの作成ボタン押下
### モデル作成
モデルを選択
1. 「作成」ボタン押下
2. モデル名:"user"
3. コンテンツタイプ:"application/json"
4. モデルのスキーマを下記の通り登録
{
"$schema" : "http://json-schema.org/draft-04/schema#",
"title" : "User Schema",
"type" : "object",
"properties" : {
"userId" : { "type" : "string" },
"userName" : { "type" : "string" }
}
}
### メソッド作成
GETメソッドを作成します。
1.「アクション」→「メソッド作成」
2. 「GET」を選択
3. 統合タイプ:Mock → 保存
### 統合レスポンス
1. メソッドレスポンスのステータス:200を選択
2. マッピングテンプレート:Content-Typeを"application/json"で登録。
3. テンプレートの生成で「User」を選択して下記の通り登録し、保存ボタン押下
set($inputRoot = $input.path('$'))
{
"userId" : "1",
"userName" : "test"
}
### テスト実行
レスポンス本文が下記の通りとなればOK
{
"userId": "1",
"userName": "test"
}
### デプロイ
アクション→APIのデプロイ
デプロイされるステージ:「新しいステージ」
ステージ名:dev
デプロイボタン押下
ステージ[dev]を選択
エクスポート:Swaggerの形式でエクスポート
### 補足
* Swagger+Postman拡張の形式でエクスポートすると、Postmanから簡単にAPIをコールできます。
* APIクライアント開発チームにAPIスキーマとモックAPIを提供することで、APIロジック実装との並行開発が可能になります。
# 2. AWSコンソールから手動でAPIGatewayとLambdaを構築

## [AWS Lambda]
### Lambda関数作成
1. サービスから「Lambda」を選択
2. 関数の作成ボタンを押下
3. 「一から作成」を選択
4. 関数名:"getUser"
5. ランタイム:「Python3.7」 ※言語はお好みで
6. 実行ロール:「基本的なLambdaアクセス権限でロールを作成」
7. 関数の作成ボタンを押下
### Lambda関数のテスト
1. テストボタン押下
2. イベント名:"test"
3. 作成ボタン押下
4. コードを編集
```Python
import json
def lambda_handler(event, context):
response = {
'userId': '1234567890',
'userName': 'hirata'
}
return {
'statusCode': 200,
'body': json.dumps(response)
}
ファイルを上書き(Ctrl+S)して、保存ボタン押下
テストボタン押下
実行結果の下記の通りに表示されたらOK
{
"statusCode": 200,
"body": "{\"userId\": \"1234567890\", \"userName\": \"hirata\"}"
}
[APIGateway]
APIGatewayからLambda関数を呼ぶ設定を行う
- サービスから「API Gateway」を選択
- 先程作成したAPI「test」を選択
- GETメソッド選択
- 統合リクエストを選択
- 統合タイプ:「Lambda 関数」に変更
- Lambdaプロキシ統合の仕様:OFF
- Lambdaリージョン:「ap-northeast-1」を選択
- Lambda関数:「getUser」を入力
- デフォルトタイムアウトの使用:ON
- 保存ボタン押下
APIテスト
APIGatewayのGETメソッドのテストを実行
下記のように結果が返ってこればLambda関数が呼ばれたことが確認できます。
[レスポンス本文]
{
"statusCode": 200,
"body": "{\"userId\": \"22872\", \"userName\": \"hirata\"}"
}
3. SAMにより自動でAPIGatewayとLambdaを構築
SAMとは
AWS サーバーレスアプリケーションモデル
https://aws.amazon.com/jp/serverless/sam/
サーバーレスアプリケーション構築用のオープンソースフレームワーク
準備
IAMユーザー作成
AWSマネジメントコンソールにログイン
- サービスから「IAM」を選択
- ユーザーを選択
- 「ユーザーを追加」ボタン押下
- ユーザー名:"SAM"
- アクセスの種類:「プログラムによるアクセス」を選択 → 「次のステップ」ボタン押下
- 「既存のポリシーを直接アタッチ」を選択
- 「AWSCloudFormationFullAccess」「AWSLambdaFullAccess 」「AmazonAPIGatewayAdministrator」「IAMFullAccess」を検索してチェック→「次のステップ」ボタン押下
※
- そのまま「次のステップ」ボタン押下
- そのまま「ユーザーの作成」ボタン押下
- 作成完了画面にて「.CSVのダウンロード」ボタンを押下(後で利用するので大事に保管してください)
※本来は必要最低限の権限を付与しますがハンズオンのため割愛
S3バケット作成(sam-deploy-test-{社員番号})
- サービスから「S3」を選択
- 「バケットを作成する」ボタン押下
- バケット名:"sam-deploy-test-{社員番号}"
※
→ 次へボタン押下 - オプションの設定:そのまま次へボタン押下
- アクセス許可の設定:そのまま次へボタン押下
- 確認:「バケットを作成」ボタン押下
※同じ名前のバケットを作成できないため
ローカル環境にAWS認証情報設定
ローカル環境のコマンドプロンプトにて下記コマンド実行
先程ダウンロードしたCSVを確認してアクセスキーとシークレットキーを入力
$ aws configure
AWS Access Key ID [None]: {Access key ID}
AWS Secret Access Key [None]: {Secret Access Key}
Default region name [None]: ap-northeast-1
Default output format [None]: json
SAM実行
プロジェクト作成
$ sam init --runtime python3.7 --name test
作成されたtestフォルダに移動
testフォルダの中身を確認
hello_world ←ここにLambdaで実行するソースファイルが入っています
tests
.gitignore
event.json
README.md
template.yaml ←SAMテンプレート
デプロイパッケージ作成
$ sam package --s3-bucket sam-deploy-test-{社員番号} --output-template-file packaged.yaml --no-verify
・・・
Successfully packaged artifacts and wrote output template to file packaged.yaml.
package.yamlファイルが作成され、S3に「sam-deploy-test-{社員番号}」のバケットとその中にデプロイ用のファイルがアップロードされます。
※プロキシ経由の場合は下記実行しておく
SET HTTPS_PROXY=http://{ユーザー}:{パス}@{ホスト}:{ポート}
デプロイ
$ sam deploy --template-file packaged.yaml --stack-name api --no-verify --capabilities CAPABILITY_IAM
・・・・
Successfully created/updated stack - api
デプロイは、WEBコンソールのCloudformation画面からも可能です。
確認
スタック作成結果は、コンソールのCloudformation画面にて確認
APIGatewayのAPI、Lambda関数が作成されているのを確認
最後はお片付けとして、コンソールのCloudformation画面にてスタック削除することで、作成されたAPIとLambdaが削除されます。