はじめに
AWS認定デベロッパーアソシエイト取得に向けた学習ログです。 2歳児の育児のスキマ時間で勉強を続けています。
学習期間
2020年6月18日~6月21日
学習ログ
動的ポートマッピングと同じコンテナ上の単一サービスから複数タスクを実行する構成
- ALB+ECS
API GatewayのAPIRequestに対する認証方法
- IAM認証の署名バージョン4を使う
CodeDeployの設定
.appspec.yml
をルートディレクトリに配置する
ECSのコンテナ設定とタスクの割当てを別々に設定するために、資格情報を分割する方法
- ECSに対してIAMロールを作成してタスクに割り当てる
Kinesisデータストリームのデータ暗号化
- クライアント暗号化
- HTTPSエンドポイントを使用したクライアント間でデータ暗号化
- 転送されているレコードの盗聴を防ぐ
- HTTPSエンドポイントを使用したクライアント間でデータ暗号化
- サーバサイド暗号化
- KMSによる保存データの暗号化
- 保存中のデータを保護
- KMSによる保存データの暗号化
CodeDeployでのデプロイ成否を確認するフックインベント
- ValidateService
ValidateService – これが最後のデプロイライフサイクルイベントです。デプロイが正常に完了したことを確認するために使用されます。
サーバアクセスログは、S3を使用するだけでアクセスログを増加させる
- ログ記録はDefaultでは無効
- ログ記録を有効にすると、バケットと同じRegionのバケットに保存される
- ログ
- リクエスタ
- バケット名
- Request時刻
- Requestアクション
- レスポンスのステータス
- エラーコード
- ログ
Elastic Beanstalk環境でHTTPSエンドポイントを公開する方法
ebextension
ファイルを作成して、各ロードバランサを構築する- ALB
.ebextensions/https-reencrypt-alb.config
を使用する
- ALB
S3バケットに個人用の保存スペースを設定する
- 動的変数を使用したIAMポリシーを1つ作成
- 下記
${aws:username}
が、ユーザのフレンドリ名(IAM ARN)に置き換わる
- 下記
- すべてのユーザが属するIAMグループにアタッチ
{ "Version": "2012-10-17", "Statement": [ { "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}} }, { "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"] } ] }
Kinesisとは
- IoTのセンサーデータなど、ハイボリュームな連続したデータをリアルタイムで処理できるフルマネージドサービス
- 1時間あたり数TBのデータが処理できる
- データの収集を担う
- ビッグデータのうち、ストリームタイプに該当
- 半構造化データをストリームで処理する
- 他システムへデータ転送も可能
- KCL(Kinesis Client Library)とは
- アプリケーションがデータをKinesisにPutすることを補助するライブラリ
- EC2でKCL(Kinesis Client Library)ベースでKinesisと連携
- Kinesis Data Streamのトラフィック増加
- シャードを分割して、6シャードから10シャードに増強
- シャードを処理するためにデプロイできるEC2インスタンスの最大数は、10になる
- シャード毎に最大1つのKCL用のEC2インスタンスが使用できる
DynamoDBのアプリ上の読み込み設定を行うCLIオプション
- DynamoDBスキャンを実行し、特定の属性サブセットを取得したい
--projection-expression
コマンドで指定する- projection:投影
- expression:表現、語句
aws dynamodb get-item \ --table-name ProductCatalog \ --key file://key.json \ --projection-expression "Description, RelatedItems[0], ProductReviews.FiveStar"
MongoDBに接続するLambdaを構築
- チーム外のメンバがプレーンテキストで環境変数を参照できないようにしたい
- MongoDBのホスト名、ユーザ名、パスワード
- Lambdaで使用するAPI資格情報
- AWS KMSを使って、伝送中の暗号化のためのヘルパーを有効化する
- KMSによるLambdaの環境変数を暗号化できる
Lambda関数の一時ファイルの保存場所
- ローカルディレクトリの
/tmp
を使用する
コスト効率のために処理終了後はDynamoDBのテーブルデータを自動的に失効させたい
- TTL設定を行う
X-RayデーモンがECSで検出されるための設定
- AWS X-Ray SDKの環境変数で設定する
AWS_XRAY_DAEMON_ADDRESS
- node.js での実装例
var AWSXRay = require('aws-xray-sdk'); AWSXRqy.setDaemonAddress('tcp:daemonhost:8082 udp:daemonhost:8083');
Kinesis Data StreamのデータをS3に転送する際の注意点
- Kinesis Data Streamsのデータ保持期限を超過することがある
- Defaultのデータ保持期限は、データレコードがKinesisストリームに追加されてから24時間
- 最大値は168時間
DynamoDBから個々のアイテムを読み取り、EC2で変更処理を行う際に、プロセス完了時間を短縮するには
- DynamoDBの
BatchGetItem API
を使用する- 1回のオペレーションで取り出せる項目数は最大100
- 1MBのサイズ制限あり
S3バケットへアップロードする度に、アクセス許可が可能か一時認証を使用したい
AssumeRole
のAPIコールを使用する- AssumeRoleとは、特定のRoleを一時的に引き受ける(Assume)
- 別アカウントのS3バケットへアップロードする際などに使用できる
- 一時的なSecurity認証Requestを送るために、AWS Security Token Service(AWS STS)を使用できる
$ aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --profile IAM-user-name > assume-role-output.txt
Kinesis Data Streamsのデータフローに応じた調整方法
- データフローの増加に応じて、
- シャードを分割(増加)する
- シャードをマージ(削減)する
- Kinesis Data Streamsには、オートスケーリング機能はない
- クラスターの概念もない
SQSキューによるポーリングを受けてLambdaが処理する際に、再試行に失敗した場合に失敗イベントを蓄積する方法
- Lambdaデッドレターキューを使用する
- DLQを設定すると、非同期呼び出しの場合でも、SQSやSNSに送信してエラーを監視できるようになる
DynamoDBのインデックス設定
- 主キー+属性を組み合わせて複合キーを作る
- 主キー(プライマリキー)を構成できる属性の最大数は、2
- パーティションキー
- ソートキー
Elastic BeanstalkでホストするアプリにX-Rayコンソール経由で、アプリの呼び出しをトレースするためのX-Ray設定
- 2つある
- Elastic BeanstalkでX-Rayデーモンを有効にする
.ebextensions/xray-daemon.config
を作成
Lambdaプロキシ統合を使用してAPI Gatewayと連携しているアプリがある
- APIコールの応答と、Lambda関数の実行状況をモニタリングしたい場合のCloudWatchの設定方法
- 2つある
Latency
メトリクスを監視する- API GatewayがクライアントからRequestを受け取ってから、クライアントにレスポンスを返すまでの時間。
- API呼び出し全体の応答性が測定できる。
IntegrationLatency
メトリクスを監視する- API GatewayがバックエンドにRequestを中継してから、バックエンドがレスポンスを受け取るまでの時間。
- バックエンドの応答性が測定できる。
- 今回のケースだとLambdaの応答性。
- 2つある
EC2+RDS+KMSで構築したアプリケーション
- 暗号化に利用するデータキーの、暗号化されたコピーのみを返すAPI設定を実施
- KMS Decrypt APIでデータキーを復号化し、返されたプレーンテキストのデータキーを使用する
- 最終的に、データを暗号化するために利用するKMS APIは、
GenerateDataKeyWithoutPlaintext
- 一意のデータキーを生成するAPI
- マスターキーで暗号化されたデータキーを返す
- データキーの暗号化されたコピーのみ返す
- それ以外は、
GenerateDataKey
と同じ