Closed21

AWS認定 DVA試験対策勉強メモ

Dev-kentaDev-kenta

AWS Secrets Manager

DBの認証情報など各種機密情報を管理できるサービス。
キーのローテートなどもできるので、問題文にそういった要件が入っていたらこのサービスが正解の可能性高い。
AWS Systems Managerと似ているがこちらはキーのローテートはサービス単体では出来ずLambdaなどと組み合わせる必要がある。

https://dev.classmethod.jp/articles/about-secrets-manager/

Dev-kentaDev-kenta

ELB スティッキーセッションとElasticCacheの関係

スティッキーセッションはELBでの振り分け時にユーザーごとにアクセス先を固定する仕組み。
この機能によってアプリケーションをステートフルに扱える。
ただ問題点としてはAutoScalingを使いアプリケーションの負荷を均等に分散させようと設計しても、スケールアウト前にアクセスしていたユーザーは同じEC2にアクセスし続けるため負荷分散に繋がらない。

この解決策としてElasticCacheでセッション管理する方法がある。ElasticCacheを使う場合はスティッキーセッションは無効化していい。

Lambdaのデバック方法

SQSのデッドレターキューを使う。
問題のあるメッセージを分離して、デッドレターキューに送ることで処理が成功しない理由を調べることができる。

リレーショナルデータベースのOS権限が必要且つ高可用なアーキテクチャ設計

マルチAZ構成でEC2にインストールする。
RDSを選びがちだが、OS権限にはアクセスできないので注意する。

DynamoDBの書き込みキャパシティユニットの計算方法

1kbごとに1つ × レコード数 / 時間 = 書き込みキャパシティユニット数
またトランザクション書き込みリクエストの場合1kbごとに2つ

レコードサイズ レコード数 時間 トランザクション書き込み
1.5kb 1000万 1時間 ×

この場合
2 × 10000000 / 3600 = 5555.55555

レコードサイズ レコード数 時間 トランザクション書き込み
3kb 1000万 1時間

この場合
6 × 10000000 / 3600 = 16666.6

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.requests

Dev-kentaDev-kenta

AWS SDKでアクセスキーを使用するベストプラクティス

EC2にIAMロールを使用する場合、明示的にアクセスキーを取得する必要は無い。
頻繁にローテートされる一時的な認証情報が生成される。SDKとCLIは一時的な認証情報を自動的に取得できる。
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html#use-roles

ECSでは?

同じようにタスク定義でTaskRoleを指定すればいい(と思う)。ただしECSはTaskRoleとTask Execution Roleがある点に注意。
https://qiita.com/tmiki/items/25473b8975f8a1095c0a
https://esakat.github.io/esakat-blog/posts/ecs-iam-role/

DynamoDB 読み込み(書き込み)の強力な整合性と結果整合性のスループットの違い

1 つの読み込みリクエスト単位は、最大サイズ 4 KB の項目について、1 回の強力な整合性のある読み込みリクエスト、あるいは 2 回の結果整合性のある読み込みを表します。

強力な整合性の方が多くのスループット容量を必要とする。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html

Dev-kentaDev-kenta

Lambda関数の更新コマンド

update-function-codeコマンドを使う

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/API_UpdateFunctionCode.html

SQS キューから次のアプリケーションの処理の待機時間を短くする

ロングポーリングを使う。
ロングポーリングを使うことで空のレスポンスを減らし、メッセージが利用可能になり次第処理をすることが可能になる。
20秒間(最大値)で設定しておけば、無駄な空レスポンス取得を回避して待ち受けてくれるからコスト効率も良いし待機時間も短くなる(という理解をしているが合ってれだろうか。。)

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling
https://qiita.com/taka_22/items/718ec340a710bbf5e3d0

CloudWatch 高解像度メトリクス

1 秒、5 秒、10 秒、30 秒、または 60 秒間隔で細かく詳細にメトリクスを監視できる。
そのため1分未満の監視間隔が必要な要件の場合は高解像度メトリクスを使用する。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/publishingMetrics.html#high-resolution-metrics

Elastic Beanstalk 環境へのアプリケーションのデプロイ

新しいインスタンスへのデプロイになるのは、以下のデプロイ方法

  • 変更不可(イミュータブル)
  • トラフィック分割
  • Blue/Green

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.deploy-existing-version.html

DynamoDB のグローバルセカンダリインデックス

必要なプロジェクト属性を最小限に抑えて別のテーブルを作成できるため取得するデータ量を少なくできる。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GSI.html

Dev-kentaDev-kenta

CodeBuild

ビルド対象のソースとして使用できるもの

S3、CodeCommit、GitHub、Bitbucket

CodeDeploy

デプロイ仕様の定義

appspec.ymlで定義する。

Elastic Beanstalk

IAMポリシーでのアクセス制御

作成したEC2からS3にアクセスしたい場合は、適切なIAMポリシーを作り、IAMロールをEC2に紐付ける。
Elastic BeanstalkのサービスロールにはIAMポリシーを付けない。

EC2に追加でモジュールをセットアップしたい

ebextensionsフォルダを作り、モジュール追加指示を記載する。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html

作成できる環境

  • ウェブサーバー環境
  • ワーカー環境
    サーバーレスは選択できない。

SAMコマンド

以下のコマンドでデプロイまでできる。

sam init
sam build
sam deploy
Dev-kentaDev-kenta

CognitoサインイントリガーでLambdaを実行するポリシー

Lambdaのリソースポリシーでlambda:InvokeFunctionを許可する。

EC2インスタンスにIAMロールを設定するIAMユーザーに必要なアクション

  • iam:GetRole
  • iam:PassRole

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_passrole.html

マネジメントコンソールからEC2用のIAMロールを作成した時に自動的に作成されるもの

  • 信頼ポリシー
  • インスタンスプロファイル

機密情報をSystems Managerのパラメータストアで管理する

パスワードなどの機密情報はSecureStringを使う。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html

Dev-kentaDev-kenta

Cognito

SAML または OpenID Connect、ソーシャル ID プロバイダー (Facebook、Twitter、Amazon など) をサポートする外部 ID プロバイダーと併用し、独自の ID プロバイダーを統合することもできます。

Cognito Streams

保存されているデータの分析に使える。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-streams.html

データ同期

Cognitoを使いデバイス間のデータの同期も実装できる。

https://aws.amazon.com/jp/cognito/faqs/

DynamoDB

プロビジョニングモードのRCU計算方法

4kbまで2RCU
4kb〜8kbまで4RCU
5kbで毎秒100アイテムの場合
4RCU *100=400

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.ProvisionedThroughput.Manual

一貫したパフォーマンスが得られるパーティションキーの設定

  • ユニークなキーはクエリされない
  • ランダムなテキストもクエリされない
  • 範囲が限られているものは効果が薄い
    上記以外のフィールドにフィールドにパーティションキーを設定すれば、効果が高い?

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html

Lambda

Kinesisのデータ処理に失敗した場合のエラー処理

エラーを返した場合は処理が成功するか、データの有効期限が切れるまでLambdaはバッチを再試行する。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-kinesis.html

/tmpにキャッシュさせる

Lambda関数内でファイルのダウンロードなどを行う処理などをしていて、且つ1秒間に複数回実行されるようなものは/tmpディレクトリにキャッシュさせるとパフォーマンスが上がる。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html#function-code

CloudFormationにSAMを使用してモバイルアプリケーションを構築

テンプレートにはResourcesとTransformセクションが必須。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html

ネットワークのレイテンシーを保証するアプリケーションの構築

  • 再試行
  • エクスポネンシャルバックオフ
    この考え方が重要?エクスポネンシャルバックオフってなんぞや。。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html

