紙一重の積み重ね

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

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

f:id:yokoyantech:20200621160338p:plain

はじめに

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

学習期間

2020年8月3日~8月9日

学習ログ

リソースの供給と需要を適切に一致させる拡張性の高いアーキテクチャ

  • 要件
    • 以下が必要
    • 1つのDB
    • 1つのサーバ
  • 実現方法
    • DynamoDBのオートスケーリング
      • 負荷に応じて、write capacity unitsと、read capacity unitsのスループットを上下できる
      • 参考
    • EC2フリート
      • EC2 fleet(EC2の艦隊)
      • Spot fleetとは、Spotインスタンスの買い方の1つ
      • これくらいのメモリ、インスタンスサイズ、価格、という条件を指定しておくと、AWSがSpotインスタンスの価格を監視する
        • 条件にあったEC2を見つけて起動
        • 使いたい価格より高くなったEC2は自動で破棄してくれる
    • EC2フリート+AutoScaling
      • EC2、ECS、SQSのメトリクスと連動できる
        • EC2のCPU使用率に基づいて、EC2の数を自動で上下
      • 参考
  • 注意点
    • RDSのAutoScalingは適さない
      • RDS Storage Auto Scaling
      • データ容量を増大させる仕組みであり、パフォーマンスをスケーリングするものではない
      • 参考

AWS Certificate Managerが利用できない場合にSSL/TLS証明書を安全にインポートする

  • ACMがサポートされているリージョン
    • ACMを使って、SSL/TLS証明書を入れる
  • ACMがサポートされていないリージョン
    • IAMを利用する
      • 証明書マネージャーとして利用できる
# 証明書のアップロード
$ aws iam upload-server-certificate --server-certificate-name ExampleCA --certificate-body file://Certificate.pem --certificate-chain file://CertificateChain.pem --private-key file://PrivateKey.pem

# アップロードした証明書の表示
$ aws iam list-server-certificates

aws.amazon.com

非同期実行するLambda関数が失敗したときの設定

  • Lambda関数
    • DeadLetterConfigパラメータを設定する
      • SQSのARNを指定する
      • Lambda関数が失敗した場合、SQSキューに送信する前に、Lambda関数を2回再試行することができる
      • 非同期呼び出しが3回とも失敗した場合、SQSキュー、SNSトピックにイベント送信できる
      • DeadLetterQueueを指定しない関数は、イベントを破棄する
"DeadLetterConfig": {
  "TargetArn": "arn:aws:sns:us-east-2:123456789012:failed-lambda"
}

dev.classmethod.jp

SQSメッセージを指定された期間、コンシューマーに見せないようにする設定

  • 遅延キュー を使う
    • キューへの新しいメッセージ配信を数秒延期できる
      • デフォルト遅延は0秒
      • 最大15分
  • 類似した機能
    • 遅延キュー
      • メッセージが最初にキューに追加されたときに非表示になる
    • 可視性タイムアウト
      • メッセージがキューから処理された後のみ非表示になる

docs.aws.amazon.com

EC2とDynamoDBによるモバイルゲームで、複数モバイルデバイス間でのユーザプロファイルデータを同期したい

  • AWS AppSync を使う
    • アプリケーション関連のユーザーデータのデバイス間同期ができる
    • Cognito Syncでも可能だが、現在は、AppSyncの利用が推奨されている

Amazon Cognito Sync を初めて使用する場合は、AWS AppSync を使用してください。AWS AppSync は、Amazon Cognito Sync のように、デバイス間でアプリケーションデータを同期するための新しいサービスです。

docs.aws.amazon.com

  • AppSyncとは
    • サーバレスの形で、GraphQLのバックエンドを実装できるサービス

dev.classmethod.jp

