はじめに
AWS認定デベロッパーアソシエイト取得に向けた学習ログです。
学習期間
2020年7月27日~8月2日
学習ログ
KMSの暗号化プロセスの特徴
- KMSは毎回、キーを回転させることができる
- KMSに保存されているマスターキーを使用して、暗号化キーを生成する
CloudFormationのエラー原因
- 東京リージョンで、スタックA
- Export名「hoge」
- シンガポールリージョンで、スタックB
- Export名「hoge」
- シンガポールリージョンで、スタックAをデプロイ
- エラーになる
- CloudFormationのExport名
- AWSアカウント毎にリージョン内でユニーク
- CloudFormationのExport名
- エラーになる
CloudFrontで実施すべき設定
- 要件
- EC2+ALB+Auto Scaling
- デフォルトドメイン名を持つCloudFrontを使用
- ビューアとCloudFront間をHTTPS通信したい
- 設定
- CloudFront
- ビューアプロトコルポリシーに2つ設定する
Redirect HTTP to HTTPS
を設定HTTPS Only
を設定
- ビューアプロトコルポリシーに2つ設定する
- CloudFront
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'
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の項目について、
- トランザクション読み込みリクエスト
- 4KBの項目について、
- 1回読み込むのに読み込みリクエストユニットが2個必要
- 4KBの項目について、
- 1つの読み込みリクエストユニット
- 計算
- 読み込み回数: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"
CloudFormationテンプレート内でEC2 AMI IDを指定したい
Fn::Ref
を使う- 指定したパラメータ、リソースの値を返す
- 使用例
- EC2インスタンスのインスタンスIDを指定したい
MyEIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref MyEC2Instance
- 別の関数
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関連のイベントを検索
- CloudFormationで調べる
Kinesis Data Streamsのスケール設定
- 要件
- API Gatewayと連携したLambdaを使用
- Kinesisからデータ取得処理を実施
- データの増加に応じて、Kinesis Data Streamsが時間とともにスケールしたい
- 実現方法
- シャードを追加する
- シャードとは、ストリーム内の一意なデータレコード
- Kinesis Data Stremaは、複数のシャードから構成される
- パーティションキーに多数の異なる値を設定する
- パーティションキーは、ストリーム内のデータをシャード別にグループ化するもの
- シャードを追加する
- 注意点
- Kinesis Data Streamsには、以下はない
- Auto Scaling
- マルチAZ
- Kinesis Data Streamsには、以下はない
Lambda関数の暗号化と復号化
- 要件
- 1MBを超えるデータを関数に渡して実行時に暗号化および復号化を行いたい
- 実現方法
- Lambda関数の暗号化は3パターンある
- キー設定
- KMSで管理する暗号化キーを使用する
- 暗号化ヘルパー
- 環境変数でシークレット情報を使用する
- 暗号化SDK
- AWS Lambda環境変数の最大サイズは、512KB
- 1MBを超えるデータを暗号化するためには、暗号化SDKを使う
- 暗号化されたファイルをLambda関数でエンベロープする
- envelope(封筒、包み)
- キー設定
- Lambda関数の暗号化は3パターンある
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とは
- アプリや基盤となるサービスの実行状況を把握
- パフォーマンスの問題や、エラーの原因を特定する
- マイクロサービスの見える化
- 個々のトレースを、サービスマップで見える化
- どこからエラーになったのか
- どこでパフォーマンスが悪いのかが、ぱっと見てわかる
- X-Rayの概念
- 例)Lambdaが、DynamoDBを3回呼び出す
- セグメント
- 動作に関するデータ
- リソース名
- Lambdaの関数名
- リクエストの詳細
- HTTPメソッドなど
- 行った作業の詳細
- 実行にかかった時間など
- リソース名
- 動作に関するデータ
- サブセグメント
- LambdaからのDynamoDBを呼び出しの1つ1つの情報のこと
- サブセグメントは、セグメントに内包される
- 呼び出しに関する追加の詳細な情報
- AWS のサービス
- DynamoDB
- 外部API
- PutItem
- SQL DB
- AWS のサービス
- トレース
- 1回のリクエストで生成されたセグメントのすべてを収集したもの
- リクエストとトレースは1:1になる
https://aws.amazon.com/jp/blogs/news/webinar-bb-aws-x-ray-202aws.amazon.com
Lambdaの関数コードを使用して依存関係を減少させたい
- Lambdaレイヤーを使う
- Lambda関数の依存関係をアップロードできる
- レイヤーは、依存関係を含むZIPアーカイブ
- レイヤーに含まれるもの
- ライブラリ
- カスタムランタイム
- その他の依存関係
- レイヤーはデプロイパッケージに含める必要はない
- レイヤーを使うことで、デプロイパッケージのサイズを小さくできる
Lambda関数のアプリケーション処理としてリクエストを非同期にしたい
Invoke API
を使用してLambda関数を呼び出す- Invoke(呼び出す、発動する)
InvocationType
をEvent
に設定する- Invocation(呼び出し、発動、実施)