OpsWorksレシプのデバッグ

失敗したインスタンスにログインしてレシピが正しく構成されているか確認する。

https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/troubleshoot-debug.html

Elastic Beanstalkのデプロイ要件

要件

デプロイの所要時間が問題ではなく、既存のインスタンスを使用する。

デプロイ方法

上記の場合はローリングが最適なデプロイ方法。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html

SQS 可視性タイムアウトの変更

EC2のワーカー環境での実行処理が可視性タイムアウトの設定時間よりも長い場合に、要件として回避する必要がある場合には、ChangeMessageVisibilityアクションを使用して可視性タイムアウトの期間を新たに設定する。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html#changing-message-visibility-timeout

S3 CORS設定のトラブルシューティング

サードパーティーのツールなどを使い、リクエストとレスポンスやOriginヘッダーを確認する。
CloudWatchLogsではCORSに関するログは記録されないため、調査に使えない。
CloudTrailもAPI呼び出しのみしかわからないため同様。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/cors-troubleshooting.html

Dev-kentaDev-kenta

DynamoDB一時的なバーストエラーの対処

エラーの再試行とエクスポネンシャルバックオフを利用する。
AWS SDKは自動的に再試行ロジックを実装している。

簡単な再試行に加えて、各 AWS SDK はエクスポネンシャルバックオフアルゴリズムを実装し、フロー制御を改善します。エクスポネンシャルバックオフは、再試行間の待機時間を累進的に長くして、連続的なエラー応答を受信するという概念に基づいています。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff

Lambda

コードデバック方法

プログラムのボトルネックを探るためにコードをデバッグする必要がある場合はX-Rayを使う。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-xray.html

依存ライブラリの扱い

zipファイルにソースコードと合わせて依存ライブラリも含めるのがベストプラクティス。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html#function-code

ECSでX-Rayを使う

  • タスクにIAMロールを設定
  • X-Rayアプリケーションコードにインストルメンテーションを追加
  • X-Rayデーモンを実行するDockerイメージを作成する

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-daemon-ecs.html

Elastic Beanstalkのデプロイ

  • 時間は問題にならない
  • インスタンス数を一定にする
  • コストを抑える
    以上の要件の場合は、Rolling with additional batch (追加バッチによるローリング)が要件を満たすデプロイ方法になる。
    新しいバージョンをデプロイするが、総容量を維持するためインスタンスの新しいバッチをまず起動するため。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html

Dev-kentaDev-kenta

CodeDeployでのデプロイ方法

  • インプレースデプロイ
  • ブルー/グリーンのデプロイ
    以上の二つの方式がある。

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployments.html

Kinesis Streams

EC2インスタンスの最大数=シャードの最大数

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-record-processor-scaling.html#kinesis-record-processor-scaling-example

アプリケーション内で暗号化する方法

KMS GenerateDataKeyを使用する。
https://docs.aws.amazon.com/ja_jp/kms/latest/APIReference/API_GenerateDataKey.html

Lambda関数を使うベストプラクティス

データベースの初期化処理などのLambdaハンドラーはコアロジックから切り離して、再利用可能にする。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html#function-code

Dev-kentaDev-kenta

API Gateway

EC2インスタンスへのデプロイをElastic Beanstalkで行なっているWEBアプリからAPI Gatewayにアクセスする

IAM認証の署名バージョン4を利用する。

https://dev.classmethod.jp/articles/api-gateway-iam-authentication-sigv4/

APIコールの応答性とLambdaファンクションの応答性をモニタリングするCloudWatchメトリクス

  • Latency
  • IntegrationLatency
    以上の2つでモニタリングできる。
メトリクス 内容
CacheHitCount 指定された期間内に API キャッシュから配信されたリクエストの数。
CacheMissCount API キャッシュが有効になっている特定の期間における、バックエンドから提供されたリクエストの数。
Count 指定された期間内の API リクエストの合計数。
IntegrationLatency API Gateway がバックエンドにリクエストを中継してから、レスポンスを受け取るまでの時間。
Latency API Gateway がクライアントからリクエストを受け取ってから、クライアントにレスポンスを返すまでの時間。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html

不正なドメインからのアクセス制御方法

CORSの有効化をする。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/how-to-cors.html

CodePipeline

手動承認フローを組み込む

SNSと連携する。

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/approvals-action-add.html

CodeDeploy

設定ファイル

.appspecファイルで設定する。

デプロイの成功可否確認するイベントフック

ValidateServiceが最後のデプロイライフサイクルイベント。デプロイが正常に終了したことを確認できる。

その他

フック 内容
BeforeInstall 置き換えタスクセットが作成される前にタスクを実行するために使用される。
AfterInstall 置き換えタスクセットが作成されてターゲットグループの 1 つがそれに関連付けられた後に、タスクを実行するために使用される。
BeforeAllowTraffic 2 番目のターゲットグループが置き換えタスクセットに関連付けられた後で、かつ、トラフィックが置き換えタスクセットに移行される前に、タスクを実行するために使用される。
AfterAllowTraffic 2 番目のターゲットグループが置き換えタスクセットにトラフィックを提供した後で、タスクを実行するために使用される。

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html

CodeBuild

ECRへの認証エラー時に可能性が高い原因

CodeBuildからECRへのIAMアクセス許可が間違っている。

Kinesis Data Streams

データ暗号化

  • KMSの保存中データの暗号化
  • HTTPSエンドポイントを使用した転送中データの暗号化
    上記が必要。

https://aws.amazon.com/jp/blogs/news/encrypt-and-decrypt-amazon-kinesis-records-using-aws-kms/

データの複数回送信を適切に処理する方法

レコード内に主キーを仕込む。

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-record-processor-duplicates.html

データフローに応じた調整方法

  • データフローの増加に応じてシャードを分割
  • データフローの減少に応じてシャードをマージ
    以上の対応が必要。

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-using-sdk-java-resharding.html

DynamoDB

特定の属性サブセットを取得するCLIコマンドオプション

--projection-expressionを使う。

Amazon DynamoDB は、デフォルトですべての項目属性を返します。すべての属性ではなく、一部の属性のみを取得するには、-projectionというプロジェクション式を使用します。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html

個々のアイテムを読み取って、データ内容を変更するアプリケーションで、プロセス完了時間を短縮するソリューション

DynamoDBはBatchGetItemを使い、まとめて取得することによってデータ処理リクエストの回数を減らすことができる。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/API_BatchGetItem_v20111205.html

プライマリーキーに設定できる最大数

2つまで。

DynamoDBにプライマリーキーとして複合キーを設定する場合は、最大で2つの属性を利用して複合キーを作成します。

非キー属性のクエリを高速化できるインデックスが必要な場合

グローバルセカンダリインデックスを使う。

1 つ以上のグローバルセカンダリインデックスを作成して、Amazon DynamoDB でそのインデックスに対して Query リクエストを発行することで、非キー属性のクエリを高速化することができます。

ローカルセカンダリインデックスはパーティションキーとソートキーで構成されるため要件に合致していない。

X-Ray

X-RayデーモンがECSで正しく起動されるようにする環境変数

AWS_XRAY_DAEMON_ADDRESSを設定する。

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-daemon-ecs.html

サンプリングルールの設定方式

サンプリングリクエスト数 = リザーバーサイズ+((1秒あたりの着信リクエスト-リザーバーサイズ)*固定レート)

KMS

データキーの暗号化されたコピーのみを返すKMS APIコール

GenerateDataKeyWithoutPlaintextを使用する。
GenerateDataKeyは作成されるデータキーのプレーンテキストおよび暗号化されたコピーを返すので、暗号化されたコピーのみを返すことはできない。

