見出し画像

AWS DOPの学習(SDLC編)

はじめに

本記事は個人の備忘録として、DOPに向けた学習の中で理解が不十分だった部分や間違えた問題の内容をまとめたものになります。
サービスの全体像を解説した記事ではないため、ご了承ください。

本記事は以下のサイトを大いに参考にしています。
とてもわかりやすくまとめられているため、DOPを受験される方はご一読することをお勧めします。
https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2


Code Pipeline

CodePipelineはEventBridgeを経由することなくCodeCommitの変更を検知することができる。
ただし、CodepipelineのサービスロースにCodeCommitにアクセスする権限の設定が必要。

デプロイ先はElasticBeanstalkを指定することも可能。

アーティファクトの管理

AWS CodePipelineではアーティファクトを各ステージごとに作成することができる。
作成されたアーティファクトはS3に保存され、次のステージに受け継がれる。
アーティファクトの保存用S3と暗号化用のKMSはパイプライン作成時に自動作成される。

Cloud Formationのスタックセットでのプロビジョニング

CloudFormationのデプロイステージではCloudFormationのStackSetsを実行することが可能。
これにより、マルチリージョン、マルチアカウントへのプロビジョニングを1本のパイプラインで実現することが可能。
※プロビジョニング用のアーティファクトは各リージョンに配置しておかないとプロビジョニングに失敗するため注意

CloudFormationでのプロビジョニング時は、実行の仕方をCREATE_UPDETEとDELETE_ONLYから選択可能

パイプラインの起動契機

以下3つの起動契機が存在する。

  1. EventBridgeを用いたイベント駆動

  2. Webhook

  3. ポーリング

現在のベストプラクティスはイベント駆動のため、特別な要件がなければイベント駆動を採用する。

runOrder

パイプライン内でのアクションの実行順序を制御するための属性。
同じステージ内の複数のアクションがどの順序で実行されるかを指定できる。
デフォルトでは、すべてのアクションはrunOrderが1に設定されており、並列に実行される。
runOrderの値を変更することで、アクションを順を指定して実行させることができる。

ベストプラクティス

  1. 1つのAWS CodePipelineに1つのAWS CodeDeploy。並行でデプロイしたければAWS CodeDeployのデプロイメントグループを増やす。

  2. 1つのステージで並行アクションを実行したければRunOrderパラメータを変更する。

  3. 本番環境にデプロイする前にプレデプロイを実行し、承認を経て本番環境にデプロイする。

Code Commit

クロスアカウントアクセス

AWS CodeCommitにクロスアカウントでアクセスさせる際にはIAMロールとAWS STSのAssumeRoleAPIを用いたスイッチロールで実現するのがベストプラクティス。
SSHキーやクレデンシャルなどの認証情報を共有してのクロスアカウントアクセスはアンチパターン

暗号化

リポジトリはAWS KMSを利用して自動で暗号化されます。
転送中の暗号化はHTTPSあるいはSSHを用いて実現されます。

承認ルールテンプレート

CodeCommitに対するMRに承認ルールテンプレートを設定することでMRのマージ制御を行うことができる。
承認者としてCodeBuildプロジェクトを設定することで、マージ前にテストを実行して、成功した場合のみマージ可能にすることなども可能。

イベント駆動

CodeCommitでのイベントはEventBridgeで検知して他サービスを起動可能。
CodePipelineは自動で検知できるためEventBridgeの作成は不要。

Code Build

CodeBuildの実態はコンテナサービスでDockerイメージを利用している。
そのため、カスタムDockerイメージを用いることで細かい要件も満たすことが可能。

AWS CodeBuildはKMSを用いて、出力するアーティファクトと転送データを暗号化できる。

AWSのリソースにアクセスできるように認可するためには、CodeBuildに適切なサービスロールを割り当てる必要がある。

CodeBuild Agentを導入することでAWS CodeBuildをローカルで実行することも可能。

環境変数

CodeBuildの実行リージョンはAWS_REGIONで取得可能。
(デフォルトで設定される環境変数)
ベストプラクティスはParamater StoreあるいはSecrets Managerにパラメータを保存し、それを読みだすという処理の流れで環境変数を設定する。

テストレポート

単体テストなどのテスト結果をレポート形式で出力するサービス。
buildspec.yamlで指定可能。
テスト結果の可視化が簡易になります。
buildspec.yamlのreportsで設定。

