はじめに
AWS認定デベロッパーアソシエイト取得に向けた学習ログです。
学習期間
2020年6月22日~6月28日
学習ログ
数千人が同時に利用するセッション管理
- ユーザのセションデータをメモリに保存
- ユーザ数が急増するとCPU使用率の上昇により処理が遅くなる
- 高速化して、処理が止まらないようにレプリケーションしたい
- 解決策
- ElastiCache Redisを使用する
- DynamoDBもセッションデータ保持は可能だが、インメモリDBの高速処理はRedisが最適
- Memcachedはレプリケーションできない
- ElastiCache Redisを使用する
RDS MySQLが応答しない場合のログ取得方法
- SQLステートメントのログ情報を確認したい
- 解決策
- RDSのスロークエリログを有効にする
- Defaultでは無効になっている
- パラメータグループから有効化する
log_output
long_query_time
min_examined_row_limit
- 参考 rfs.jp
- RDSのスロークエリログを有効にする
- MySQLのログの種類
- 一般ログ
- エラーログ
- スロークエリログ
1分に1000Request受信、1Request完了に100秒かかるLambdaの対策
- Lambdaの同時実行数は1000まで
- Lambdaの同時実行数の計測
- 1秒あたりの呼び出し数×平均実行時間(秒)
- 16.6回×100秒
- 1660
- 同時実行1000を超える
- 解決策
- AWSに上限緩和の申請を行う
DynamoDBテーブルへの新しいエントリを検出してLambdaによってデータを検証する
- 解決策
- 2つある
- DynamoDBストリームを有効化+DynamoDBにLambdaトリガーを設定する
- Lambda側で、DynamoDBストリームのARNを関連付ける
- 2つある
LambdaをS3に自動デプロイ
- 解決策
sam package
sam deploy
CodePipelineでコードがコミットされた後はデプロイ前にコードレビューするパイプラインを組みたい
- 解決策
- SNSを利用した手動の承認プロセスを設定する
- Lambda経由でSlack通知などもできる
- SNSを利用した手動の承認プロセスを設定する
- 参考 dev.classmethod.jp
ECSでホストするアプリのDB接続情報を暗号化して定期的にローテションしたい
- 解決策
- AWS Secrets Managerで資格情報を保持して、AWS KMSで暗号化する
- Secrets Managerでローテーションする
- コンテナに設定する環境変数の名前と、機密データをSecrets ManagerシークレットのARNで管理する
- AWS Secrets Managerで資格情報を保持して、AWS KMSで暗号化する
- 参考 docs.aws.amazon.com
arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id
DynamoDBのキャパシティユニットの計算
- 要件
- 1秒間に30回の書き込み
- 1秒間に20回の結果整合性がある読み込み
- 両方の操作で1つのアイテムのサイズは4KB
- 書き込みキャパシティユニット(WCU)の計算
- 最大サイズ1KBの項目
- 1秒間に1回の書き込み
- 30WCU必要
- 1秒間に1回の書き込み
- 最大サイズ1KBの項目
- 読み込みキャパシティユニット(RCU)の計算
- 最大サイズ4KB
- 1秒間に1回の強い結果整合性のある読み込み
- 1秒間に2回の結果整合性のある読み込み
- 10RCU必要
- 最大サイズ4KB
CodeBuildでビルド出力アーティファクトを暗号化したい
- pintrapi.ymlでビルドコマンドを設定
- 解決方法
- AWS KMSのカスタマーマスターキー(CMK)を指定する
- デフォルトでは、S3にあるAWS Managed CMKを使用する
- 参考 docs.aws.amazon.com
CodePipelineとCodeBuildにより、DockerイメージをビルドしてECRにプッシュした際に認証エラーが発生する
- 解決方法
- CodeBuildのIAMアクセス許可が間違っている
- CodeBuild側にIAMによるECRに対するアクセス許可が必要
- CodeBuildのIAMアクセス許可が間違っている
コードを変更せずにLambda関数のパフォーマンスを上げる方法
- 解決方法
- Lambda関数に割り当てられたメモリを増加させる
- 128MB~3008MBまで
- Lambda関数に割り当てられたメモリを増加させる
Dockerコンテナを実行するタスクエージェント構成において、ECSにIAMロールを許可する設定
- 解決方法
ECS_ENABLE_TASK_IAM_ROLE=True
に設定する- デフォルト値は
false
- ECSにIAMロールを許可する設定 docs.aws.amazon.com
CloudFormationのテンプレートをすべて削除する
- 構成
- stak1
- stak2,3から参照される
- VPC,subnetなどを構成
- stak2
- stak3のセキュリティグループを使用している
- stak3
- stak1
- 解決方法
- 以下の順番で削除
- stak2を削除
- stak3を削除
- stak1を削除
- 以下の順番で削除
適切なX-Rayのサンプリングルール設定方法
- 構成
- BeanstalkでNode.jsアプリケーションを構築
- 1秒間に300Request処理
- 結果はDynamoDBに格納
- 要件
- トラブルシューティングにX-Rayを使う
- リザーバーが使い果たされた後に一致するRequestの割合でX-Rayのサンプリング実施
- 1秒あたり260Requestをサンプリング
- X-Rayとは?
- アプリケーションが処理するRequestに関するデータを収集するサービス
- 参考 docs.aws.amazon.com
- 1秒あたり1Requestがリザーバ
- デフォルトでは、1秒毎に最初のRequestと、追加リクエストの5%を記録する
- 5%は固定レート
- 解決方法
- サンプリングRequest=リザーバサイズ+(1秒あたりの着信Request-リザーバサイズ) * 固定レート
- 260 = x + (300 - x ) * y
- 250 + (300 - 250) * 0.2
- 260Request
- サンプリングルール構成で、リザーバサイズを250、固定レートを20%に設定する
Lambdaのパフォーマンス低下の根本原因
- 構成
- Lambda+S3
- ユーザデータ更新 -> Lambda -> DynamoDB更新
- 過去データ -> Lambda -> S3
- ALBで分散
- Lambda1
- Lambda2
- Lambda+S3
- 発生した問題
- 分散が機能しない
- ピーク時に処理パフォーマンスが不均衡
- Lambda2だけパフォーマンス低下
- 根本原因
- Lambda1に提供される同時実行数が、Lambda2より大幅に多いため