https://dev.classmethod.jp/articles/10minutes-kms/

S3へのアップロードされるに保存データを保護する設定方法

アップロードリクエストにaws:kmsの値を持つx-amz-server-side-encryptionヘッダーを含める。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-bucket-store-kms-encrypted-objects/

Secrets Manager

要件として認証情報に対するスパイクが発生する場合を考慮しないといけない場合

Secrets Managerの使用を検討する。
データベースの認証情報の管理だけなら、Systems Managerでも可能だが、スパイクの発生を考慮する場合はSecrets Managerが適している。

https://qiita.com/tomoya_oka/items/a3dd44879eea0d1e3ef5

sam

デプロイ自動化のコマンド

  • sam package
  • sam deploy
    以上を使う。

samコマンド

コマンド 内容
build Lambda 関数のデプロイメントパッケージをコンパイル
deploy デプロイ方式の設定
init アプリケーションの雛形を作成
publish アプリケーションの公開
validate テンプレートファイルの検証
package コードと依存関係に関する.zip ファイルを作成し、S3にアップロード

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html

CloudFormation

スタック削除時の依存関係

外部スタックから参照されている全てのインポートを削除する必要がある。
スタック2がスタック1のリソースを参照している場合はスタック2から削除する必要がある。

ECS

最小のインスタンス数に抑える戦略

Binpackタスク配置戦略を使う。

戦略 内容
Binpack CPU またはメモリの最小利用可能量基づいて、最小のインスタンス数に抑える
Random ランダムに配置する
Spread 指定された値に基づいてタスクを均等に配置

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement-strategies.html

Organizations

アカウント間のリソース共有

クロスアカウントアクセスを使う。

https://dev.classmethod.jp/articles/signin-with-cross-account-access/

Elasticache

読み取られないデータを自動的に削除することでクラスター内の無駄なスペースを最小限に抑える方法

書き込みスルー戦略を使い、TTLを設定する。

キャッシュ内のデータが常に最新であることを確認し、読み取られないデータを自動的に削除することができます。

キャッシュ戦略

戦略 内容
書き込みスルー データがデータベースに書き込まれると常にデータを追加するか、キャッシュのデータを更新します。
遅延読み込み戦略 必要なときにのみキャッシュにデータを読み込むキャッシュ戦略です。
TTL の追加 一定期間でデータ項目を失効させることができます。

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/Strategies.html

SQS

メッセージサイズ制限を超えてしまった場合

SQS 拡張クライアントライブラリを使う。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-jms-client-with-sqs-clients.html

CloudWatch

CLIでEC2の詳細モニタリングを有効かするコマンド

aws ec2 monitor-instances --instance-ids [インスタンスID]

Lambda

デッドレターキューが利用されるケース

非同期呼び出しが3回とも失敗した場合

Dev-kentaDev-kenta

Elastic Beanstalk環境からRDSを分離する方法

一度構成した環境からRDSは分離できない。そのためElastic Beanstalkを作り直し、RDSを別で起動する必要がある。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/AWSHowTo.RDS.html

CodePipeline

S3バケットに暗号化してデータを保存する

  • SSE-KMSでS3バケット暗号化に使用する
  • S3バケットでサーバー側の暗号化を有効にする

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/S3-artifact-encryption.html

デプロイで失敗した場合に考えられる原因

  • CodeCommitで指定したブランチへの変更が行われていない
  • パイプラインの初期ステージで失敗している
    など。

DynamoDBのプロビジョニングされたスループットが不足して書き込みが抑制された場合のソリューション

パーティションキーに乱数サフィックスを追加する。
追加することによってホットパーティションだったのが、均等にロードが分散され全体的なスループットが向上する。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html

Lambda関数のベストプラクティス

  • 再帰呼び出しは使わない
  • Lambda ハンドラーをコアロジックから分離
  • 実行環境の再利用を活用する
  • 環境変数を使用して、ハードコーディングしない
  • 関数のデプロイパッケージの依存関係を制御する
    など。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html

Dev-kentaDev-kenta

DynamoDB

グローバルセカンダリインデックスに使える読み込み

結果整合性のみ。

同じプライマリキーを持つアイテムにPutItemした場合

既存のアイテムが上書きされる。

オプティミスティックロックを使用するには

ConditionExpressionを使う。

パーティションキーやソートキー以外で絞り込みたい

FilterExpressionを使う。

全項目を取得する場合

Scanを使う。

100MBを超えるテーブルのScan時に結果を分割する

LastEvaluatedKeyを新しいExclusiveStartKeyに指定してScanする。

BatchGetItemで読み込めなかった場合

UnprocessedItemsにレスポンスが返される。

複数テーブルのアイテムをタイミング合わせて書き込みたい

TransactWriteItemsを使う。
一部の書き込みで失敗した場合は、全ての書き込みが失敗する(ロールバックされる)。

Dev-kentaDev-kenta

Lambda

S3とAPI Gatewayのイベントトリガーで実行に必要な権限

リソースポリシーが必要。

CloudWatch Logsに出力する方法

実行ロールに

"logs:PutLogEvents",
"logs:CreateLogGroup",
"logs:CreateLogStream"

をつける。

請求対象

実行時間と設定メモリ容量とリクエスト回数。

RDSにアクセスする方法

同じVPCにLambdaを起動して、サブネットとセキュリティグループを設定する。

Dev-kentaDev-kenta

SQS

プロデューサーからのメッセージが問題でエラーを繰り返すケース

最大受信数を設定して、デッドレターキューに回す。

他のアカウントからのメッセージ送信を許可する

sqs:SendMessageリクエストを許可する。

SQSキューに送信してから利用可能になるまでの遅延時間のパラメータ

DelaySecondsで設定する。

メッセージの受信待機時間のパラメータ

Receive Message Wait Timeで設定する。

メッセージを削除時に指定するもの

受信ハンドルが必要。

Dev-kentaDev-kenta

Kinesis Data Streams

シャードが不足している時の対策

  • シャードを分割する
  • EC2インスタンスタイプを増強する

スケールする設計にする方法

  • シャードを追加する
  • パーティションキーに多数の異なる値を設定する

CloudFront

ビューワーとCloudFrontの通信をHTTPSにする

  • Redirect HTTP to HTTPSを使う
  • HTTPS Onlyを使う

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/using-https-viewers-to-cloudfront.html

CloudFromation

AWS SAMでリソースセクション以外に設定する項目

  • AWS::Serverless Transformを設定
  • AWS::Serverless にバージョンを指定

AWS::SAMじゃないので注意。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html

エクスポート名

AWSアカウントごとにリージョン内で一意である必要がある。

Elastic Beanstalk

定期的に実行するジョブを自動追加する設定ファイル

cron.yamlファイルを使う。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/elastic-beanstalk-cron-job-worker-tier/

CodePipelineのCodeBuildとの連携で失敗した時にデバックする方法

  • CloudFormationで原因を調べる
  • IAM Policy Simulatoを利用する
  • CloudTrailで原因を調べる

環境ごとの設定を記述する設定ファイル

env.yamlを使う。環境の名前やソリューションスタックなどを記載する。

古い環境を自動的に削除する仕組み

ライフサイクルポリシーを使う。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/applications-lifecycle.html

DynamoDB

Kinesis Date Streamsのシャードイテレーターが期限切れになった場合の対策

DynamoDB側のシャーディングされたテーブルの書き込み容量を増強する

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html

古いデータの上書きを防止する

バージョン番号によるオプティミスティックロックを設定する。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html

新しい更新内容のみを追跡・保存する処理

  • DynamoDBストリームを有効化した上で、StreamViewTypeの値をNEW_IMAGEに設定する
  • Amazon Kinesis アダプターを連携する

