紙一重の積み重ね

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

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

はじめに

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

学習期間

2020年7月27日~8月2日

学習ログ

KMSの暗号化プロセスの特徴

  1. KMSは毎回、キーを回転させることができる
  2. KMSに保存されているマスターキーを使用して、暗号化キーを生成する

CloudFormationのエラー原因

  • 東京リージョンで、スタックA
    • Export名「hoge」
  • シンガポールリージョンで、スタックB
    • Export名「hoge」
  • シンガポールリージョンで、スタックAをデプロイ
    • エラーになる
      • CloudFormationのExport名
        • AWSアカウント毎にリージョン内でユニーク

CloudFrontで実施すべき設定

  • 要件
    • EC2+ALB+Auto Scaling
    • デフォルトドメイン名を持つCloudFrontを使用
    • ビューアとCloudFront間をHTTPS通信したい
  • 設定
    • CloudFront
      • ビューアプロトコルポリシーに2つ設定する
        • Redirect HTTP to HTTPSを設定
        • HTTPS Onlyを設定

docs.aws.amazon.com

AWS SAMバージョンをCloudFormationに記載したい

  • CloudFormationテンプレートのリソースセクション以外に設定すべき項目
    • AWS::Serverlessに、AWS SAMのバージョンを記載する
    • AWS::ServerlessオプションのTransformを設定する
Transform: AWS::Serverless-2016-10-31
Resources:
  MyServerlessFunctionLogicalID:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs8.10
      CodeUri: 's3://testBucket/mySourceCode.zip'

docs.aws.amazon.com

Lambda関数を呼び出したイベントソースをトレースして、リクエスト数とリクエストごとの実行時間を監視したい

  • 以下の2つを使って実現する
    • AWS X-Ray
    • CloudWatch

www.slideshare.net

Lambdaプロキシ統合を利用したAPI Gatewayの接続拒否エラーの原因

  • APIを呼び出す際に、HTTPSエンドポイントを利用していないため
    • API Gatewayで作成されたAPIはすべて、HTTPSエンドポイントのみ公開する
    • HTTPエンドポイントはサポートしない

DynamoDBの読み込みリクエストユニット数の計算

  • 要件
    • 4.0KBのデータに対して、1秒間に2回読み込み
    • 1時間読み込みを続ける必要がある
    • オンデマンドモード
    • 結果整合性モデルを使用
  • DynamoDBの仕様
    • 1つの読み込みリクエストユニット
      • 4KBの項目について、
        • 1回の強力な整合性のある読み込みリクエスト
        • 2回の結果整合性のある読み込みリクエスト
    • トランザクション読み込みリクエスト
      • 4KBの項目について、
        • 1回読み込むのに読み込みリクエストユニットが2個必要
  • 計算
    • 読み込み回数:2回×60秒×60分=7200
    • 1つの読み込みリクエストユニットは、2回の結果整合性のある読み込みを表す
    • 7200/2=3600
      • 要件に対して、必要な読み込みリクエストユニット数は、3600

REST APIの実装に利用できるAWSサービス

  • API Gateway+Lambda
  • ALB+ECS
    • ECS+ALBで、スケーラブルで不可bンさんされたREST APIが構築できる

DynamoDBの属性を部分的に取得したい

  • ProjectionExpressionを使う
    • Projection(投影)
    • Expression(表現、語句)
  • 使用例
    • ProductCatalogテーブルから、Description属性のリスト内の最初の要素と、マップ内の入れ子のリストを取得
aws dynamodb get-item
  --table-name ProductCatalog
  --key file://key.json
  --projection-expression "Description, RelatedItems[0], ProductReviews.FiveStar"

docs.aws.amazon.com

CloudFormationテンプレート内でEC2 AMI IDを指定したい

  • Fn::Refを使う
    • 指定したパラメータ、リソースの値を返す
  • 使用例
    • EC2インスタンスのインスタンスIDを指定したい
MyEIP:
  Type: "AWS::EC2::EIP"
  Properties:
    InstanceId: !Ref MyEC2Instance

docs.aws.amazon.com

  • 別の関数
    • Fn::GetAttは、リソースの属性値を返す
    • 使用例
      • 論理名myELBから、ロードバランサのDNSを取得する
!GetAtt myELB.DNSName

CodePipelineの実行エラーの調査方法

  • 要件
    • CodeCommitと、CodeDeployを使用
    • CodePipelineを使用
      • Githubにcommitしたコードをpull
      • CodeBuildでビルド
      • Elastic Beanstalkにデプロイ
        • デプロイがエラーになった
        • ターゲットのBeanstalkと連携できないエラーが発生
  • 調査方法
    • CloudFormationで調べる
      • Beanstalkが削除されていないかを確認
    • IAM Policy Simulatorで調べる
      • 認証関連のトラブルが発生していないかを確認
    • CloudTrailで調べる
      • Beanstalk関連のイベントを検索

