

# REL08-BP04 イミュータブルなインフラストラクチャを使用してデプロイする
<a name="rel_tracking_change_management_immutable_infrastructure"></a>

 イミュータブルなインフラストラクチャは、本稼働ワークロードで更新、セキュリティパッチ適用、設定変更がインプレースで行われないように義務付けるモデルです。変更が必要な場合、アーキテクチャは新しいインフラストラクチャに構築され、本番環境にデプロイされます。

 イミュータブルなインフラストラクチャのデプロイ戦略に従って、ワークロードデプロイの信頼性、一貫性、再現性を高めましょう。

 **期待される成果:** イミュータブルなインフラストラクチャでは、ワークロード内でインフラストラクチャリソースを実行するための[インプレース変更](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/deployment-strategies.html#in-place-deployments)はできません。代わりに、変更の必要が生じた場合は、必要な変更をすべて適用した新しいインフラストラクチャリソース一式を、既存のリソースと並行してデプロイします。このデプロイは自動的に検証され、検証に合格すると、トラフィックが新しいリソース一式に徐々にシフトします。

 このデプロイ戦略は、ソフトウェアの更新、セキュリティパッチの適用、インフラストラクチャの変更、構成の更新、アプリケーションの更新などに適用されます。

 **一般的なアンチパターン:** 
+  実行中のインフラストラクチャリソースにインプレース変更を実装する。

 **このベストプラクティスを活用するメリット:** 
+  **環境全体での一貫性の向上:** 環境全体でインフラストラクチャリソースに違いがないため、一貫性が向上し、テストが簡素化されます。
+  **設定ドリフトの削減:** インフラストラクチャリソースを既知のバージョン管理された設定に置き換えることで、インフラストラクチャが既知のテスト済みで信頼できる状態に設定され、設定ドリフトを回避できます。
+  **信頼性の高いアトミックデプロイ:** デプロイは正常に完了するか、何も変更されないため、デプロイプロセスの一貫性と信頼性が向上します。
+  **デプロイの簡素化:** アップグレードをサポートする必要がないため、デプロイが簡素化されます。新たにデプロイするだけでアップグレードされます。
+  **迅速なロールバックとリカバリプロセスによる安全なデプロイ:** 以前の動作バージョンが変更されないため、デプロイはより安全です。エラーが検出された場合はロールバックできます。
+  **セキュリティ体制の強化:** インフラストラクチャへの変更を許可しないことで、リモートアクセスメカニズム (SSH など) を無効にすることができます。これにより、攻撃ベクトルが減少し、組織のセキュリティ体制が強化されます。

 **このベストプラクティスを活用しない場合のリスクレベル:** 中 

## 実装のガイダンス
<a name="implementation-guidance"></a>

 ** Automation** 

 イミュータブルなインフラストラクチャのデプロイ戦略を定義するときは、再現性を高め、人為的ミスの可能性を最小限に抑えるために、可能な限り[自動化](https://aws.amazon.com/iam/)を使用することをお勧めします。詳細については、「[REL08-BP05 自動化による変更のデプロイ](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_automated_changemgmt.html)」および「[安全かつハンドオフのデプロイの自動化](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)」を参照してください。

 [Infrastructure as Code (IaC)](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html) では、インフラストラクチャのプロビジョニング、オーケストレーション、およびデプロイのステップがプログラムによって説明的、宣言的な方法で定義され、ソース管理システムに保存されます。IaC を活用することで、インフラストラクチャのデプロイを簡単に自動化し、インフラストラクチャの不変性を実現できます。

 **デプロイパターン** 

 ワークロードの変更が必要な場合、イミュータブルなインフラストラクチャのデプロイ戦略では、必要な変更をすべて適用済みの、新しいインフラストラクチャリソース一式をデプロイすることが義務付けられています。この新しいリソースセットでは、ユーザーへの影響を最小限に抑えるロールアウトパターンに従うことが重要です。このデプロイには、主に 2 つの戦略があります。

 [https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/canary-deployments.html](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/canary-deployments.html)は、通常、単一のサービスインスタンス (Canary) で実行される新しいバージョンに、少数の顧客を誘導する方法です。次に、発生した動作の変更やエラーを詳細に調べます。重大な問題が発生した場合は、canary からトラフィックを削除して、ユーザーを以前のバージョンに戻すことができます。デプロイが成功したら、変更やエラーをモニタリングしながら、完全にデプロイされるまで、希望の速度でデプロイを続行できます。AWS CodeDeploy では、[デプロイ設定](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)で カナリアデプロイを有効にすることができます。

 [https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/bluegreen-deployments.html)はカナリアデプロイに似ていますが、アプリケーションのフリート全体が並行してデプロイされる点が異なります。2 つのスタック (青と緑) 間でデプロイを交互に行います。この場合も、トラフィックを新しいバージョンに送信したときにデプロイに問題が発生した場合は、古いバージョンにフォールバックできます。通常、すべてのトラフィックが一度に切り替えられますが、各バージョンへのトラフィックの一部と Amazon Route 53 の加重 DNS ルーティング機能を使用して、新しいバージョンの採用をダイヤルアップすることもできます。AWS CodeDeploy と [AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2020-05-18-ts-deploy.html) は、ブルー/グリーンデプロイを有効にするデプロイ構成で設定できます。

![\[AWS Elastic Beanstalk と Amazon Route 53 によるブルー/グリーンデプロイを示す図\]](http://docs.aws.amazon.com/ja_jp/wellarchitected/latest/framework/images/blue-green-deployment.png)


 **ドリフト検出** 

 ドリフトは、インフラストラクチャリソースの状態や構成が想定とは異なる変更として定義されます。適切に管理されていない構成変更は、イミュータブルなインフラストラクチャの概念と矛盾します。イミュータブルなインフラストラクチャを正常に実装するには、このような構成変更を検出し、修復する必要があります。

### 実装手順
<a name="implementation-steps"></a>
+  実行中のインフラストラクチャリソースのインプレース変更は禁止します。
  +  [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/) を使用すると、AWS のサービスとリソースにアクセスできるユーザーまたは内容を指定し、きめ細かいアクセス許可を一元管理し、アクセスを分析して、AWS 全体のアクセス許可を調整できます。
+  インフラストラクチャリソースのデプロイを自動化して再現性を高め、人為的ミスを最小限に抑えます。
  +  [AWS ホワイトペーパーの「DevOps の概要」](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/automation.html)で説明されているように、自動化は AWS サービスの基礎であり、すべてのサービスと機能で内部的にサポートされています。
  +  Amazon マシンイメージ (AMI)を[事前に作成する](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/prebaking-vs.-bootstrapping-amis.html)と、起動時間を短縮できます。[EC2 Image Builder](https://aws.amazon.com/image-builder/) は、カスタマイズされた、安全かつ最新の Linux または Windows カスタム AMI の作成、メンテナンス、検証、共有、デプロイを自動化するのに役立つフルマネージド AWS サービスです。
  +  次のサービスは自動化に対応しています。
    +  [AWS Elastic Beanstalk](https://aws.amazon.com/elasticbeanstalk/) は、Java、.NET、PHP、Node.js、Python、Ruby、Go、Docker で開発されたウェブアプリケーションを、Apache、NGINX、Passenger、IIS などの一般的なサーバーに迅速にデプロイしてスケールするためのサービスです。
    +  [AWS Proton](https://aws.amazon.com/proton/) は、プラットフォームチームがインフラストラクチャのプロビジョニング、コードのデプロイ、モニタリング、更新に必要なさまざまなツールを接続および調整するのに役立ちます。AWS Proton は、サーバーレスおよびコンテナベースのアプリケーションの Infrastructure as code (IaC) のプロビジョニングおよびデプロイを可能にします。
  +  IaC を活用することで、インフラストラクチャのデプロイを簡単に自動化し、インフラストラクチャの不変性を実現できます。AWS は、プログラムにより記述的、宣言的な方法でインフラストラクチャの作成、デプロイ、メンテナンスを可能にするサービスを提供しています。
    +  [AWS CloudFormation](https://aws.amazon.com/cloudformation/) は、開発者が順序正しく予測可能な方法でAWS リソースを作成するのに役立ちます。リソースは、JSON または YAML 形式でテキストファイルに書き込まれます。テンプレートには、作成および管理されるリソースのタイプに応じて、特定の構文と構造が必要です。任意のコードエディタを使用して JSON または YAML でリソースを作成し、バージョン管理システムにチェックインすると、CloudFormation が、指定されたサービスを安全で繰り返し可能な方法で構築します。
    +  [AWS Serverless Application Model (AWS SAM)](https://aws.amazon.com/serverless/sam/) は、AWS でサーバーレスアプリケーションを構築するために使用できるオープンソースフレームワークです。AWS SAM は他の AWS サービスと統合された、CloudFormation の拡張機能です。
    +  [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/) は、使い慣れたプログラミング言語を使用して、クラウドアプリケーションリソースをモデル化およびプロビジョニングするために使用できるオープンソースのソフトウェア開発フレームワークです。AWS CDK により、TypeScript、Python、Java、.NET を使用してアプリケーションインフラストラクチャをモデル化できます。AWS CDK は CloudFormation をバックグラウンドで使用し、安全で繰り返し可能な方法でリソースをプロビジョニングします。
    +  [AWS クラウドコントロール API](https://aws.amazon.com/cloudcontrolapi/) では、開発者がクラウドインフラストラクチャを簡単に、一貫した方法で管理できるように、作成、読み取り、更新、削除、一覧表示 (CRUDL) API の共通セットが導入されています。Cloud Control API の共通 A​​PI を使用すると、開発者は AWS およびサードパーティーサービスのライフサイクルを均一に管理できます。
+  ユーザーへの影響を最小限に抑えるデプロイパターンを実装します。
  +  カナリアデプロイ: 
    + [API Gateway の Canary リリースデプロイの設定](https://docs.aws.amazon.com/apigateway/latest/developerguide/canary-release.html)
    + [AWS App Mesh を使用して、Amazon ECS のカナリアデプロイでパイプラインを作成する](https://aws.amazon.com/blogs/containers/create-a-pipeline-with-canary-deployments-for-amazon-ecs-using-aws-app-mesh/)
  +  ブルー/グリーンデプロイ: [AWS ホワイトペーパーの「ブルー/グリーンデプロイ」](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/welcome.html)では、ブルー/グリーンデプロイ戦略を実装する[手法の例](https://docs.aws.amazon.com/whitepapers/latest/blue-green-deployments/implementation-techniques.html)について説明しています。
+  構成または状態のドリフトを検出します。詳細については、「[スタックとリソースに対するアンマネージド型構成変更の検出](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html)」を参照してください。

## リソース
<a name="resources"></a>

 **関連するベストプラクティス:** 
+ [REL08-BP05 自動化を使用して変更をデプロイする](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_tracking_change_management_automated_changemgmt.html)

 **関連ドキュメント:** 
+ [Automating safe, hands-off deployments](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/)
+ [Leveraging AWS CloudFormation to create an immutable infrastructure at Nubank](https://aws.amazon.com/blogs/mt/leveraging-immutable-infrastructure-nubank/)
+ [Infrastructure as Code](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)
+ [Implementing an alarm to automatically detect drift in AWS CloudFormation stacks](https://docs.aws.amazon.com/blogs/mt/implementing-an-alarm-to-automatically-detect-drift-in-aws-cloudformation-stacks/)

 **関連動画:** 
+ [AWS re:Invent 2020: Reliability, consistency, and confidence through immutability](https://www.youtube.com/watch?v=jUSYnRztttY)