複数ユーザーの同時アップデートを防ぐ仕組み

条件付きの書き込みを使う。
条件付きの書き込みを使うと、項目の属性が 1 つ以上の想定条件を満たす場合のみに成功できるようできる。

https://qiita.com/leomaro7/items/b8274db043e37189e59b

Lambda

1MBデータを暗号化する要件

暗号化SDKを使用して暗号化されたファイルをLambda関数でエンベロープして保存する

AWS Lambda環境変数の最大サイズは512KBで、AWS KMSの「暗号化」APIには数KBの制限があるため、上記の標準的な暗号化手段だけでは1MBのデータ暗号化は実現不可能です。 したがって、1 MBを暗号化するには、暗号化SDKを使用して、暗号化されたファイルをLambda関数でエンベロープする必要があります。

定期実行処理を行う

一定間隔で実行されるCloudWatchイベントとLambda関数を統合する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/RunLambdaSchedule.html

DynamoDBと連携して非同期処理を行う

Invoke APIを使用してLambda関数を呼び出し、InvocationTypeをEventに設定する

Dead Letter Queueを設定する

DeadLetterConfigパラメーターを使う。

https://dev.classmethod.jp/articles/lambda-supports-dead-letter-queue/

関数の同時実行数の計算

同時実行= 1秒あたりの呼び出し数 × 秒単位の平均実行時間

イベント数 平均実行時間
10 5秒

この場合、
10  × 5 = 50
https://www.sunnycloud.jp/column/20210818-01/#:~:text=Lambda関数の同時実行,することができます。

CodeBuild

ビルド実行エラーのデバック方法

  • CloudTrailを有効にする
  • S3とCloudWatchの統合を有効にする

CodeCommit

commitに反応するアクションを設定する

CloudWatchイベントと連携する。

ALB

クライアント固有のIPアドレスを取得する設定

X-Forwarded-Forヘッダーを確認する。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/x-forwarded-headers.html#x-forwarded-for

SQS

メッセージの重複排除する方法

メッセージ重複排除 IDを設定する。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagededuplicationid-property.html

指定した期間コンシューマーに見えなくする設定

遅延キューを使う。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

X-Ray

使用時の考慮事項

  • X-Rayではサブセグメントを作成して、AWS サービスと AWS SDK で作成するリソースへの呼び出しを記録できる
  • セグメントとサブセグメントには、オブジェクトと配列を含む、任意の型の値を持つ 1 つ以上のフィールドが含まれたメタデータオブジェクトを含めることができる

ECSでX-Rayを使う設定方法

  • X-Rayデーモンを実行するDockerイメージを作成して、ECSクラスターにデプロイする
  • タスク定義でUDP2000のトラフィックを許可する

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-daemon-ecs.html

適切なセグメント検索の方法

  • X-Rayコンソールでフィルター式を使う
  • GetTraceSummaries APIを使い特定の情報に関連付けられたセグメントを検索する

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-console-filters.html

IAM

一時的なセキュリティ認証情報を使用する

GetSessionToken APIを使う。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_request.html

ECS

コンテナーをグループ化する

クラスタークエリ言語を使う。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cluster-query-language.html

Cognito

一時的な特権制限付きの認証情報を利用するため、ユーザーに渡される情報

Cognito IDが渡される。

AWS AppSync

モバイルアプリデータを同期する

AWS AppSyncを使用することで、1以上のデータソースから安全にアクセスでき同期も容易にできる。

https://aws.amazon.com/jp/appsync/

KMS

S3に暗号化した大容量ファイルをアップロードする時にAccess Denied (アクセス拒否)エラーが発生する場合の対処方法

  • ユーザーにkms:Encrypt権限を付与する
  • ユーザーにkms:Decrypt権限を付与する
  • AWS CLIによるマルチパートアップロードを実行する

暗号化プロセス

  • 毎回キーをローテートできる
  • CMKを使用して暗号化キーを生成する
  • ログ管理はKMS上で実行するか、CloudTrailを利用する

エンベロープ暗号化

GenerateDataKeyを使う。

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/concepts.html#enveloping

RDS

3ヶ月保持する必要があるバックアップ要件の対応

CloudWatchでcronイベントを作成し、スナップショット機能をトリガーするAWS Lambda関数を利用する。
RDSの自動バックアップだと最大保持期間が35日なので要件を達成できない。

S3

全てのトラフィックが暗号化されているのを確認する方法

aws:SecureTransportがfalseであるトラフィックを拒否するポリシーを付ける。
明示的に拒否するポリシーを設定するのがベストプラクティス。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-bucket-policy-for-config-rule/

Dev-kentaDev-kenta

Lambda

関数の同時実行数

関数ごとに同時実行数を設定することが可能。
アカウントの同時実行数に達してしまった場合に使う?

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-scaling.html

関数のスケール

呼び出しが増加すると関数はスケールアップする。

最初のイベントの処理中に関数を再度呼び出すと、Lambda は別のインスタンスを初期化し、関数は 2 つのイベントを同時に処理します。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-scaling.html

JaveのLambda関数のベストプラクティス

Javaライブラリを/libディレクトリに配置してパッケージの解凍時間を短縮する。

Elastic Beanstalk

更新に失敗した場合にサイトを落とすことが許容されないデプロイ要件

変更不可(イミュータブル)を使う。
新しいインスタンスにデプロイし、更新が成功した場合にトラフィックを切り替えることが可能。
ローリングと比較してもデプロイの失敗の影響は最小限になる。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/using-features.deploy-existing-version.html

新しい環境を作る時

開発環境を作成済みで、本番環境を作る際にEC2のインスタンスタイプ等を変更する場合はコンソールから新しい環境を作るページの詳細でインスタンタイプを変更する。

Cognito

ユーザーに一斉通知する仕組み

プッシュ同期を使う。
CognitoはIDとデバイス間の関連付けを追跡するので、プッシュ同期を使うことで各デバイスにSNSメッセージを送ることが可能。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/push-sync.html

CloudWatch

フィルターを作成したのに結果が返ってこないケース

新しく作成したフィルターは、フィルター作成後に保存されたLogしか対象にならないため。

同時ユーザー数を監視したい

標準ではメトリクスは用意されていないため、カスタムメトリクスを使う。

SQS

各送信者のメッセージを順序付けする

メッセージグループIDを使用する。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html
https://dev.classmethod.jp/articles/sqs-new-fifo/

重複処理を回避する仕組み

SWFと合わせて使うのが一つの方法。
選択肢にFIFOキューを使うものやStep Functionsでも同じように重複回避はできる?と思う。

STS

エンコードされたエラーメッセージをデコードする

DecodeAuthorizationMessageを使用する。

https://docs.aws.amazon.com/STS/latest/APIReference/API_DecodeAuthorizationMessage.html

アプリケーションにロールを引き受けさせる

STS AssumeRole API オペレーションを呼び出して、使用するロールの ARN を渡します

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-api.html

CloudFormation

ローカルアーティファクトのアップロード

aws cloudformation packageを使用して、S3を参照するようにテンプレートを置き換えることが可能。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-cli-package.html

DynamoDB

DynamoDBストリーム

Lambda関数をトリガーする場合は、同期的になる。非同期ではないので注意。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.Lambda.html

ピーク時間以外でのScanを高速化するソリューション

制限パラメータを使用した並列スキャンを実行する。
並列スキャンはパフォーマンスの向上に役立つ。制限パラメータを合わせて使用することで消費されるプロビジョニング済みのスループットを制限できる。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Scan.html#Scan.ParallelScan

テーブル全体のscan最適化