Kinesis Data Streamsのスケール設定

  • 要件
    • API Gatewayと連携したLambdaを使用
    • Kinesisからデータ取得処理を実施
    • データの増加に応じて、Kinesis Data Streamsが時間とともにスケールしたい
  • 実現方法
    • シャードを追加する
      • シャードとは、ストリーム内の一意なデータレコード
      • Kinesis Data Stremaは、複数のシャードから構成される
    • パーティションキーに多数の異なる値を設定する
      • パーティションキーは、ストリーム内のデータをシャード別にグループ化するもの
  • 注意点
    • Kinesis Data Streamsには、以下はない
      • Auto Scaling
      • マルチAZ

docs.aws.amazon.com

Lambda関数の暗号化と復号化

  • 要件
    • 1MBを超えるデータを関数に渡して実行時に暗号化および復号化を行いたい
  • 実現方法
    • Lambda関数の暗号化は3パターンある
      • キー設定
        • KMSで管理する暗号化キーを使用する
      • 暗号化ヘルパー
        • 環境変数でシークレット情報を使用する
      • 暗号化SDK
        • AWS Lambda環境変数の最大サイズは、512KB
        • 1MBを超えるデータを暗号化するためには、暗号化SDKを使う
        • 暗号化されたファイルをLambda関数でエンベロープする
          • envelope(封筒、包み)

CodeBuildのビルド実行エラーログを確認する方法

  • CloudTrailを有効化する
    • CodeBuildのAPIコールをキャプチャする
  • S3とCloudWatch統合を有効にする
    • CodeBuildによってS3にアップロードされたログが確認できる
    • CloudWatchLogsから詳細なビルド情報が取得できる

CI/CD環境のワンストップダッシュボードが必要

  • AWS CodeStarを使う
    • プロジェクトのダッシュボードを提供

https://aws.amazon.com/jp/codestar/featureaws.amazon.com

X-Rayを使用する際の考慮事項

  • 考慮すべき点
    • サブセグメントを作成する
      • AWSサービスとAWS SDKで作成するリソースへの呼び出しを記録できる
    • メタデータオブジェクトに、セグメントに保存する追加のカスタムデータを設定する
      • デバッグや分析に使用できる
        • メタデータは、キーと値のペア
        • "game":{"id":"abcdefg","session":"xxxyyyzzz"}
  • X-Rayとは
    • アプリや基盤となるサービスの実行状況を把握
    • パフォーマンスの問題や、エラーの原因を特定する
    • マイクロサービスの見える化
      • 個々のトレースを、サービスマップで見える化
      • どこからエラーになったのか
      • どこでパフォーマンスが悪いのかが、ぱっと見てわかる

f:id:yokoyantech:20200807083240p:plain

  • X-Rayの概念
    • 例)Lambdaが、DynamoDBを3回呼び出す
    • セグメント
      • 動作に関するデータ
        • リソース名
          • Lambdaの関数名
        • リクエストの詳細
          • HTTPメソッドなど
        • 行った作業の詳細
          • 実行にかかった時間など

f:id:yokoyantech:20200807083251p:plain

  • サブセグメント
    • LambdaからのDynamoDBを呼び出しの1つ1つの情報のこと
    • サブセグメントは、セグメントに内包される
    • 呼び出しに関する追加の詳細な情報
      • AWS のサービス
        • DynamoDB
      • 外部API
        • PutItem
      • SQL DB

f:id:yokoyantech:20200807083303p:plain

  • トレース
    • 1回のリクエストで生成されたセグメントのすべてを収集したもの
    • リクエストとトレースは1:1になる

f:id:yokoyantech:20200807083316p:plain

https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-x-ray-202aws.amazon.com

Lambdaの関数コードを使用して依存関係を減少させたい

  • Lambdaレイヤーを使う
    • Lambda関数の依存関係をアップロードできる
    • レイヤーは、依存関係を含むZIPアーカイブ
    • レイヤーに含まれるもの
      • ライブラリ
      • カスタムランタイム
      • その他の依存関係
    • レイヤーはデプロイパッケージに含める必要はない
    • レイヤーを使うことで、デプロイパッケージのサイズを小さくできる

dev.classmethod.jp

Lambda関数のアプリケーション処理としてリクエストを非同期にしたい

  • Invoke APIを使用してLambda関数を呼び出す
    • Invoke(呼び出す、発動する)
  • InvocationTypeEventに設定する
    • Invocation(呼び出し、発動、実施)