紙一重の積み重ね

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

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

f:id:yokoyantech:20200621160338p:plain

はじめに

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

学習期間

2020年6月29日~7月5日

学習ログ

要件達成のために利用するAWSサービス

  • 要件
    • 美術館商用SNSアプリケーション
    • 収入源は広告
    • 広告をクリックした回数データを収集する
    • 多数のユーザが利用しても問題ないようなDB実装
  • 実現方法
    • DBとしてDyamoDBを使用
    • カウンタのUpdateItemオペレーション用のアトミックカウンタを実装する
  • 参考 docs.aws.amazon.com

ECSのタスク配置戦略

  • ECSタスク配置戦略とは
    • タスク配置、タスク終了でインスタンスを選択するためのアルゴリズム
  • 参考 docs.aws.amazon.com
  • 要件
    • ECSクラスターを使用
    • 使用中のインスタンス数を最小限に抑える
    • コスト効率を向上させたい
  • 実現方法
    • binpackタスク配置戦略を使用する
      • 未使用のCPU、メモリを最小にする
      • 使用中のコンテナインスタンス数を最小限にする

Elastic Beanstalkで最も時間がかからないデプロイ方法

  • 解決方法
    • All at Once
      • 1度に全て
      • 新しいバージョンをすべてのインスタンスに同時に展開する
  • 他のデプロイ方法
    • Rolling
      • ローリングデプロイ
      • 部分的に古いバージョンが残るタイミングがある
    • Rolling with additional batch
      • 新しいバージョンをバッチで展開
    • Immutable
      • 変更不可能な更新を実行
      • 古いバージョンを起動しているインスタンスと平行して、別のAuto Scallingグループで起動
      • 新しいインスタンスがヘルスチェックをパスしなかった場合、元のインスタンスを残す
        • ブルーグリーンデプロイメントのイメージ。

Codeシリーズを使用する際に考慮するポイント

  • 要件
    • CI/CD環境を整備
    • Cloudとオンプレミスのハイブリッド環境を使用中
    • CodePipelineで両方にアプリを展開したい
  • 実現方法
    • CodeDeployを使う
      • EC2とオンプレミスの両方にアプリをデプロイできる

AWS Organizationsによるアクセス許可の設定方法

  • 要件
    • 開発部門
      • アプリA用AWSアカウント
        • アプリBへの接続が必要
      • アプリB用AWSアカウント
  • 実現方法
    • アプリAアカウントのメンバーに、アプリB環境のリソースへのクロスアカウントアクセスを許可する

最適なAPI Gateway統合タイプ

  • 要件
    • Elastic Beanstalkを使用
    • クライアントが送信したメソッドRequestをバックエンドに渡す
    • メソッド確立後はクライアントとバックエンドがHTTPエンドポイントで直接対話する
  • 実現方法
    • HTTP_PROXY統合
  • 参考 docs.aws.amazon.com

EC2+DynamoDBのソリューション

  • 要件
    • 訪問者を追跡して最適な広告を表示する
    • ユーザー行動データはDynamoDBに蓄積
    • 最小構成で実現したい
  • 実現方法
    • アトミックカウンターを使用する
    • UpdateItemを使用する
      • 同一ユーザからのアクセスをカウントすることができる

KMSによるS3サーバサイド暗号化

  • 要件
    • サーバサイド暗号化しているS3バケットにアップロードするバッチを作りたい
  • 実現方法
    • リクエストヘッダーに、x-amz-server_-ide-encriptionヘッダーを指定する

Kinesisのデータ重複対策

  • 要件
    • Putrecord apiを使って、Kimesis data streamsにデータを送信
    • 2回送信してしまい、データ重複エラーが出た
  • 対策
    • 主キーを設定する

AWS SAMをcloud formationで使用する

  • 実現方法
    • Transformセクションで、AWS SAMのバージョンを指定する
Transform: AWS::Serverless-2016-10-31
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'     

サーバレスアプリケーションを適切に展開する方法

  • 構成要素
    • Node.jsで構築されたサーバレスアプリケーション
    • 単一のスタックで構成
      • Lambda
      • API Gateway
      • DynamoDB
  • 実現方法
    • Node.jsのカスタムランタイムを含む新しいレイヤーを作成
    • そのランタイムを使用するLambda関数を起動する
  • 参考情報 docs.aws.amazon.com docs.aws.amazon.com

DynamoDBでテーブルの単一パーティションに対して、複数のインデックスを使用したクエリを実行したい

  • 実現方法
    • ローカルセカンダリインデックスを使う
  • ローカルセカンダリインデックスとは
    • プライマリキー以外の検索を行う際に必要
      • プライマリキーの代わりに代替えのソートキーを使用する
    • 同じパーティション内では、暗黙のインデックスで整理されている
      • これに加えて別の規則でインデックスを構築すること
    • テーブル作成前にローカルセカンダリインデックスを作成する必要がある
      • 最大5つ作成できる
  • イメージ
    • プライマリインデックス f:id:yokoyantech:20200710151928p:plain
    • 同一のハッシュキーのデータに対して、さらに並べ替え用のインデックスを貼るイメージか。
      • テーブル全体ではなく、特定のハッシュキーが範囲となるからローカル。
    • プライマリインデックスとは別に、レンジキーを追加できる
      • だからセカンダリ f:id:yokoyantech:20200710152028p:plain
  • 参考情報

www.slideshare.net

DynamoDBで、非キー属性のクエリを高速化するためにインデックスを貼りたい

  • 実現方法
    • グローバルセカンダリインデックスを使う
  • グローバルセカンダリインデックスとは
    • テーブルに対して自由に追加できるインデックス
    • すべてのパーティションで、テーブル全体に対してクエリを実行できる
      • だからグローバル
    • プライマリインデックスとは別に、ハッシュキー、レンジキーを追加できる
      • だからセカンダリ
  • イメージ f:id:yokoyantech:20200710152101p:plain