並列scanを使う。
デフォルトでは、Scan オペレーションは、データを順次処理する。
そのため、スキャンするテーブルまたはインデックスが大きいほど、Scan を完了するのに時間がかかる。
最適化するためにScan オペレーションでは、テーブルまたはセカンダリインデックスを論理的に複数のセグメントに分割し、複数のアプリケーションワーカーがセグメントを並行してスキャンすることができる。

IAM

ポリシーの検証

  • IAM Policy Simulatorを使用する
  • DryRun引数を使って事前に検証する

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_testing-policies.html

ウェブ ID フェデレーション

一時的な認証情報を作成できる。
Readshiftなどの認証情報をアプリケーションに埋め込むのは推奨されていないので、ウェブ ID フェデレーションを使う。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_oidc.html

S3

バケットへのアクセスをIPアドレスで制限する

バケットポリシーを使う。
ACLやIAMポリシーではIPアドレスでの制限は対応していないため。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-3

独自の暗号化キーによるSSE-Cを使用したデータ保護

以下のリクエストヘッダーを使用する。

  • x-amz-server-side​-encryption​-customer-algorithm
  • x-amz-server-side​-encryption​-customer-key
  • x-amz-server-side​-encryption​-customer-key-MD5

x-amz-server-side​-encryption​-customer-key-AWS256は指定できない。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/specifying-s3-c-encryption.html

ElastiCache

キャッシュミスが発生した場合にRDSから取得する

遅延読み込みキャッシュ戦略を使う。

常に ElastiCache キャッシュに最初にリクエストを行います。データがキャッシュにあり最新である場合、ElastiCache はアプリケーションにデータを返します。データがキャッシュにないか期限切の場合、アプリケーションはデータストアに対してデータをリクエストします。

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/Strategies.html#Strategies.LazyLoading

CodeBuild

ビルドの実行権限しか持っていない場合にビルドコマンドをオーバーライドする方法

AWS CLI の start-build コマンドを実行し、ビルド仕様をオーバーライドすることができる。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html#build-spec-ref-name-storage

Dev-kentaDev-kenta

API Gateway

特定のユーザーのみにAPIの使用を許可する

使用量プランを利用することで承認済みリクエストレートとクォータによってAPIのアクセスを許可することができる。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-usage-plans.html
https://dev.classmethod.jp/articles/usage-plan-for-api-gateway/

WEBサーバーをカスタムデータマッピングを持つAPI Gatewayと統合する

HTTPプロキシ統合およびHTTP統合を実施することが必要。API Gatewayの統合タイプはHTTP_PROXYおよびHTTPを選択する。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-integration-types.html

504エラーが発生している原因

  • Lamnda関数が29秒以上でAPI Gatewayのタイムアウトエラーが発生している
  • INTEGRATION_TIMEOUTが発生している

INTEGRATION_TIMEOUTが発生するのはLambda関数ではなくてAPI Gatewayの方。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/supported-gateway-response-types.html

APIリクエストにはクエリ文字列パラメーターを含める

リソースのメソッドリクエストを設定する。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-method-settings-method-request.html

カナリアリリース方法

ステージ変数でAdditional versionを利用してカナリアリリースを実施する。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/canary-release.html

一定期間内にバックエンドから提供されたリクエスト数を調べる

CloudWatchのCacheMissCountメトリクスを使用する。

  • CacheHitCountは指定された期間内に API キャッシュから配信されたリクエスト数
  • CacheMissCount はAPI キャッシュが有効になっている特定の期間におけるバックエンドから提供されたリクエスト数

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html

外部のREST APIをインポートする

AWSコンソールからSwaggerまたはOpenAPI定義からインポートする。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/create-api-using-swagger.html

Lambda

OAuthまたはSAMLに類似した認証方式のLambdaオーソライザー

トークンベースのものを使う。

解凍されたパッケージが大きい場合の対処方法

展開パッケージのサイズ制限は250 MB。
なのでそれを超える場合は余分なファイルを/ tmpディレクトリにロードして、展開後のパッケージサイズを250MB以下にして対応する。

DynamoDB

GSIでのキャパシティユニットの消費

GSIはより多くのRCUとWCUをプロビジョニングする必要がある。
事前にプロビジョニングしていたテーブルで新たにGSIを追加した場合は想定よりも多くのキャパシティユニットを必要としてしまうことを考慮に入れる。

期間をソートするインデックスを追加することが必要な要件

LSIを追加する。
例えば主キーに設定されているユーザーID以外に投稿時間をソートキーとして追加して、1ヶ月や1週間など期間で絞り込むクエリ操作をする。

特定のデータを取得するにはQuery リクエストを指定する際にはグローバルセカンダリインデックスではなく、ローカルセカンダリーインデックスが最適です。

特定の期間での絞り込みなどの要件ではGSIよりLSIが適切?

StreamViewTypeの設定方法

項目 内容
KEYS_ONLY 変更されたアイテムのキー属性のみがストリームに書き込まれます。
NEW_IMAGE アイテムが変更された後に表示されるように、アイテム全体がストリームに書き込まれます。
OLD_IMAGE 変更される前のアイテム全体がストリームに書き込まれます。
NEW_AND_OLD_IMAGES アイテムの新しいアイテムイメージと古いアイテムイメージの両方がストリームに書き込まれます。

テーブル更新前のデータをS3に保存するなどの要件だった場合は、OLD_IMAGEを使う。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Streams.html

個々の書き込み要求に対して、操作の影響を受けたテーブルとセカンダリインデックスの値を返す

ReturnConsumedCapacityパラメーターにINDEXESの値を追加する設定を行う。

SQS

CloudFormation

条件を評価する入力内容を定義するセクション

Parametersセクションを使う。

AWS :: Lambda :: Functionリソースのパラメーター設定

ZipFileパラメーターを設定する。

Parametersセクション:

条件において評価する入力を定義します。これらの入力パラメータの値に基づいて、条件は true または false と評価されます。条件で擬似パラメータを評価する場合は、このセクションで擬似パラメータを定義する必要はありません。擬似パラメータはCloudFormation によって事前に定義されています。

Conditionsセクション

組み込み関数を使用して条件を定義します。これらの条件はCloudFormation が関連するリソースをいつ作成するかを指定します。

Resources および Outputsセクション

条件付きで作成するリソースまたは出力と条件を関連付けます。CloudFormation は、true に関連付けられたエンティティを作成し、false に関連付けられたをエンティティを無視します。Condition キーと条件の論理 ID を使用して、リソースまたは入力と関連付けます。条件付きでプロパティを指定するには、Fn::If 関数を使用します。

ヘルパースクリプト

名前 内容
cfn-init リソースメタデータの取得と解釈、パッケージのインストール、ファイルの作成、およびサービスの開始で使用します。
cfn-signal CreationPolicy または WaitCondition でシグナルを送信するために使用し、前提となるリソースやアプリケーションの準備ができたときに、スタックの他のリソースを同期できるようにします。
cfn-get-metadata 特定のキーへのリソースまたはパスのメタデータを取得するために使用します。
cfn-hup メタデータへの更新を確認し、変更が検出されたときにカスタムフックを実行するために使用します。

EC2インスタンスでパッケージを動的にインストールするなどの要件ではcfn-initを使う。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-init.html

変更内容を事前確認する

変更セットを使用して、実行中のリソースにどのような影響がある確認できる。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html

RDS

Auroraで書き込み用大容量インスタンスと小規模の読み込み用インスタンスを使い分ける方法

それぞれの処理に対応したカスタムエンドポイントを作成して、トラフィックを処理できるようにする。