EC2インスタンスのCPU使用率とメモリ使用率を10秒間隔で把握したい

  • 実現方法
    • CloudWatchのカスタムメトリクスを設定し、高解像度で保存する
  • 仕様
    • CloudWatchのカスタムメトリクス
      • EC2の内部情報は標準では取得できない
        • メモリ利用率
      • 標準解像度
        • 1分間隔でメトリクスを保存(昔は5分間隔だった)
      • 高解像度
        • 1秒間隔でメトリクスが保存できる
        • 1,5,10,30または60秒の倍数で設定できる
          • 1秒に設定
            • 3時間利用可能
          • 60秒に設定
            • 15日利用可能

CloudFormationに依存してリソースをプロビジョニングしているサービス

  • AWS Elastic Beanstalk
    • CloudFormationで環境を作成している
  • AWS Step Functions
    • 同上

CodeCommitの変更に反応するルールを設定できるAWSサービス

  • コードの変更を定期的にCodeCommitにマージ
    • CloudWatchイベントを使用する
      • CodeCommitの変更をトリガーに、何らかのアクションを実行できるようになる
      • CodeCommitのパイプラインなど
  • 例)
    • masterブランチを含む、mytestRepoリポジトリのCodeCommitイベントパターン
{
  "source"; [
    "aws.codecommit"
  ],
  "detail-type": [
    "CodeCommit Repository State Change"
  ],
  "resources": [
    "arn:aws:codecommit:us-east-2:1234567890example:mytestRepo"
  ],
  "detail": [
    "referrenceType": [
      "branch"
    ],
    "referenceName": [
      "master"
    ]
  ]
}

docs.aws.amazon.com

SQSキュー内で指定されたメッセージを削除する仕組み

  • PurgeQueueを使用する
    • キュー内のメッセージを全部消すことができる!
    • SQSキューを削除せずに、キュー内のメッセージをすべて削除できる

docs.aws.amazon.com

  • SQSキューそのものを削除する場合は、Delete Queueを使用する

docs.aws.amazon.com

DynamoDBのデータアクセスが不均等かつ、特定のパーティションに大容量の読み書きトラフィックが発生した際の対処法

  • 対処法1
    • エラーの再試行と指数バックオフ(Exponential Backoff)を実装する
      • 指数バックオフ
        • 言葉の意味
          • Expornential(指数関数的)
          • Backoff(後ずさりする)
        • アプリケーションのリトライ間隔を指数関数的に後退させるアルゴリズムのこと
        • 指数バックオフを実装することで、一時的にリソース超過したリクエストが来ても、特定のスロットリング機構なしで、リクエストを処理できる

docs.aws.amazon.com

  • 対処法2
    • I/Oリクエストを均等に分散するリファクタリングを実施する
      • ホットパーティションが発生しないように、キーを見直す

API gatewayで作成したPublic APIを公開する設定

  • API Gateway 使用量プラン を使う
    • つながりやすさを、APIキー毎に設定できるようになる

dev.classmethod.jp

CloudFormationのパラメータ設定セクション

  • Parametersセクションにて設定する
    • AWS::EC2::KeyPair::KeyName
    • AWS::EC2::AvailabilityZone::Name
    • AWS::EC2::Instance::Id
      • などが指定できる
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "hogehogefugafuga",
  "Parameters": {
    "AZ": {
      "Description": "Input AZ",
      "Type": "AWS::EC2::AvailabilityZone::Name",
      "Default": "ap-northeast-1"
    }
  },
  "Resources":{
    //作成するリソースを記述
  }
}

dev.classmethod.jp

  • Conditionsセクションは、リソースを作成するかどうかを判断する。if文の条件式みたいなもの。
"Conditions": {
  "IsProduction": { "Fn::Equals" : [ { "Ref" : "ENV"}, "production" ] }
}

dev.classmethod.jp

Elastic Beanstalkのコスト最適化

  • 要件
    • DBにRDSを使用
      • 再利用したい
    • セッション管理にElasti Casheを使用
      • デプロイ毎にユーザーセッションデータを再作成
  • 実現方法
    • RDSは外部で定義して、環境変数で参照する
    • ElastiCasheは、.ebextensions/で定義する

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-environment-resources-elasticache.html/#customize-environment-resources-elasticache-defaultvpcdocs.aws.amazon.com

