紙一重の積み重ね

アラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【AWS学習】育児の合間に認定デベロッパーアソシエイト学習②

f:id:yokoyantech:20200621160338p:plain

はじめに

AWS認定デベロッパーアソシエイト取得に向けた学習ログです。

学習期間

2020年6月22日~6月28日

学習ログ

数千人が同時に利用するセッション管理

  • ユーザのセションデータをメモリに保存
  • ユーザ数が急増するとCPU使用率の上昇により処理が遅くなる
  • 高速化して、処理が止まらないようにレプリケーションしたい
  • 解決策
    • ElastiCache Redisを使用する
      • DynamoDBもセッションデータ保持は可能だが、インメモリDBの高速処理はRedisが最適
      • Memcachedはレプリケーションできない

RDS MySQLが応答しない場合のログ取得方法

  • SQLステートメントのログ情報を確認したい
  • 解決策
    • RDSのスロークエリログを有効にする
      • Defaultでは無効になっている
      • パラメータグループから有効化する
        • log_output
        • long_query_time
        • min_examined_row_limit
      • 参考 rfs.jp
  • 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を関連付ける

LambdaをS3に自動デプロイ

  • 解決策
    • sam package
    • sam deploy

CodePipelineでコードがコミットされた後はデプロイ前にコードレビューするパイプラインを組みたい

  • 解決策
    • SNSを利用した手動の承認プロセスを設定する
      • Lambda経由でSlack通知などもできる
  • 参考 dev.classmethod.jp

ECSでホストするアプリのDB接続情報を暗号化して定期的にローテションしたい

  • 解決策
    • AWS Secrets Managerで資格情報を保持して、AWS KMSで暗号化する
      • Secrets Managerでローテーションする
    • コンテナに設定する環境変数の名前と、機密データをSecrets ManagerシークレットのARNで管理する
  • 参考 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必要
  • 読み込みキャパシティユニット(RCU)の計算
    • 最大サイズ4KB
      • 1秒間に1回の強い結果整合性のある読み込み
      • 1秒間に2回の結果整合性のある読み込み
        • 10RCU必要

CodeBuildでビルド出力アーティファクトを暗号化したい

  • pintrapi.ymlでビルドコマンドを設定
  • 解決方法
    • AWS KMSのカスタマーマスターキー(CMK)を指定する
    • デフォルトでは、S3にあるAWS Managed CMKを使用する
  • 参考 docs.aws.amazon.com

CodePipelineとCodeBuildにより、DockerイメージをビルドしてECRにプッシュした際に認証エラーが発生する

  • 解決方法
    • CodeBuildのIAMアクセス許可が間違っている
      • CodeBuild側にIAMによるECRに対するアクセス許可が必要

コードを変更せずにLambda関数のパフォーマンスを上げる方法

  • 解決方法
    • Lambda関数に割り当てられたメモリを増加させる
      • 128MB~3008MBまで

Dockerコンテナを実行するタスクエージェント構成において、ECSにIAMロールを許可する設定

  • 解決方法
    • ECS_ENABLE_TASK_IAM_ROLE=Trueに設定する
    • デフォルト値はfalse

CloudFormationのテンプレートをすべて削除する

  • 構成
    • stak1
      • stak2,3から参照される
      • VPC,subnetなどを構成
    • stak2
      • stak3のセキュリティグループを使用している
    • stak3
  • 解決方法
    • 以下の順番で削除
      • 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
  • 発生した問題
    • 分散が機能しない
    • ピーク時に処理パフォーマンスが不均衡
    • Lambda2だけパフォーマンス低下
  • 根本原因
    • Lambda1に提供される同時実行数が、Lambda2より大幅に多いため