https://aws.amazon.com/jp/about-aws/whats-new/2018/11/amazon-aurora-simplifies-workload-management-with-custom-endpoints/

RDS DBインスタンスの拡張モニタリングで取得出来るメトリクス

  • RDS Childプロセス
  • RDS プロセス
  • OSプロセス

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Monitoring.OS.html

KMS

最大データサイズ

4kb

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/programming-encryption.html

オンプレミスのキー管理システムからデータの暗号化と複合化を実行するコードを維持せずに、AWS任せる要件

用意した暗号化キー(SSE-C)でサーバー側暗号化を実施する。

CodeCommit

開発者にCodeCommitへのアクセス許可を設定する

  • 新しいSSHキーを生成して公開SSHキーを開発者の各IAMユーザーに関連付ける
  • HTTPS Git認証情報を設定する

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up.html

別のコードリポジトリからの移行

次の作業が必要

  • CodeCommit に必要な初期セットアップを完了します。
  • CodeCommit リポジトリを作成します。
  • リポジトリをクローンし、CodeCommit にプッシュします。
  • CodeCommit リポジトリのファイルを表示します。
  • CodeCommit リポジトリをチームと共有します。

CodeDeploy

ロールバックが実行された時のデプロイIDの挙動

新しいデプロイIDが付与される。
以前にデプロイされたアプリケーションのリビジョンを新しいデプロイとして再デプロイするため。

インプレースデプロイのイベントフック実行順序

以下を参照

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html#reference-appspec-file-structure-hooks-run-order

Kinesis Data Streams

ProvisionedThroughputExceededExceptionエラーが発生して場合

  • エクスポネンシャルバックオフを実施
  • バッチ処理(Lambda等)を並列処理をさせて、高速分散化させる

シャードの分割は本質的な解決にはならない。
ProvisionedThroughputExceededExceptionエラーはKinesis自体のパフォーマンス不足というよりは、呼び出す回数が上限を超過しないように調整することが必要なため。

Elastic Beanstalk

依存関係を解決してデプロイする方法

多数のEC2インスタンスの複雑な依存関係を設定した上で、Elastic Beanstalkを利用してデプロイを実施すると、デプロイ中に依存関係の検証が発生してしまうため、デプロイに時間を有することになります。これを解決するためには、CodeBuildの最後の段階でソースコードの依存関係をバンドルすることが必要です。

デプロイしたアプリケーションのCPU利用率の負荷が高い場合

CPUをモニタリングしたAuto Scaling グループを設定する。

バージョン更新する方法

zipファイルとしてパッケージ化してeb deploy コマンドでデプロイすることで新しいバージョンを実行できる。

デプロイ時に利用するサービス

  • CodePipeline
  • CloudFormation

X-Ray

トレースデータにインデックスを付ける

Annotation(注釈)を使用する。

X-Rayトレースデータをデバックアプリケーション上に表示する方法

  • GetTraceSummaries APIを使用してアプリケーションのトレースIDのリストを取得する。
  • BatchGetTraces APIを使用してトレースのリストを取得する。

PutTraceSegments APIを使用して、カスタムセグメントを送信するカスタムコードを実装する

サブセグメントを含める必要がある。

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-api-segmentdocuments.html

S3

SAM上でS3バケットの読み取りアクセス権を付与する

S3ReadPolicyを設定する。

CLIでリストコマンドでページを分割して実行するオプション

  • --max-items オプション
  • --page-size オプション
    を使う。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-pagination.html

静的ウェブサイトをホストする際の前提条件

  • ドメインネームとバケットネームが同じ
  • 登録済みドメインであること

Cognito

認証を必要としないゲストユーザーに一時認証情報を提供する仕組み

Amazon Cognito ID プールを使う。

ユーザプールは Amazon Cognito のユーザディレクトリです。ユーザープールを使用すると、ユーザーは Amazon Cognito を通じてウェブまたはモバイルアプリにログインできます。また、ユーザーは Google、Facebook、Amazon などのソーシャル ID プロバイダー、および SAML ベースの ID プロバイダー経由でユーザープールにサインインすることもできます。これは通常のユーザー認証に利用するものですのでゲストユーザー用ではないため不正解です。

SAML 2.0 によるエンタープライズ ID プロバイダーを使用してサインインする要件

  • IDフェデレーションとCognitoの統合を有効にする
  • AWS Single Sign-On によりOrganizations のすべてのアカウントへの SSO アクセスとユーザーアクセス権限の一元管理を実行する

AutoScaling

手動スケーリングをする際に変更するパラメータ

希望する容量を変更する

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-manual-scaling.html

Dev-kentaDev-kenta

API Gateway

APIリクエストを送信するときに、許可されたクライアントのみがAPI Gatewayキャッシュエントリを無効にする

  • コンソールで [Require authorization (認証が必要)] を有効化する
  • クライアントからCache-Control: max-age=0 ヘッダー設定する
  • キャッシュのデフォルトTTLを0にに設定する

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-caching.html#invalidate-method-caching

プロキシ統合とカスタム統合(非プロキシ統合)の違い

Lambda 非プロキシ統合はより複雑なマッピングを定義したい場合に利用。
プロキシ統合はより簡単なイメージ?

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-integration-types.html
https://qiita.com/yuuwatanabe/items/a3bd65e709f20574b6db

Lambda

グローバルな配信を行っていて、遅延を最小限にしつつプレミアムユーザーだけに限定的な処理をしたいケース

Lambda @ EdgeとCognitoを使用して要件を達成する。
CloudFrontの署名付きURLやCookieでも限定的なコンテンツの配信はできるが、Lambda @ Edgeと比べるとかなりの遅延がある。

VPC内にLambda関数にインターネットアクセスを設定する

  • NATゲートウェイかNATインスタンスを設定する
  • Lambda関数に関連付けられたセキュリティグループにアウトバウンド接続を許可する

https://aws.amazon.com/jp/premiumsupport/knowledge-center/internet-access-lambda-function/

CloudWatch Logsのデータを処理をする際のメモリ使用量の注意

ログ量が多いとメモリを圧迫する。
そのためCloudWatch Logsの有効期限ポリシーを設定する必要がある。

DynamoDB

Lambda関数と統合する方法

  • DynamoDBストリームからLambda関数にレコードを送信するようLambdaに指示するイベントソースマッピングを作成する
  • AWSLambdaDynamoDBExecutionRole管理ポリシーをLambda関数の実行ロールに指定する

SQS

メッセージ処理に失敗した際に他のコンシューマーがメッセージを処理するまでにタイムラグがある場合のリファクタリング

可視性タイムアウト時間を減少させる。

デフォルトの可視性タイムアウトは 30 秒で、最小値は 0 秒、最大スケールは 12 時間です。分散コンシューマの1つがメッセージを受信すると、その特定のメッセージの可視性タイムアウトが期限切れになるまで、メッセージを再度読み取ることはできません。したがって、可視性タイムアウトの設定時間を減少させることで、他のコンシューマーがメッセージを処理するための待ち時間を短縮することができます。

一度に受信できるメッセージ数の上限

10件まで。

他の消費コンポーネントがメッセージを受信および処理するのを防ぐ方法

可視性タイムアウトを使う。
処理の重複防ぐためにバージョン番号を埋め込む方法はKinesisではできるがSQSではできない。

Cognito

認証されていないIDでも特定のコンテンツは参照可能にする

IDプールで設定する。

Amazon Cognito IDプール(フェデレーションID)は、Amazon Cognitoユーザープール、Amazon、Facebook、Google、SAML IDプロバイダーを含むフェデレーションIDプロバイダー、および認証されていないIDを介したユーザー認証を実行可能です。これにより、独自のバックエンド認証プロセスを介してユーザーを登録および認証できます。したがって、Amazon CognitoでIDプールを作成し、認証されていないIDへのアクセスを有効にすることが、正しい実装方法となります。

