【AWS DOP-C01】合格のための知識詰め込み

# はじめに
AWS DOPの試験対策で練習問題を解き、ひたすら知識を詰め込みます。
本質とは異なりますが、合格を最優先に考え作成します。

# デプロイ
## 開発
### CodePipeline
- runOrderを同じ値にすると並列に実行する
- バージョンの異なる複数のコードをデプロイする場合は、その分だけCodePipelineを作成する。
- JenkinsでCICDを実行する場合は、マルチマスターセットアップとしてデプロイし、CodeBuildプラグインを使用することでCodeBuildでビルドを実行する。
- 別のCodepipelineオプションを呼び出せない
- S3デプロイステップでアーティファクトを別リージョンのバケットにコピーできる。
- CodeCommitへの変更をトリガーにパイプラインを開始するにはCloudWatchイベントと連携する。


### CodeCommit
- マージのためには上級者の承認が必要
  - CodeCommitでリポジトリを作成し、作業ブランチとmasterブランチを作成。上級開発者と開発者用に別々のIAMグループを作成。IAMポリシーを使用して、各IAMグループに対応するブランチを割り当てます。コードが working ブランチにマージされると、上級開発者は working ブランチから master ブランチに変更を取り込むことが可能。
- SSHキーでアクセスするためには各開発者のSSH公開鍵をIAMユーザのセキュリティ認証情報タブにアップロードする。


### CodeBuild
- Build時にテストを実行することが可能。
- 変数CODEBUILD_SOURCE_VERSIONは実行時にCodeBuild内で直接公開され、CodeCommitでテストされるコードのブランチ名を表す。
- ビルド結果によってプルリクエストを更新するには、Lambda関数を使用する。
- オンプレミス環境でCodeDeployを使用するためには直接IAMユーザをハードコードせず、AssumeRoleを使用する。これは一週間で失効するため、cronで定期的に更新する。


### CodeDeploy
- ECSにデプロイする場合、タスク定義を新しく作成するためにimage名にsha256ハッシュを追加する。名前が同一の場合、タスク状態の変更イベントが検知されない。
- Lambdaへのデプロイが失敗した場合にロールバックするには、CloudWatchアラームを関連付けデプロイの状態を監視する。
- EC2にカナリアデプロイする場合は二つのCodeデプロイが必要。Lambda、ECSはカナリアデプロイの設定が可能。
- EC2へのデプロイ中にAutoScalingが起動すると古いバージョンで起動するため、common_functions.shスクリプトによりAutoScalingを中断することが推奨される。
- CodeDeployロールバックはCloudWatchアラームでのみ機能する。SNSでもよさそう？
- ValidateServiceフックを使用して、デプロイメントが正常に完了したことを確認できる。

## インフラ、アプリ管理
### CloudFormation
- 1つをOSの更新とパッチ適用、1つはアプリケーションの依存性管理に使いたい
  - OSは新しいAMIを構築するAWS CodePipelineパイプラインを作成しAMIを構築、AWS Systems Manager Parameter Storeに、パイプラインの一部を出力。アプリケーションチームは、タイプ　ssmをCloudFormationスタックで指定し、パラメータストアから最新のAMI ARNを取得する。
- インフラストラクチャを一つのマスターテンプレートに統合できない場合はエクスポートを使う。
- Lambda関数の更新を検知するためには
  - 別のS３バケットにアップロードする
  - 別のファイル名でアップロードする
  - バージョン管理を有効にし、新しいS3ObjectVersionキーを提供する
- CodePipelineでデプロイ時にCloudFormationスタックがIAMロールを作成する権限がない場合はInsufficientCapabilitiesExceptionエラーが出る。そのため、　DeployCloudFormationステージアクションでIAMの機能を有効にする。
- CodeBuildでビルドしたアーティファクトの同じバージョンがデプロイされていることを保証するためには同じCloudFormationテンプレートを使用する。
- S3からパラメータを取得できない。