REST APIAPI Gatewayの統合タイプ

  • 要件
    • VPCの背後にあるWEBサーバとの連携がしたい
      • REST APIでアクセスしたい
    • WEBサーバをカスタムデータマッピングを持つAPI Gatewayと統合する必要がある
    • 受信リクエストデータがどう統合リクエストにマッピングされるか指定する
    • 同等レスポンスデータの結果が、メソッド応答にマッピングされるか指定する
  • 実現方法
    • HTTPプロキシ統合 で実現する
      • バックエンドが、EC2等で自作したAPIと統合する場合に使用する
        • HTTP_PROXY
        • HTTP
  • 他の連携方法
    • Lambda統合
      • バックエンドが、Lambda関数の場合使用する
        • AWS_PROXYを選択
      • 参考記事
      • Lambdaプロキシ統合の無し、有りが選択できる
        • 無しの場合
        • Lambda側に処理を寄せる方式
          • Lambdaから返される値のフォーマットが決まっていない
            • Lambdaの戻り値がそのまま使用される
          • /api-name?id=123でアクセスした場合
            • event['queryStringParameters']['id']で、値が取得できない
            • Lambda関数の引数である、eventにマッピングされない
              • 自分でマッピングテンプレートの設定が必要
        • 有りの場合
          • API Gateway側に仕事を担当させる方式
          • Lambdaから返される値のフォーマットが決まっている
            • 従わない場合は、502エラーになる
          • /api-name?id=123でアクセスした場合
            • event['queryStringParameters']['id']で、値が取得できる
            • Lambda関数の引数である、eventにマッピングされる
    • Lambdaカスタム統合
      • AWSを選択
    • モック統合
      • MOCKを選択

AWS SDK for Javaを使ってオンプレ環境からAWSにアクセスする権限設定

  • 開発者に必要なAWSサービスへのアクセス権限を付与したIAMユーザを作成する
  • アプリケーションサーバ上で、~/.aws/credentialsに認証ファイルを配置する

API Gateway+Lambda+DynamoDBが着信トラフィックの急増により504エラーになる原因

  • API Gatewayで、INTEGRATION_TIMEOUTエラーが発生している
    • INTEGRATION_FAILURE
      • 504が返る
      • 統合が失敗したときのレスポンス
    • INTEGRATION_TIMEOUT
      • 504が返る
      • 統合がタイム・アウトした場合のレスポンス
    • 参考
  • Lambdaが29秒以上実行できず、API Gatewayのタイムアウトエラーが発生している
    • 以下、5つのタイムアウト範囲は、50ミリ秒から29秒まで
      • Lambda統合
      • Lambdaプロキシ統合
      • HTTP統合
      • HTTPプロキシ統合
      • AWS統合

Aurora Postgres クラスタの最適な構成を考える

  • 要件
    • Productionのトラフィックは、大容量インスタンスが処理
    • 社内スタッフのクエリは、小容量インスタンスが処理
  • 実現方法
    • Auroraで新しいカスタムエンドポイントを作成
    • 両方のトラフィックを処理できるようにする
  • イメージ dev.classmethod.jp

Lambdaのインライン関数をデプロイするCloudFormationのパラメータ設定

  • CloudFormationテンプレートにコードを配置したい
  • AWS::Lambda::Functionリソースのパラメータ設定を行う
    • ZipFileの中に、直接コードが記載できる
Type: AWS::Lambada::Function
Properties:
  Runtime: nodejs12.x
  Role: arn:aws;iam;;123456789012:role/hoge
  Handler: index.handler
  Code:
    ZipFIle: |
      var aws = require('aws-sdk')
      var response = require('cfn-response')
      //以下略

docs.aws.amazon.com