buildspec.yaml

artifacts:
アーティファクトの名、アーティファクトに含めるサブディレクトリとファイルを指定。
secondary-artifactsを利用して、複数のビルド出力アーティファクトを指定することも可能。

Code Deploy

設定可能なデプロイ先は
オンプレミス、EC2、Lambda、ECSの4つ
オンプレミスとEC2にデプロイメントする際にはCodeDeploy Agentのインストールが必要。

EC2/オンプレへのデプロイ

Blue/Greenかin-placeが選択可能。
どちらのパターンでもデプロイするグループをTagあるいはAutoScalingGroupで設定できる。
※Blue/Greenの場合、Tagを使うと手動切り替えのみ、AutoScalingGroupを使うと自動切換えのみ
※Blue/GreenでデプロイするにはLBが必須

試験の際にはコスト最適ならダウンタイムの要件を見てin-placeのどれかを、ダウンタイムの最小化であればBlue/Greenを選ぶ。

デプロイメントフック

特定のタイミングでのスクリプトの実行に使用。
LBを使っている場合にはデプロイメントの前にトラフィックを止めることができる。
トラフィックを止める/許可するタイミングとアプリケーションを止める/起動するタイミングの前後性は試験で頻出。
ApplicationStartのあとにValifateServiceがあるのも試験でよく問われる。
また、Installライフサイクルフックはスクリプト化できないため注意。

CodeDeployを使用してEC2インスタンスへのデプロイを行う際、EC2インスタンスはIGW,NatGW,VPCエンドポイントなどを通してCodeDeployエンドポイントと通信できる必要がある。

CodeDeployでEC2にデプロイを行うには、EC2に適切なインスタンスプロファイルの設定が必要。

ECSへのデプロイ

ECSへのデプロイはタスク定義に従って新しいサービスをデプロイすることが可能。

デプロイパターンはBlue/Greenのみです。
ただし、トラフィックの切り替え方はCanary、Linear、All at Onceから選べる

デプロイメントフック


ValidateServiceがないことに注意
(Blue/Greenのみのため不要)

Lambdaへのデプロイ

Lambdaへのデプロイは新しいLambda関数のバージョンを作成することでデプロイが可能

デプロイパターンはBlue/Greenのみです。
トラフィックの切り替え方もECS同様、Canary、Linear、All at Onceから選べる

デプロイメントフック


CloudWatch アラームによるロールバック

CloudWatch アラームを作成してCloudWatchメトリクスを監視し、メトリクスが定義されたしきい値を下回ったか超えたことを検出したときに、SNSの通知やデプロイのロールバック、インスタンスの状態変更などのアクションを実行することができる。
EC2 デプロイメントの場合、CodeDeploy 操作で使用しているインスタンスまたはAuto Scaling グループのアラームを作成できる。
AWS Lambda および Amazon ECS デプロイメントの場合、Lambda 関数のエラーのアラームを作成できます。

デプロイメントグループ

CodeDeployがアプリケーションをデプロイする対象を定義する要素
以下の情報を含む

  1. 対象のインスタンスやリソース(タグ、Auto Scalingグループ、Lambda関数、ECSサービスなど)。

  2. デプロイ設定(デプロイ戦略や方式)。

  3. デプロイするアプリケーションの指定

  4. ライフサイクルフック(カスタムスクリプトの実行)。

AppSpec

CodeDeployで実行するデプロイ処理の内容(CodeBuildのbuildspec.yamlのようなもの)。デプロイでどのようなことを処理させるか、具体的な内容を記述されたYAML フォーマットのファイル

インプレースデプロイ

稼働中のインスタンスに対して直接新しいアプリケーションを配置、再起動する方法。

Blue/Greenデプロイ

稼働中の環境とは別に最新のバージョンの環境を構築しておき、トラフィックを稼働中の環境から最新の環境に切り替えることでダウンタイム無しで環境を切り替えるデプロイ方法。

カナリアリリース

API の新しいバージョン (およびその他のソフトウェア) をテスト目的でデプロイし、ベース バージョンを同じステージでの通常の操作用に本番リリースとしてデプロイしたままにするソフトウェア開発戦略。

カナリアリリースは既存のAPI本番ステージに設定することで、自動的にトラフィックの一部がカナリアに振り分けられるようになるため、Route53の加重ルーティングなどを別で設定する必要はない。

トラブルシューティング