X-Ray

X-Rayとの通信を容易にするためにAWS Lambdaで使用される環境設定

_X_AMZN_TRACE_ID

_X_AMZN_TRACE_IDにはサンプリングデシジョン、トレース ID および親セグメント ID が含まれるトレースヘッダーが含まれます。関数が呼び出されたときに Lambda がトレースヘッダーを受信すると、ヘッダーは _X_AMZN_TRACE_ID は環境変数の入力に使用されます。トレースヘッダーが受信されない場合、Lambda がそれを生成します。

AWS_XRAY_CONTEXT_MISSING

AWS_XRAY_CONTEXT_MISSINGはX-Ray SDK を使用して、関数が X-Ray データを記録する際にトレーシングヘッダーを使用できない場合の動作を決定します。Lambda はデフォルトでこの値を LOG_ERROR に設定します。

AWS_XRAY_DAEMON_ADDRESS

AWS_XRAY_DAEMON_ADDRESSはX-Ray デーモンのアドレスを IP_ADDRESS:PORT 形式で表示します。X-Ray デーモンのアドレスを使用して、X-Ray SDK を使用せず X-Ray デーモンにトレースデータを直接送信できます。

データをX-RayにアップロードするためにX-Rayデーモンに設定するIAMポリシー

X-RayデーモンにAWSXrayWriteOnlyAccess管理ポリシーのアクセス許可を設定する。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-configuration-debugging.html

様々な外部アプリケーションからの呼び出しリクエスト処理をトレースする

  • PutTraceSegments APIを使用して、セグメントドキュメントをX-Rayに直接送信する
  • セグメントドキュメントをX-Ray APIに送信する代わりに、セグメントとサブセグメントをX-Rayデーモンに送信し、それらをバッファリングしてバッチでX-Ray APIにアップロードする
    どちらかの方法で要件を実現する。

AWS SDK呼び出しの場合は名前空間サブセグメントフィールドに指定する値

AWSを指定する。

セグメントに保存する追加のカスタムデータを設定する場所

メタデータに設定する。

ElasticBeanStalk

外部HTTP Web APIに送信するすべてのコールと、SQLデータベースクエリをトレースする

.ebextensionsディレクトリにxray-daemon.config構成ファイルを含める。

CloudWatch

連続する直近の 3 つの期間内の既存の全てのデータポイントが上回った時にアラームを飛ばす設定

評価期間とデータポイントの両方で3を指定する。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html

CloudFormation

エクスポートされた値を別のスタックで使用する関数

Fn::ImportValue関数を使う。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

FindInMap関数

MapName

Mappings セクションで宣言された、キーと値を含むマッピングの論理名。

TopLevelKey

最上位のキー名。この値は、キーと値のペアのリストです。

SecondLevelKey

2 番目のレベルのキー名で、TopLevelKey に割り当てられたリストのキーの 1 つに設定されます。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-findinmap.html

KMS

CloudWatch

AlexaスキルでS3のAlexaLogバケットに保存されたログデータを確認する

console.logコードをスキルコード内に設定して、CloudWatch統合機能をS3で使用する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/S3Export.html

ELB

X-Forwarded-Forヘッダーを使用せずにユーザーの元のソースIPアドレスとソースポートを取得する

NLBを使用する。

NLBは接続リクエストを受信すると、デフォルトルールのターゲットグループからターゲットを選択して、リスナー構成で指定されたポート上の選択したターゲットへの TCP 接続を開きます。 着信接続は変更されないため、アプリケーションソフトウェアはX-Forwarded-Forをサポートする必要はありません。

https://dev.classmethod.jp/articles/nlb-support-tls-termination-and-access-log/

ECS

暗黙的または明示的に指定した制約に従うタスク配置戦略

randamが要件を満たせる。

randomは、インスタンスにタスクをランダムに配置しますが、暗黙的または明示的に指定した他の制約を引き続き尊重します。

CodeCommit

CodeBuild

ビルド時間が長くてタイムアウトするのを防ぐ

構成されたタイムアウトの期限が切れると、ビルドプロセスが自動的に終了します。 デフォルトは60分です。AWS CLIではqueuedTimeoutInMinutesOverride: を設定します。これは、ビルドをキューに入れてからタイムアウトするまでの時間 (分) を指定するオプションで、その最小値は 5 分、最大値は 480 分 (8 時間) でタイムアウト時間を設定することが可能です。

ビルド段階でのプロジェクトアーティファクトの構成

CodeBuildに対してS3へのアクセス許可を与える。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html

ビルド失敗のデバッグ方法

ローカル環境でビルドを実行する。

AWS CodeBuildのローカルビルドサポートでは、ソースコードの場所を指定し、ビルド設定を選択するだけで、CodeBuildはコードのコンパイル、テスト、パッケージ化のためのビルドスクリプトを実行します。これにより、BuildSpecファイルにおけるコマンドまたは設定上の問題を確認することができます。

CodeDploy

デプロイの種類

Canary

トラフィックは2つの増分でシフトされます。事前定義されたカナリアオプションから選択して、最初の増分で更新されたLambda関数バージョンにシフトされるトラフィックの割合と、残りのトラフィックが2番目の増分でシフトされるまでの間隔を分単位で指定できます。

Linear

トラフィックは、増分ごとに等しい分数で等間隔にシフトされます。各増分でシフトされるトラフィックの割合と各増分間の分数を指定する定義済みの線形オプションから選択できます。

All-at-once

すべてのトラフィックは、元のLambda関数から更新されたLambda関数バージョンに一度にシフトされます。 さらにAWS Lambdaデプロイで利用可能な事前定義された設定を利用することができます。

IAM

EC2インスタンスに設定していたアクセスキーとシークレットアクセスキーから、IAMロールに切り替えれる

インスタンスプロファイルにIAMロールを設定する。

SWF

解析結果の取得回数を記録管理する

SWFマーカーを使用する。

マーカーを使用して、アプリケーション固有の用途に合わせてワークフロー実行履歴においてイベントを記録できます。

https://docs.aws.amazon.com/ja_jp/amazonswf/latest/developerguide/swf-dg-markers.html

CLI

リージョンを指定するオプション

--region を使用する。

Route53

地理的近接性ルーティング

トラフィックフローを使用するのが必須。

Kinesis

リアルタイムに迅速に解析してレポートすることが要件の場合

Kinesis Data Streamsと分析用にEMRを使用する。

ホットシャードとコールドシャード

ホットシャードは分割
コールドシャードはマージ

https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-using-sdk-java-resharding-strategies.html

RDS

オンプレのMicrosoft SQL Serverからの移行時に合わせて データを暗号化する

  • インスタンス起動時に暗号化する設定を有効にする
  • 透過的なデータ暗号化 (TDE) を使用する

セキュリティ

PFSに対応しているサービス

  • CloudFront
  • ELB

モニタリング

EC2のシステムメモリメトリクスをスケジュール通りに定期的に収集する設定

  • CloudWatchエージェントを利用する
  • システムメトリクスを収集するcronジョブを利用する
Dev-kentaDev-kenta

API Gateway

別のアプリケーションとの連携用にAPIを設定する

使用量プランを使うことで、ビジネス要件および予算の制約に合った承認済みのリクエストレートとクォータで顧客にAPIを提供できる。

https://dev.classmethod.jp/articles/try-api-gateway-usage-plan/

Lambda

東京リージョンでの同時実行数