### Elastic Beanstalk
- Blue/Greenデプロイメントのためには、アプリケーションのZipファイルをS3に保存して、その場所を指定して新しいバージョンをデプロイする。
- Blue/GreenデプロイメントではCNAMEスワップのためにLambda関数を呼び出す必要がある。
- サポートされていない言語を含む複数のアプリケーションをデプロイするためには、Multi-Dockerコンテナ構成を利用し、各アプリケーションをコンテナとしてECRに保存する。
- ワーカー環境とアプリケーション環境を分離してSQSで連携することでCPU使用率を軽減させることが可能。
- Webサーバー環境ではWeb層だけを使用可能。Web層とアプリケーション層の両方は不可。
- X-RAYを有効にするためには、管理ページでX-RAyデーモンを有効にし、ebExtentionでXrayをtrueにする。

### ECS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/fb4091df-d823-b2f7-5250-4b9e619c7e40.png)
- CloudFormationでAutoScalingグループを設定
  - UserDataで「AWS::AutoScaling::LaunchConfiguration」を記載しECSクラスターで参照する
- ライフサイクルイベント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/e4883358-88e8-e451-eaf6-ce5c09d21e0d.png)
- タスク定義にawslogsドライバーを含めることでネイティブにCloudWatchにログの書き込みが可能。EC2インスタンスにはIAMインスタンスロールを設定する。
- 

# コンピューティング、API
## API Gateway
- マッピングテンプレートを使用してメソッドリクエストから対応する統合リクエストにマッピングが可能。更新の場合、同一のLambda関数でバージョを静的にマッピングする。
- APIGatewayでカナリア設定を追加することでCanaryリリースが可能。

## Lambda
- Lambdaエイリアスは、特定の関数のバージョンに対するポインタのようなもの。ユーザーは、エイリアスAmazonリソースネーム(ARN)を使用して関数のバージョンにアクセス可能。CodeDeploy、API Gatewayと連携してCanary、Linearデプロイが可能。
- Lambdaのトリガー一覧
- RequestResponse(同期)で実行されるイベントソース
  - AWS CLIや各SDKにてLambda関数をInvokeした場合(デフォルト動作)
  - API Gateway(デフォルト動作)※参考AWS Lambda 関数の API GatewayAPI を作成する
  - Cognito
- Event(非同期)で実行されるイベントソース
  - CloudWatch Events(スケージュル含む全てのトリガー)
  - CloudWatch Logs
  - CodeCommit
  - S3
  - SNS
  - SES
  - KinesisFirehose
  - CloudFormation(Lambdaを利用したカスタムリソース)
  - AWS Config
- ストリーム型で実行されるイベントソース
  - DynamoDB(ストリーム型)[^ストリーム]
  - Kinesis Stream(ストリーム型)[^ストリーム]

## DynamoDB
- SNSを使用することでDynamoDBストリームをトリガーに複数のLambdaを起動することが可能。
- DynamoDBストリームはアイテムレベルのイベントをキャプチャする。

# 管理、監視

## Systems Manager
- パッチを即座に自動適用、レポートも作成
  - AWS Systems Managerのメンテナンスウィンドウを毎日のスケジュールで作成し、パッチグループでまとめたターゲットを追加する。AWS-RunPatchBaselineドキュメントをInstallアクションで実行するタスクを追加します。
  - AWS Systems Manager State Managerの構成を作成。AWSRunPatchBaselineタスクを構成に関連付け、ターゲットにパッチグループのタグを追加する。
- 管理するにはEC2側でIAMロールのアタッチが必要
- Inventoryは管理対象インスタンスからメタデータを取得し、S3バケットに保存する。インストールされているソフトウェアの管理が可能。
- 追跡されていないインスタンスを探すにはLambda関数をトリガーする

## SecretsManager
- DynamoDBをサポートしていない。

