Published on

AWS Serverless についてのLinkまとめとTips

Authors
  • avatar
    Name
    Kikusan
    Twitter

Securing your AWS Account - Understanding IAM

=> https://youtu.be/9CKsX6MOPDQ

API Gateway

APIの作成

  1. Rest APIの作成 : ここで / リソースができている
    • 既存のAPIからコピー、Swaggerからインポートができる
  2. リソースの作成 : pathの作成のこと
    • プロキシリソース : サブリソースへのアクセスのときも全て受信する。プロキシ関数はresponse bodyを返せないが、サブリソースに関してlambda関数からresponseヘッダーを返すことができる。
    • CORS : 他のドメインからのjsでのアクセスを許可する.OPTIONSメソッドが生成される。chromeは自動でこのメソッドも追加で呼ぶ。統合レスポンスに必要なパラメータが入っている。
    • {name}で囲った path は event['name'] として送信される。ex) /{data}/
  3. メソッドの作成 : http methodのこと
  • 統合タイプ : どこに値を送信するか
  • メソッドの実行
    • メソッドリクエスト : 認可と受信可能パラメータを設定
      • 認可
      • リクエストの検証 : 設定することで異なるパラメータの場合、rejectできる
      • APIキーの必要性
      • クエリパラメータ
      • ヘッダー
      • リクエストボディ : modelを使える
    • 統合リクエスト : 受け取ったデータをどう変換して連携サービスに送信するかを設定
      • マッピングテンプレート : 設定するとリクエストボディを好きなtemplate に変形できる. modelから自動生成できる
    • メソッドレスポンス : レスポンスデータを設定api-gateway-mapping-template-reference.html#input-variable-reference)
    • 統合レスポンス : 設定したメソッドレスポンスに応じて、返信する値を決める。
      • マッピングテンプレート : 設定するとレスポンスボディを好きなtemplate に変形できる. modelから自動生成できる
  1. 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

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

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

Cognitoはそれぞれのプラットフォームからの認証のSDKを配布している

基本的に認証に必要な以下のデータをsdkから送信する。

  • UserPoolId
  • ClientId: アプリクライアントID(userpoolで追加する)
  • username, password, その他必須としたデータ(email)

S3

CloudFront

AWSリソース内の指定URLへのアクセスについて、
AWSの拠点の中でユーザに最も近いところにwebページデータをキャッシュし、高速化する。
何をキャッシュするかを細かく設定できる。 独自ドメインを代替ドメインとして利用することもできる

Route53

SAM

その他

サーバーレスセキュリティのベストプラクティス

  • 権限設定は小分けすること。読取だけで良いはずなのに、書き込みをしてしまうエラーを防ぐことができる。
  • トークンは環境変数を使用すること。 必要に応じてKMSを使用してデータを暗号化すること。
  • 基本的にサーバレスはマネージドだが、一つのプロバイダー(AWS)に依存しない取り組み「Event Gateway」が出てきている。