AWS Developer Associate サンプル問題の日本語訳

# はじめに
本記事は、AWS Developer Associate(DVA)のサンプル問題の日本語訳(ほぼGoogle翻訳 ＋ 一部意訳)です。
現在(2020/1/17時点)サンプル問題の日本語訳が公式HPから公開されていないので、自分用のメモとして記載します。翻訳や記載の誤りなどあれば、コメント/修正リクエストをいただけると幸いです。
また原文にはない個人的感想は区切って追記しています。

翻訳元は以下です。分からない問題がある場合は、原文のリンクを見てください。
[AWS 認定開発者 – アソシエイト](https://aws.amazon.com/jp/certification/certified-developer-associate/)
(上記サイト内右の「サンプル問題をダウンロード」のリンク先）


# 1問目
企業がレガシーアプリケーションをAmazon EC2に移行しています。アプリケーションは、ソースコードに保存されているユーザー名とパスワードを使用して、MySQLデータベースに接続します。 データベースは、Amazon RDS for MySQL DBインスタンスに移行されます。 移行の一環として、会社はデータベース資格情報を保存して自動的にローテーションする安全な方法を実装したいと考えています。

A）データベース資格情報をAmazon Machine Image（AMI）の環境変数に保存します。 AMIを交換して資格情報をローテーションします。

B）データベース認証情報をAWS Systems Manager Parameter Storeに保存します。 資格情報を自動的にローテーションするようにパラメーターストアを構成します。

C）EC2インスタンスの環境変数にデータベース認証情報を保存します。 EC2インスタンスを再起動して資格情報をローテーションします。

D）データベース認証情報をAWS Secrets Managerに保存します。 資格情報を自動的にローテーションするようにSecrets Managerを構成する

<br/>
<br/>


**正解：D**

**解説**
[AWS Secrets Manager]
(https://aws.amazon.com/secrets-manager/)は、データベース、アプリケーション、サービス、およびその他のITリソースへのアクセスに必要な認証情報の保護に役立ちます。 このサービスにより、ユーザーはライフサイクル全体でデータベースの資格情報、APIキー、およびその他の機密情報を簡単にローテーション、管理、および取得できます。
ユーザーとアプリケーションは、Secrets Manager APIを呼び出してシークレットを取得するため、機密情報をプレーンテキストでハードコーディングする必要がなくなります。 Secrets Managerは、Amazon RDS、Amazon Redshift、およびAmazon DocumentDBへ[機密情報のローテーション]
(https://aws.amazon.com/blogs/security/rotate-amazon-rds-database-credentials-automatically-with-aws-secrets-manager/)を提供します。

---
全部の選択肢を一応できなくはないが最適な方法を選択させる問題。A、Cは少しEC2を触っていれば問題外だとわかりますが、BはParameter Storeが単体だと自動更新できないことを知らないと外せない。
参考
[AWSのParameter StoreとSecrets Manager、結局どちらを使えばいいのか？比較]
(https://qiita.com/tomoya_oka/items/a3dd44879eea0d1e3ef5)

---


# 2問目
開発者は、ユーザーがコメントを投稿し、ほぼリアルタイムのフィードバックを受け取ることができるWebアプリケーションを設計しています。
これらの要件を満たすアーキテクチャはどれですか？ （2つ選択してください）

A）AWS AppSyncスキーマと対応するAPIを作成します。 Amazon DynamoDBをデータストアとして使用します。

B）Amazon API GatewayでWebSocket APIを作成します。 AWS Lambda関数をバックエンドとして使用し、Amazon DynamoDBをデータストアとして使用します。

C）Amazon RDSを利用したAWS Elastic Beanstalkアプリケーションを作成します。 存続期間の長いTCP / IPソケットを許可するようにアプリケーションを構成します。

D）Amazon API GatewayでGraphQLエンドポイントを作成します。 Amazon DynamoDBをデータストアとして使用します。

E）Amazon CloudFrontでWebSocketを有効にします。 オリジンとしてAWS Lambda関数を使用し、データストアとしてAmazon Aurora DBクラスターを使用します。

<br/>
<br/>


**正解：A、B**

**解説**
[AWS AppSync]
(https://aws.amazon.com/appsync/)は、ユーザーが1つ以上のデータソースのデータに安全にアクセス、操作、および結合するための柔軟なAPIを作成できるようにすることで、アプリケーション開発を簡素化します。 AWS AppSyncは、GraphQLを使用して、アプリケーションが必要な正確なデータを簡単に取得できるようにするマネージドサービスです。 AWS AppSyncを使用すると、ユーザーは、Amazon DynamoDBを含むさまざまなデータソース上で、[リアルタイム更新]
(https://docs.aws.amazon.com/appsync/latest/devguide/real-time-data.html)が必要なアプリケーションを含むスケーラブルなアプリケーションを構築できます。 [Amazon API Gateway]
(https://aws.amazon.com/api-gateway/)では、ユーザーは、AWSサービス（AWS LambdaやDynamoDBなど）またはHTTPエンドポイントのステートフルフロントエンドとして[WebSocket API]
(https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)を作成できます。 WebSocket APIは、クライアントアプリケーションから受信したメッセージのコンテンツに基づいてバックエンドを呼び出します。 要求を受信して応答するREST APIとは異なり、WebSocket APIはクライアントアプリケーションとバックエンド間の双方向通信をサポートします。

# 3問目
開発者がアプリケーションにサインアップおよびサインイン機能を追加しています。 アプリケーションは、ユーザーのサインインイベントを記録するために、カスタム分析ソリューションへのAPI呼び出しを行う必要があります。
これらの要件を満たすために、開発者はどのアクションの組み合わせを使用する必要がありますか？ （2つ選択してください）

A）Amazon Cognitoを使用して、サインアップおよびサインイン機能を提供します。

B）AWS IAMを使用して、サインアップおよびサインイン機能を提供します。

C）AWS Configルールを設定して、認証後イベントによってトリガーされるAPI呼び出しを行います。

D）Amazon API Gatewayメソッドを呼び出して、認証後イベントによってトリガーされるAPI呼び出しを行います。

E）AWS Lambda関数を実行して、認証後イベントによってトリガーされるAPI呼び出しを行います。

<br/>
<br/>


**正解：A、E**

**解説**
[Amazon Cognito]
(https://aws.amazon.com/cognito/)は、ユーザーのサインアップ、サインイン、およびアクセス制御をWebおよびモバイルアプリケーションにすばやく簡単に追加します。 ユーザーは、AWS Lambda関数を作成して、カスタム分析ソリューションへのAPI呼び出しを行うこともできます
次に、[Amazon Cognitoの認証後トリガー]
(https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-post-authentication.html)でその機能をトリガーします。

---
Amazon Cognitoと認証後に任意の処理をLambdaで行えることを知っていれば解ける。

---

# 4問目
企業がAWSアカウントのREST APIにAmazon API Gatewayを使用しています。セキュリティチームは、別のAWSアカウントのIAMユーザーのみがAPIにアクセスできるようにしたいと考えています。
これらの要件を満たすために、セキュリティチームはどのアクションを組み合わせて実行する必要がありますか？ （2つ選択してください）

A）IAMアクセス許可ポリシーを作成し、各IAMユーザーにアタッチします。 APIメソッド認証タイプをAWS_IAMに設定します。署名バージョン4を使用して、API要求に署名します。

B）Amazon Cognitoユーザープールを作成し、各IAMユーザーをプールに追加します。 APIのメソッド認証タイプをCOGNITO_USER_POOLSに設定します。 Amazon CognitoのIAM認証情報を使用して認証し、IDトークンをリクエストヘッダーに追加します。

C）Amazon Cognito IDプールを作成し、各IAMユーザーをプールに追加します。 APIのメソッド認証タイプをCOGNITO_USER_POOLSに設定します。 Amazon CognitoのIAM認証情報を使用して認証し、アクセストークンをリクエストヘッダーに追加します。

D）各IAMユーザーのみにアクセスを許可するAPIのリソースポリシーを作成します。

E）各IAMユーザーのみにアクセスを許可するAPIのAmazon Cognitoオーソライザーを作成します。 APIのメソッド認証タイプをCOGNITO_USER_POOLSに設定します。

<br/>
<br/>


**正解：A、D**

**解説**
[リソースポリシー]
(https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-resource-policies-examples.html#apigateway-resource-policies-cross-account-example)を使用して、[署名バージョン4]
(https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)（SigV4）プロトコルを使用して、別のAWSアカウントのユーザーに1つのAWSアカウントへのAPIアクセスを許可できます。

---
Amazon CognitoがIAMユーザでなくアプリなどAWSアカウント以外のユーザ認証を行い、IAM Roleで認可を行う性質を理解していればB、C、Eは選択肢から外せる。
参考
[Amazon CognitoとUser PoolsとIAMの位置付けと混乱](https://qiita.com/ttwwiitttteerr0/items/19c21f7d53f64c7a9984)

---

# 5問目
開発者は、テキストファイルを.pdfファイルに変換するアプリケーションを構築しています。 テキストファイルは、別のアプリケーションによってAmazon S3バケットに書き込まれます。 開発者は、Amazon S3に到着したファイルを読み取り、AWS Lambdaを使用して.pdfファイルに変換したいと考えています。開発者は、Amazon S3およびAmazon CloudWatch Logsへのアクセスを許可するIAMポリシーを作成しました。
Lambda関数に正しいアクセス許可があることを確認するために、開発者はどのアクションを実行する必要がありますか？

A）AWS IAMを使用してLambda実行ロールを作成します。 IAMポリシーをロールにアタッチします。 Lambda関数にLambda実行ロールを割り当てます。

B）AWS IAMを使用してLambda実行ユーザーを作成します。 IAMポリシーをユーザーにアタッチします。 Lambda実行ユーザーをLambda関数に割り当てます。

C）AWS IAMを使用してLambda実行ロールを作成します。 IAMポリシーをロールにアタッチします。 IAMロールをLambda関数の環境変数として保存します。

D）AWS IAMを使用してLambda実行ユーザーを作成します。 IAMポリシーをユーザーにアタッチします。 IAMユーザー認証情報をLambda関数の環境変数として保存します。

<br/>
<br/>


**正解：A**

**解説**
AWS Lambda関数の[実行ロール]
(https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)は、AWSサービスとリソースにアクセスする許可を付与します。ユーザーは、関数が作成されるときにこのロールを提供し、Lambdaは関数が呼び出されるときにロールを引き受けます。

---

Lambdaとロールの関係を理解していればAだとわかる。消去法でいくとBとDはLambda実行ユーザをLambdaに割り当てるというよくわからない記述があるので×。CはIAMロールは環境変数に割り当てるという誤った記述があるので×。したがってAが残る。

---

# 6問目
会社には、地理的に複数の場所にAWSワークロードがあります。 開発者がus-west-1リージョンにAmazon Auroraデータベースを作成しました。 データベースは、お客様が管理するAWS KMSキーを使用して暗号化されます。 ここで、開発者はus-east-1リージョンに同じ暗号化データベースを作成したいと考えています。
開発者はこのタスクを達成するためにどのアプローチを取るべきですか。

A）us-west-1リージョンにデータベースのスナップショットを作成します。 スナップショットをus-east-1リージョンにコピーし、us-east-1リージョンでKMSキーを指定します。 コピーしたスナップショットからデータベースを復元します。

B）us-west-1リージョンにデータベースの暗号化されていないスナップショットを作成します。 スナップショットをuseast-1リージョンにコピーします。 コピーしたスナップショットからデータベースを復元し、us-east-1リージョンのKMSキーを使用して暗号化を有効にします。

C）データベースの暗号化を無効にします。 us-west-1リージョンにデータベースのスナップショットを作成します。 スナップショットをus-east-1リージョンにコピーします。 コピーしたスナップショットからデータベースを復元します。

D）us-east-1リージョンで、us-west1リージョンからデータベースの最新の自動バックアップを復元することを選択します。 us-east-1リージョンでKMSキーを使用して暗号化を有効にします。

<br/>
<br/>


**正解：A**

**解説**
ユーザーが[暗号化されたスナップショットをコピー]
(https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CopySnapshot.html)する場合、スナップショットのコピーも暗号化する必要があります。 ユーザーがリージョン間で暗号化されたスナップショットをコピーする場合、[KMSキーはリージョン固有]
(https://aws.amazon.com/kms/features/#Secure)であるため、ユーザーはソーススナップショットに使用されるのと同じAWS KMS暗号化キーをコピーに使用できません。 代わりに、ユーザーは宛先リージョンで有効なKMSキーを指定する必要があります。

# 7問目
開発者は、Memcached用Amazon ElastiCacheを企業の既存のレコードストレージアプリケーションに追加して、データベースの負荷を軽減し、パフォーマンスを向上させています。
開発者は、一般的なレコード処理パターンの分析に基づいて、遅延読み込みを使用することにしました。
どの擬似コードの例が遅延読み込みを正しく実装していますか？

A) 

```
record_value = db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key,
record_value)
cache.set (record_key, record_value)
```

B) 

```
record_value = cache.get(record_key)
if (record_value == NULL)
 record_value = db.query("SELECT Details FROM Records WHERE ID == {0}", record_key)
 cache.set (record_key, record_value)
```

C) 

```
record_value = cache.get (record_key)
db.query("UPDATE Records SET Details = {1} WHERE ID == {0}", record_key, record_value)
```

D)

```
record_value = db.query("SELECT Details FROM Records WHERE ID == {0}", record_key)
if (record_value != NULL)
 cache.set (record_key, record_value)
```

<br/>
<br/>


**正解：B**

**解説**
[遅延読み込み]
(https://docs.aws.amazon.com/AmazonElastiCache/latest/mem-ug/Strategies.html#Strategies.LazyLoading.CodeExample)は、レコードの読み込みが必要になるまで遅延されるという概念です。遅延読み込みは最初にキャッシュをチェックします。 レコードが存在しない場合、遅延読み込みはデータベースからレコードを取得し、キャッシュに保存します。

---
この問題に答えるだけならElasticCacheの仕様を把握してなくても消去法で解答できる。AとCはUPDATEなのでそもそも読み込みではないので×。Dはキャッシュアクセスでなく先にQuery実行をしているので×。したがって残ったBが正解。Bは最初にキャッシュへアクセスしている。

---

# 8問目
開発者は、一連のAmazon EC2インスタンスで実行されるアプリケーションのパフォーマンスを追跡したいと考えています。 開発者は、平均および最大リクエスト遅延など、フリート全体の統計を表示および追跡したいと考えています。 開発者は、平均応答時間がしきい値を超えた場合にすぐに通知されることを望んでいます。 これらの要件を満たすソリューションはどれですか？

A）各インスタンスでcronジョブを設定して、応答時間を測定し、Amazon S3バケットに保存されているログファイルを毎分更新します。 Amazon S3イベント通知を使用して、ログファイルを読み取り、新しいエントリーをAmazon Elasticsearch Service（Amazon ES）クラスターに書き込むAWS Lambda関数をトリガーします。 Kibanaダッシュボードで結果を視覚化します。応答時間がしきい値を超えたときにAmazon SNSトピックにアラートを送信するようにAmazon ESを構成します。

B）応答時間をシステムログに書き込むようにアプリケーションを構成します。ログを継続的に読み取り、応答時間をAmazon EventBridgeに送信するようにAmazon Inspectorエージェントをインストールして構成します。 EventBridgeコンソールでメトリックグラフを表示します。応答時間メトリックの平均がしきい値を超えたときにAmazon SNS通知を送信するように、EventBridgeカスタムルールを構成します。

C）応答時間をログファイルに書き込むようにアプリケーションを構成します。インスタンスにAmazon CloudWatchエージェントをインストールして設定し、アプリケーションログをCloudWatch Logsにストリーミングします。ログから応答時間のメトリックフィルターを作成します。 CloudWatchコンソールでメトリックスグラフを表示します。応答時間メトリクスの平均がしきい値を超えたときにAmazon SNS通知を送信するには、CloudWatchアラームを作成します。

D）インスタンスにAWS Systems Managerエージェントをインストールおよび設定して、応答時間を監視し、カスタムメトリックスとしてAmazon CloudWatchに送信します。 Amazon QuickSightでメトリックスグラフを表示します。応答時間メトリクスの平均がしきい値を超えたときにAmazon SNS通知を送信するには、CloudWatchアラームを作成します。


<br/>
<br/>


**正解：C**

**解説**
[Amazon CloudWatch Agent]
(https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)は、ログとメトリックスをCloudWatchにストリーミングするように設定できます。 [メトリックスフィルター]
(https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/MonitoringLogData.html)は、CloudWatch Logsに保存されたログから作成できます。

# 9問目
開発者はアプリケーションをローカルでテストしており、AWS Lambdaにデプロイしています。 パッケージのサイズ制限を維持するために、依存関係は展開ファイルに含まれていませんでした。 アプリケーションをリモートでテストする場合、依存関係がないため、関数は実行されません。
どのアプローチで問題が解決しますか？

A）Lambdaコンソールエディターを使用してコードを更新し、不足している依存関係を含めます。

B）不足している依存関係を持つ追加の.zipファイルを作成し、元のLambdaデプロイメントパッケージにファイルを含めます。

C）Lambda関数の環境変数で欠落している依存関係への参照を追加します。

D）欠落している依存関係を含むLambda関数にレイヤーをアタッチします。

<br/>
<br/>


**正解：D**

**解説**
ユーザーは、AWS Lambda関数を設定して、追加のコードとコンテンツをレイヤーの形で取り込むことができます([AWS Lambda Layer]
(https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html))。 レイヤーは、ライブラリ、カスタムランタイム、またはその他の依存関係を含む.zipアーカイブです。 レイヤーを使用すると、ユーザーはライブラリを展開パッケージに含める必要なく、Lambda関数でライブラリを使用できます。

---
AWS Lambda Layerを知っていれば解ける問題。知らなければほぼ解けなそう

---

# 10問目
開発者は、Amazon API Gatewayを使用するウェブアプリケーションを構築しています。 開発者は
開発および本番（devおよびprod）ワークロード用に異なる環境を維持します。 APIは、開発用と製品用の2つのエイリアスを持つAWS Lambda関数によってサポートされます。
**最小限**の構成でこれをどのように実現できますか？

A）環境ごとにREST APIを作成し、対応するLambda関数のdevおよびprodエイリアスとAPIを統合します。次に、2つのAPIをそれぞれのステージにデプロイし、ステージURLを使用してアクセスします。

B）REST APIを1つ作成し、エイリアスの代わりにステージ変数を使用してLambda関数と統合します。次に、APIを2つの異なるステージ（devとprod）にデプロイし、各ステージで値として異なるエイリアスを使用してステージ変数を作成します。さまざまなステージURLを使用してAPIにアクセスします。

C）REST APIを1つ作成し、Lambda関数のdevエイリアスと統合して、それをdev環境にデプロイします。カナリアがLambda prodエイリアスと統合されるprodのカナリアリリース展開を設定します。

D）REST APIを1つ作成し、Lambda関数のprodエイリアスと統合して、prod環境にデプロイします。カナリアがLambda devエイリアスと統合されるdevのカナリアリリース展開を設定します。

<br/>
<br/>


**正解：B**

**解説**
Amazon API Gatewayの展開ステージを使用すると、ユーザーは、アルファ、ベータ、本番など、各APIの複数のリリースステージを管理できます。 構成可能な[ステージ変数]
(https://docs.aws.amazon.com/apigateway/latest/developerguide/stage-variables.html)を使用して、APIデプロイメントステージはさまざまなバックエンドのエンドポイントを使用できます。 ユーザーはAPI Gatewayステージ変数を使用して、複数のバージョンとエイリアスを持つ[単一のAWS Lambda]
(https://aws.amazon.com/blogs/compute/using-api-gateway-stage-variables-to-manage-lambda-functions/)を参照できます。


# 余談
原文のままのただの翻訳なので解説は基本答えになった選択肢で使用しているサービスの概要を書いてあることが大半です。どうやって問題の答えを出すかは解説のリンク先やサービスの概要を把握して解答するか、ありえない説明を省く消去法しかなさそうです。普通のテストと同じですね。
自分はAmazon Cognitoの理解が甘かったので復習する予定です。