## AWS Trusted Advisor
- AWS のベストプラクティスをフォローするためのレコメンデーションを提供
- 直接Lambda関数は呼び出せないため、EventBridgeを経由する。

## Amazon Inspector
- ソフトウェアの脆弱性や意図しないネットワークのエクスポージャーがないか継続的に AWS ワークロードをスキャンする自動脆弱性管理サービス。

## Amazon Macie
- 機械学習を使用してAWSの機密データを自動的に検出、分類、保護するセキュリティサービス

## AWS Health
- IAMアクセスキーがGitHubで公開されたときに、AWS_RISK_CREDENTIALS_EXPOSEDイベントを生成

## CloudWatch
- CloudWatch Logsは継続的なログ管理に使用。一度の収集であればLambda関数を使用しS3に保存する方法も検討する。
- CloudWatch EventはSlackをサポートしていないので、Lambdaから通知を送信する必要がある。
- CloudWatchイベントは、アラートのターゲットとして特定のSNSトピックを持つことができる。AWS ConfigのSNSは全てのルールを監視する。
- CloudWatchイベントは、DynamoDBイベントを直接検出することはできずメトリクスのみを提供する。必要に応じてLambdaでポーリングする。
- CloudWatchダッシュボードは、CloudWatchメトリクスのみを使用できる。
- CloudWatchメトリックスフィルターは、CloudWatchLogsに送信されるときにログデータで検索する用語とパターンを定義

## IAM
- iam:PassRole はユーザーが IAM ロールを AWS サービスに渡す(PASS)アクセス許可を定義。 このアクションが許可されていないと、そもそも IAM ロールをパスできない。

## Kinesis
- 各サーバーでAmazon Kinesis Agentを使い、ログをアップロードし、Amazon Kinesis Data　FirehoseでAWS Lambda関数を使用して、Amazon S3に書き込む前にログを正規化することが可能。
- Firehoseでは出力先のS3を集約することでマルチアカウントのログの一元管理が可能。


# 対障害性


## ELB
- ALBにAZを追加するには、[Edit subnets（サブネットを編集する）]ページの[Availability Zone（アベイラビリティーゾーン）」で、追加するアベイラビリティーゾーンのチェックボックスを選択する
- アクセスログの作成は、Elastic Load Balancing のオプション機能であり、デフォルトでは無効化。有効化するとS3に保存される。

## EBS
- 未使用のEBSボリュームを削除するには、CloudWatchイベントルールで毎日Lambdaを実行、アタッチされていないEBSボリュームに日付でタグ付け、一定の期間を過ぎたら削除する
- クロスリージョンで転送できない。

## S3
- クロスリージョンレプリケーションのSLAは15分、RPOは5秒
- クロスリージョンレプリケーションの手順
  - ソースバケットにIAMロールを作成
  - ターゲットバケットでソースのIAMを許可
  - ターゲットバケットでレプリケーションルールを定義

## EFS
- 別リージョンにホットコピーするには別リーションのS3にデータを複製し、複製したデータを読み取りEFSクラスターにコピーする。

## Storage Gateway
- RefreshCacheでS3ファイルゲートウェイのデータを最新化

## Aurora
- 地域が完全に停止した場合でも1分以内に回復可能。
- フェイルオーバーの手順。
  - RDS Event Notificationを使用して、Amazon SNSトピックにステータスアップデートを公開。
  - トピックにサブスクライブされたAWS Lambda関数を使用して、データベースの健全性を監視。
  - 障害が発生した場合、Lambda関数は読み取りレプリカを促進し、Route 53を更新して、プライマリ領域からセカンダリ領域へトラフィックをリダイレクトする。

## EC2
- ゴールデンAMIは標準化のためのAMI。ユーザデータで動的なパーツを設定。キャッシュは変化するので起動時にインストールすることは推奨されない。
- AMI自体をリージョン間をまたいでコピーするにはLambda関数を使用する。AMI IDはSSMパラメータストアに格納する。