東京リージョンでは、1000の同時実行制限が課せられています。アカウントの同時実行制限が1000で、10の機能がある場合、1つの機能の制限を200に、別の機能の制限を100に指定できます。残りの700は他の8つの機能で共有されます。AWS Lambdaは、予約されていない同時実行プールを最低100の同時実行で保持する必要があり、アカウントの合計制限が1000である場合、900を個々の機能に割り当てることに制限されます。

予約されていない同時実行プールを最低100の同時実行で保持する必要がある。
つまり2つのLambda関数をデプロイしている場合に、両方を効率的に処理させるためには最大でも450ずつに同時実行数を制限しておかなければならない。

割り当てられているCPUを増やしてパフォーマンスを改善する設定

メモリを大きいものに変更する。
メモリを増やすことによって、Lambdaに割り当てられるCPUの比率が増える。
CPUを手動で設定することはできない。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

関数のセットアップコードを実行したり、LambdaランタイムAPIから呼び出しイベントを読み取る方法

カスタムランタイムを使用する。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-custom.html

KinesisまたはDynamoDBストリームを処理するLambda関数の同時実行数

シャード数が同時実行の単位になる。
シャード数が50
Lambdaのデータ処理平均時間10秒
ストリーム1秒あたり50個受信

この場合シャード数の50が同時実行数になる。

同時実行数は2 桁のミリ秒で応答する要件

プロビジョニングされた同時実行数を設定する。

有効にすると、プロビジョニングされた同時実行は、2 桁のミリ秒で応答するように機能を初期化し、ハイパー対応状態になります。

https://blog.serverworks.co.jp/tech/2020/03/03/provisioned-concurrency/

ヘッダーおよびクエリ文字列パラメーターを受け入れるカスタム承認スキームを使用して実装する

リクエストパラメータベースの Lambda オーソライザーを使用する。

Lambda オーソライザーの種類

トークンベース

トークンベース の Lambda オーソライザー (TOKEN オーソライザーとも呼ばれる) は、JSON ウェブトークン (JWT) や OAuth トークンなどのベアラートークンで発信者 ID を受け取ります。

リクエストパラメータベース

リクエストパラメータベースの Lambda オーソライザー (REQUEST オーソライザーとも呼ばれる) は、ヘッダー、クエリ文字列パラメータ、stageVariables、および $context 変数の組み合わせで、発信者 ID を受け取ります。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

InvalidParameterValueExceptionが返されるケース

AWS Lambdaが引き受けることができないCreateFunction APIでIAMロールを設定しているのが原因として考えられる。

DynamoDB

インデックスを利用しないで、できるだけ早くDynamoDBからコンテンツを取得する

並列スキャンを利用する。

並列スキャンは、その名の通り、1つのテーブルに対するスキャンリクエストを並列に行うための仕組みで、テーブルの操作領域を複数のセグメントに分割し、各セグメントに並行してスキャンリクエストを実施できます。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Scan.html#Scan.ParallelScan

Auto Scalingグループが設定されたEC 2で変更が別のユーザーによって上書きされるトラブルを解決するソリューション

1つのプロパティを指定してテーブルのマッピングクラスにバージョン番号を格納することにより、アプリケーションのソースコードにオプティミスティックロックを実装する。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html

強い整合性で別のソートキーを使う要件

別のソートキーを使用したローカルセカンダリインデックスを設定して、新しいテーブルを作成する。
強い整合性読み込みではGSIは使えない点に注意する。

SQS

コンシューマの処理時間が予測できない場合に重複メッセージを除く方法

changeMes​​sageVisibility APIをコンシューマごとに使用して、可視性時間を設定する。
可視性タイムアウトではコンシューマごとの設定ができないため、コンシューマの処理時間が予測できない場合は適していない。

最大メッセージサイズ

256kb

KMS

AWS KMS SDKでの復号化する設定

  • 暗号化に使用したデータキーに基づいて復号アルゴリズムが復号を実施
  • AWS 暗号化 SDKを利用してデータを復号する

Kinesis

X-Ray

Elastic Beanstalk

10TB相当のスキャンファイルを保存していて、そのファイルを検索する仕組みを構築する

検索にはAmazon CloudSearchかElasticSearchを使用する。
Elastic Beanstalkによりワーカー環境を展開する。

CloudFormation

テンプレート内のリソースから属性の値を返す組み込み関数

!GetAtt関数を使う。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html

Lambda関数をインラインに含める際のパラメータ

Code>ZipFileにインラインで記述する

https://qiita.com/kihoair/items/fe204fc8582946646d07

最新のAMI IDを自動更新する設定

  • Systems Managerのパブリックパラメータストアで最新のAMI IDを参照する
  • AMIを更新する場合はCloudFormationスタックを更新する

CloudFormationからSystems ManagerのパブリックパラメータストアのAMI IDを参照することで、テンプレートやパラメータをいじらずにスタックを更新すれば最新AMIに更新することができます。CloudFormationテンプレートの既存のパラメーターセクションを使用して、Systems Managerパラメーターと他のパラメーターを定義できます。

サーバレスアプリでデプロイプロセスを自動化する際に利用するコマンド

sam deploy を使用する。
sam package は以前は必要だったがsamのアップデートにより不要になった?

https://dev.classmethod.jp/articles/aws-sam-simplifies-deployment/

アカウント番号をスタックのOutputとして出力する

AWS :: AccountIdを使用する。

CodeCommit

CodeBuild

依存関係を解消して処理を高速化する設定

ローカルキャッシュを有効にする。

ビルドでローカルキャッシュを有効にするには、キャッシュ方法に [Local] を選択して設定します。これにより、CodeBuild はあるビルドの終了後、新たなビルドのために一定期間キャッシュを維持することができます。

CodeDeploy

インプレースデプロイを利用できるもの

  • EC2
  • オンプレ環境

https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployments.html

STS

認証情報の有効期間のデフォルト値

1時間

https://dev.classmethod.jp/articles/extending-the-expiration-of-the-temporary-credential-acquired-by-assumerole/

SAMLと互換性がないIDストアで、IAMを使用してオンプレミスのLDAPディレクトリサービスを統合する要件

オンプレミスのデータセンターでカスタムIDブローカーアプリケーションを作成し、STSを使用して短命のAWS認証情報を発行することで要件を満たせる

一時的なセキュリティ認証情報を取得する

GetSessionTokenを使う。
資格情報は、アクセスキーID、シークレットアクセスキー、およびセキュリティトークンで構成される。

https://blog.serverworks.co.jp/summary-of-getting-security-credentials-from-sts
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_control-access_getsessiontoken.html

S3

Glacierに保存されているデータを必要なデータだけを5時間以内に取得する

標準取り出しでAmazon S3 Glacier Selectを使う。

[標準] 取り出しの場合、アーカイブは通常、3~5 時間以内に使用可能になります。

SSE-S3を使用して暗号化する要件

x-amz-server-side-encryption ヘッダーにAES-256を設定する。

ECS

クラスターの各タスクは複数AZに均等に配置する要件のタスク定義

spreadを使用して、filed値にattribute:ecs.availability-zoneを設定する。

EFS

EFSマウントヘルパーをインストールし、データ転送を暗号化する要件

  • マウントヘルパーユーティリティで暗号化オプション「-o tls」を使用する
  • コンソールまたは実行コードによって、EFSファイルシステムIDをEFS APIから取得する

OpsWorks

二つの言語で作成されたアプリケーションを管理する要件

1つのスタック内に2つのレイヤーが必要。また、これを記述するレシピは1つとする。
例えばRubyで書かれたアプリケーションが存在していて、新たにNode.jsのアプリを追加する場合は、
1スタック、2レイヤー、1レシピとなる。

このスクラップは2021/09/28にクローズされました