AWS CodeDeployではデプロイの失敗時あるいはCloudWatchアラームで閾値を超えたときに自動でロールバックすることが可能。
ロールバック時にはデプロイ成功したリビジョンの中で最新のリビジョンにロールバックされる。

CodeArtifact

マネージド型のアーティファクトリポジトリサービスで、maven や npm などの対応するパッケージマネージャーの Proxy として利用できる。
管理者はパッケージへのアクセス制御が可能となり、組織内で使用が承認されている最新のパッケージのみを開発者に提供できる。
(Nexusのようなもの)

組織のポリシーによっては自由に公開リポジトリにアクセスできない場合に、VPC Endpoint 利用することでインターネットを経由せずに、CodeArtifact にキャッシュされたパッケージにアクセスできる。
ダウンロード時間の短縮も期待できる。

ドメイン

ドメインはAWS CodeArtifactのリポジトリを仮想的に束ねるグループのようなもの。
ドメインはクロスアカウントで構築することができ、ドメイン内ではパッケージシェアが可能。

つまり、各アカウントで共通して利用するパッケージを一か所で持つだけで済むようにできるため、パッケージを保存するためのストレージコストの削減につながる。

アップストリームリポジトリ

AWS CodeArtifactのリポジトリと外部接続のリポジトリは1対1にする必要がある。
複数の外部リポジトリを1つのリポジトリのように扱いたい場合に、アップスロリームリポジトリによりAWS CodeArtifactのリポジトリは多段構成にすることで実現できる。


外部リポジトリを見に行くリポジトリと別にもう1つリポジトリを作成し、それを見に行くことであたかも複数の外部リポジトリを見に行くことができるような作りにすることが可能。

EC2 Image Builder

AMIの構築を自動化する。
EC2 Image BuilderでAMIを構築したらSSM Paramater StoreにAMI IDを保存しておくのがベストプラクティス。

EC2 Image Builderから直接SSM Paramater Storeに書き込むことはできない。SNSをかませてAMI ID書き込み用のLambdaを起動させる必要がある。

AWS Amplify

AWS AmplifyはWebアプリケーションのフロントエンドとモバイルアプリケーションを開発するためのプラットフォーム。

Amazon CodeGuru

ソースコードのレビューとアプリケーションパフォーマンスに関する推奨を行ってくれる機械学習ベースのサービス。

CodeGuru Security

以前まで、CodeGuru Reviewerとして提供されていたもの。
セキュリティの観点でソースコードを解析し、推奨の修正内容を提示してくれる。
CodeGuruはリポジトリ系あるいはIDEと統合して利用する。

プログラム分析と機械学習を使用して、コード内の潜在的な不具合や問題を検出します

CodeGuru Profiler

CodeGuru Profiler はアプリケーションパフォーマンスの最適化に関する解析を行い、推奨の修正内容を提示する。

定常的なロギング動作で過剰なCPUを消費していることの特定などが可能で、アプリケーションの実行時の動作を理解するのに役立つ。

CodeGuru Profilerはアプリケーションのパフォーマンスを向上させるだけではなく、ヒープサマリの提供や、冗長なコードの特定も可能。これによりソースコード的にもリソース的にも最適化されたアプリケーションの構築を補助する。

ヒープサマリ:プログラムの実行時に使用されるメモリのヒープ領域に関する情報を提供するレポート。
ヒープサマリを使用することで、メモリの使用状況やメモリリークの有無を理解し、パフォーマンスの問題を診断するのに役立つ。
ヒープ:プログラムが動的にメモリを割り当てるために使用するメモリ領域。

LambdaへのCodeGuru Profiler統合

CodeGuru ProfilerをLambdaで作成したアプリケーションに適用するためにはFunction DecoratorとしてLambda関数のZipファイルに追加する、あるいはLambda関数の設定でCodeGuru Proflierを有効にする、の2パターンの手順のいずれかが必要。

Amazon LightSail

コンピューティング、ストレージ、データ転送など、WebサイトやWebサービスなどに使うサーバとして必要な機能を組み合わせた単一パッケージ。
インスタンスやコンテナ、データベース、ストレージなどの簡素化されたクラウドリソースを提供する。

「Linux」「UNIX」「Windows Server」などのOSに加えて、WordPressやRedmineなどのアプリケーションも用意されている。

この記事が気に入ったらサポートをしてみませんか?