- Published on
AWS Serverless についてのLinkまとめとTips
- Authors
- Name
- Kikusan
- Securing your AWS Account - Understanding IAM
- API Gateway
- APIの作成
- 使用量プラン と API key
- カスタムドメイン
- オーソライザー
- モデル
- ドキュメント
- リソースポリシー
- API Gatewayのベストプラクティス
- Lambda
- Lambdaのレイヤ作成方法
- Lambdaのベストプラクティス
- DynamoDB
- DynamoDBのベストプラクティス
- Cognito
- S3
- CloudFront
- Route53
- SAM
- その他
- サーバーレスセキュリティのベストプラクティス
Securing your AWS Account - Understanding IAM
=> https://youtu.be/9CKsX6MOPDQ
- Getting Started with AWS: https://aws.amazon.com/getting-started/?nc2=h_l2_cc
- AWS Overview: https://aws.amazon.com/
- What is Cloud Computing? => https://aws.amazon.com/what-is-cloud-computing/?nc2=h_l2_cc
- Information about the Infrastructure AWS offers: https://aws.amazon.com/about-aws/global-infrastructure/?nc2=h_l2_cc
- Understanding Regions & Availability Zones (that dropown on the top right!): http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions
- The Pricing of AWS (and the Free Tier): https://aws.amazon.com/pricing/?nc2=h_ql_ny_livestream_blu
- AWS Cloud Security: https://aws.amazon.com/security/
- Securing AWS with IAM: https://aws.amazon.com/iam/?nc2=h_l3_dmhttps://aws.amazon.com/iam/?nc2=h_l3_dm
API Gateway
- API Gateway Overview: https://aws.amazon.com/api-gateway/
- API Gateway Developer Documentation: https://aws.amazon.com/documentation/apigateway/
- API Gateway Fee: https://aws.amazon.com/api-gateway/pricing/
APIの作成
- Rest APIの作成 : ここで / リソースができている
- 既存のAPIからコピー、Swaggerからインポートができる
- リソースの作成 : pathの作成のこと
- プロキシリソース : サブリソースへのアクセスのときも全て受信する。プロキシ関数はresponse bodyを返せないが、サブリソースに関してlambda関数からresponseヘッダーを返すことができる。
- CORS : 他のドメインからのjsでのアクセスを許可する.OPTIONSメソッドが生成される。chromeは自動でこのメソッドも追加で呼ぶ。統合レスポンスに必要なパラメータが入っている。
- {name}で囲った path は event['name'] として送信される。ex) /{data}/
- メソッドの作成 : http methodのこと
- 統合タイプ : どこに値を送信するか
- メソッドの実行
- メソッドリクエスト : 認可と受信可能パラメータを設定
- 認可
- リクエストの検証 : 設定することで異なるパラメータの場合、rejectできる
- APIキーの必要性
- クエリパラメータ
- ヘッダー
- リクエストボディ : modelを使える
- 統合リクエスト : 受け取ったデータをどう変換して連携サービスに送信するかを設定
- マッピングテンプレート : 設定するとリクエストボディを好きなtemplate に変形できる. modelから自動生成できる
- メソッドレスポンス : レスポンスデータを設定api-gateway-mapping-template-reference.html#input-variable-reference)
- 統合レスポンス : 設定したメソッドレスポンスに応じて、返信する値を決める。
- マッピングテンプレート : 設定するとレスポンスボディを好きなtemplate に変形できる. modelから自動生成できる
- メソッドリクエスト : 認可と受信可能パラメータを設定
- APIのデプロイ : ステージを決めてメソッドをデプロイする
- ステージからはSwagger+APIGatewayの形式でエクスポートできる
使用量プラン と API key
API key タブから作成可能。
使用量プランと合わせてアクセスを制限できる。
x-api-keyヘッダーにキー文字列を設定することでアクセス制御する。
カスタムドメイン
ACM(aws certifivate manager)を介して証明書を利用することで、自分のドメインを利用できるようになる。
オーソライザー
認証をするLambda関数を作成するか、Cognitoを使ってアクセス制御ができる。(MethodRequestとオーソライザーに設定が必要)
- トークンのソース: lambdaで受け取る値。authorizationTokenとすれば、event.authorizationTokenで取得できる。
Lambda関数を使用する場合はリクエストにAuthorizationヘッダにtokenを入れて送信し、検証する。
Cognitoを使用する場合はクライアントでCognitoからtokenを取得し、それをAuthorizationヘッダに入れて送信する。(Lambdaではtokenからuserを検索して処理する)
モデル
リクエスト本文で使えるmodelをjson scheme形式で定義しておくことができる
ドキュメント
開発者向けのAPIドキュメントを追加する
リソースポリシー
アクセス制御ができる
API Gatewayのベストプラクティス
- ロジックはLambdaに任せてなるべくスリムにすること。
- コンテンツ検証とスキーマ検証は入れたほうがいい。余計な処理をしなくて済む。
- カスタムドメイン名を使用し同じURLを保つこと。
Lambda
- AWS Lambda Overview: https://aws.amazon.com/lambda/
- AWS Lambda Developer Documentation: http://docs.aws.amazon.com/lambda/latest/dg/welcome.html
- pricing: https://aws.amazon.com/lambda/pricing/
Lambda関数は呼び出される度にbuildされているわけではないので、
AWSリソースの使用はハンドラー関数の外に出しておくと、トラフィックを少し軽減することができる。
Lambda関数からLambda関数を呼ぶこともできる。
AWS Step Functionsを使うと、関数同士をワークフローのように繋ぐこともできる。
LambdaでExpressを実行してAPIではなくアプリケーションにすることも一応できる。やるとは言ってないけど。
上部メニューからLambdaAliasを作成すると、バージョン指定、最新バージョン指定ができ、これを利用してAPI Gatewayから関数を指定するときそのエイリアスを選択できる。
ex) FuncName -> FuncName:AliasName
Lambdaのレイヤ作成方法
Amazon Linux の環境でインストールしたモジュールを使わないとエラーが発生することがある。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
├── requirements.txt
└── python/
上記のフォルダに移動し、以下コマンドを実行する。
# windows PS の場合
docker run -v ${PWD}:/var/task public.ecr.aws/sam/build-python3.8 /bin/sh -c "pip install -r requirements.txt -t python/; exit"
# windowsはGUIでpythonフォルダを選択してzip化
# MACやLinuxの場合
docker run -v $PWD:/var/task public.ecr.aws/sam/build-python3.8 /bin/sh -c "pip install -r requirements.txt -t python/; exit"
zip -r upload.zip python/
Lambdaのベストプラクティス
- 再利用されるオブジェクトはハンドラーの外で宣言すること。Lambdaがコンテナを再利用するときにオブジェクトも再利用してくれる。
- コアロジックはハンドラーとは別に保持すること。長期的に保守しやすくなる。
- 定数ではなく環境変数を利用すること。
- 同じトリガーでもラムダ関数はタスクごとに分けること。
- /tmpやストレージを利用する場合は、必ずプログラム内でクローズすること。
DynamoDB
- DynamoDB: https://aws.amazon.com/dynamodb/
- Documenation: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html
- pricing: https://aws.amazon.com/dynamodb/pricing/
key-value型のDBであり、フルマネージドでスケーリングできる。
key = PrimaryKey, value = Attribute に相当する。
PrimaryKeyはさらにPartitionKeyとSortKeyに分け複合キーにすることができる。
PartitionKeyによって内部的に保存されるデータの場所が分散されるので、なるべくバラバラにしたほうが検索が早くなる。ex) partition=userid, sort=timestamp
他のキーでもセカンダリインデックスによって検索できるが、基本的にはおすすめされない。テーブルの結合はできず、データの更新は不得意。
Lambda SDK からput, get, deleteができる。updateはおすすめされない。
scanで全検索できるが、1MBまでしか取得できないので、最終検索keyをつかって繰り返し取り出す操作が必要になる。
DynamoDBのベストプラクティス
- パーティションキー毎のアクセスがなるべく均一になるようにテーブル設計すること。 不均一だとスループットにも料金にも悪影響が出る。
- スケールアップするときは小出しに。大幅にすると、アクセスの関係でスループットが低下する。
- 属性名は短く。大きなデータの格納は、S3のポインタの格納を検討する。
- スキャンはなるべく行わないこと。
- 強い整合性を求められる場合はRDBを使用すること。
- セカンダリインデックスは慎重に採用すること。採用しても、できるだけ少ない属性で利用すること。
Cognito
- Overview: https://aws.amazon.com/cognito/
- Cognito User Pools Developer Guide: http://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html
- pricing: https://aws.amazon.com/cognito/pricing/
Cognitoはそれぞれのプラットフォームからの認証のSDKを配布している
基本的に認証に必要な以下のデータをsdkから送信する。
- UserPoolId
- ClientId: アプリクライアントID(userpoolで追加する)
- username, password, その他必須としたデータ(email)
S3
- AWS S3 Overview: https://aws.amazon.com/s3/
- AWS S3 Developer Guide: ^http://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html
- AWS S3 Permissions: http://docs.aws.amazon.com/AmazonS3/latest/dev/s3-access-control.html
- AWS S3 Static Website Hosting: http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html
- AWS S3 Pricing: https://aws.amazon.com/s3/pricing/
CloudFront
- AWS CloudFront Overview: https://aws.amazon.com/cloudfront/
- AWS CloudFront Developer Guides: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html
- AWS CloudFront Pricing: https://aws.amazon.com/cloudfront/pricing/
AWSリソース内の指定URLへのアクセスについて、
AWSの拠点の中でユーザに最も近いところにwebページデータをキャッシュし、高速化する。
何をキャッシュするかを細かく設定できる。 独自ドメインを代替ドメインとして利用することもできる
Route53
- AWS Route53 Overview: https://aws.amazon.com/route53/
- AWS Route53 Developer Guide: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html
- AWS Route53 Pricing: https://aws.amazon.com/route53/pricing/
- AWS Route53 - Registering a Domain: http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html
SAM
- Serverless Framework Website: https://serverless.com/
- AWS Getting Started Guide (with Serverless Framework): https://serverless.com/framework/docs/providers/aws/guide/quick-start/
- Managing AWS Credentials (for using the Serverless Framework): https://serverless.com/framework/docs/providers/aws/guide/credentials/
- Serverless Framework on Github: https://github.com/serverless/serverless
- SAM Github Page: https://github.com/awslabs/serverless-application-model
- Using SAM: https://github.com/awslabs/serverless-application-model/blob/master/HOWTO.md
- Deploying Lambda Functions (with SAM and even automated!): http://docs.aws.amazon.com/lambda/latest/dg/deploying-lambda-apps.html
その他
- localstack Github page (including setup instructions): https://github.com/atlassian/localstack
- AWS SNS: https://aws.amazon.com/sns/
- AWS SES: https://aws.amazon.com/ses/
- AWS SQS: https://aws.amazon.com/sqs/
- AWS Step Functions: https://aws.amazon.com/step-functions/
- AWS Kinesis: https://aws.amazon.com/kinesis/
- AWS CloudWatch: https://aws.amazon.com/cloudwatch/
- AWS CodeBuild: https://aws.amazon.com/codebuild/
サーバーレスセキュリティのベストプラクティス
- 権限設定は小分けすること。読取だけで良いはずなのに、書き込みをしてしまうエラーを防ぐことができる。
- トークンは環境変数を使用すること。 必要に応じてKMSを使用してデータを暗号化すること。
- 基本的にサーバレスはマネージドだが、一つのプロバイダー(AWS)に依存しない取り組み「Event Gateway」が出てきている。