

# SEC11-BP06 ソフトウェアをプログラムでデプロイする
<a name="sec_appsec_deploy_software_programmatically"></a>

可能な場合は、ソフトウェアのデプロイをプログラムで行います。この手法により、デプロイに失敗したり、人為的エラーにより予期しない問題が発生したりする可能性を低減できます。

 **期待される成果:** テストするワークロードのバージョンはデプロイするバージョンであり、デプロイは毎回一貫して実行されます。ワークロードの設定を外部化して、変更なしでさまざまな環境にデプロイできるようになります。環境間に何も変更がないことを確認するために、ソフトウェアパッケージの暗号化署名を使用します。

**一般的なアンチパターン:**
+  本番環境にソフトウェアを手動でデプロイする。
+  環境に合わせて手動でソフトウェアに変更を加える。

**このベストプラクティスを活用するメリット:**
+  ソフトウェアリリースプロセスの信頼性が向上します。
+  変更に失敗してビジネスの機能性に影響を与えるリスクが低減されます。
+  変更リスクの低減により、リリース頻度が向上します。
+  デプロイ中に予期しないイベントが発生した場合に自動ロールバックが機能します。
+  テスト済みのソフトウェアとデプロイされたソフトウェアが同じであることを、暗号化によって証明できます。

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

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

 堅牢で信頼性の高いアプリケーションインフラストラクチャを維持するには、安全で自動化されたデプロイプラクティスを実装します。このプラクティスでは、本番環境から永続的な人間のアクセスを削除し、デプロイに CI/CD ツールを使用し、環境固有の設定データを外部化します。このアプローチに従うことによって、セキュリティを強化し、ヒューマンエラーのリスクを減らし、デプロイプロセスを合理化できます。

 AWS アカウント 構造を構築し、本番環境から永続的な人的アクセスを削除できます。このプラクティスは、不正な変更や偶発的な変更のリスクを最小限に抑え、本番稼働システムの整合性を向上させます。直接ヒューマンアクセスの代わりに、[AWS CodeBuild](https://aws.amazon.com/codebuild/) や [AWS CodePipeline](https://aws.amazon.com/codepipeline/) などの CI/CD ツールを使用してデプロイを実行できます。これらのサービスを使用して、構築、テスト、デプロイのプロセスを自動化できるため、手動の介入が減り、一貫性が向上します。

 セキュリティとトレーサビリティをさらに強化するために、アプリケーションパッケージがテストされ、デプロイ中にこれらの署名を検証した後に、アプリケーションパッケージに署名できます。それには、[AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) や [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) などの暗号化ツールを使用します。パッケージに署名して検証することによって、認可および検証されたコードのみを環境にデプロイできます。

 さらに、チームはワークロードを設計して、[AWSSystems Manager Parameter Store ](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) などの外部ソースから環境固有の設定データを取得できます。この方法により、アプリケーションコードが構成データから分離されるため、アプリケーションコード自体を変更することなく、構成を個別に管理および更新できるようになります。

 インフラストラクチャのプロビジョニングと管理を合理化するには、[AWS CloudFormation](https://aws.amazon.com/cloudformation/) や [AWS CDK](https://aws.amazon.com/cdk/) などの Infrastructure as Code (IaC) ツールを使用することを検討してください。これらのツールを使用して Infrastructure as Code (IaC) を定義できるため、さまざまな環境にわたるデプロイの一貫性と再現性が向上します。

 ソフトウェアのデプロイが成功したことを検証するには、カナリアデプロイを検討します。カナリアデプロイでは、本番環境全体にデプロイする前に、インスタンスまたはユーザーのサブセットに変更をロールアウトします。その後、変更の影響をモニタリングし、必要に応じてロールバックできるため、広範な問題のリスクを最小限に抑えることができます。

 「[Organizing Your AWS Environment Using Multiple Accounts](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html)」ホワイトペーパーで概説されている推奨事項に従ってください。このホワイトペーパーでは、セキュリティと分離をさらに強化するため、環境 (開発、ステージング、本番など) を個別の AWS アカウント に分離する方法について説明します。

### 実装手順
<a name="implementation-steps"></a>

1.  **AWS アカウント 構造のセットアップ**: 
   +  「[Organizing Your AWS Environment Using Multiple Accounts](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html)」ホワイトペーパーのガイダンスに従って、異なる環境 (試験、開発、ステージング、本番稼働) 用に個別の AWS アカウント を作成します。
   +  各アカウントの適切なアクセスコントロールとアクセス許可を設定して、本番環境への直接アクセスを制限します。

1.  **CI/CD パイプラインの実装**: 
   +  [AWS CodeBuild](https://aws.amazon.com/codebuild/) や [AWS CodePipeline](https://aws.amazon.com/codepipeline/) などのサービスを使用して CI/CD パイプラインを設定します。
   +  アプリケーションコードを自動的に構築、テスト、各環境にデプロイするようにパイプラインを設定します。
   +  コードリポジトリを CI/CD パイプラインと統合して、バージョン管理とコード管理を行います。

1.  **アプリケーションパッケージに署名して検証します**。
   +  [AWS Signer](https://docs.aws.amazon.com/signer/latest/developerguide/Welcome.html) または [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) を使用して、テストと検証後にアプリケーションパッケージに署名します。
   +  ターゲット環境にデプロイする前に、アプリケーションパッケージの署名を検証するようにデプロイプロセスを設定します。

1.  **設定データの外部化**: 
   +  [AWS Systems Manager パラメータストアに環境固有の設定データを保存します](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。
   +  アプリケーションコードを変更して、デプロイ時またはランタイム中にパラメータストアから設定データを取得します。

1.  **Infrastructure as Code (IaC) の実装:** 
   +  [AWS CloudFormation](https://aws.amazon.com/cloudformation/) または [AWS CDK](https://aws.amazon.com/cdk/) などの IaC ツールを使用して、Infrastructure as Code (IaC) を定義および管理します。
   +  CloudFormation テンプレートまたは CDK スクリプトを作成して、アプリケーションに必要な AWS リソースをプロビジョニングおよび設定します。
   +  IaC を CI/CD パイプラインと統合して、アプリケーションコードの変更と共にインフラストラクチャの変更を自動的にデプロイします。

1.  **カナリアデプロイの実装**: 
   +  カナリアデプロイをサポートするようにデプロイメントプロセスを構成します。カナリアデプロイでは、変更がインスタンスまたはユーザーのサブセットにロールアウトされてから、運用環境全体にデプロイされます。
   +  [AWS CodeDeploy](https://aws.amazon.com/codedeploy/) や [AWS ECS](https://aws.amazon.com/ecs/) などのサービスを使用してカナリアデプロイを管理し、変更の影響を監視します。
   +  カナリアデプロイ中に問題が検出された場合は、ロールバックメカニズムを実装して以前の安定バージョンに戻します。

1.  **モニタリングと監査**: 
   +  デプロイ、アプリケーションのパフォーマンス、インフラストラクチャの変更を追跡するための監視およびログ記録メカニズムを設定します。
   +  [Amazon CloudWatch](https://aws.amazon.com/cloudwatch/) や [AWS CloudTrail](https://aws.amazon.com/cloudtrail/) などのサービスを使用して、ログやメトリクスを収集および分析します。
   +  監査とコンプライアンスチェックを実装して、セキュリティのベストプラクティスと規制要件の遵守を検証します。

1.  **継続的な改善:** 
   +  定期的にデプロイのプラクティスを確認して更新し、以前のデプロイから得たフィードバックと教訓を取り入れます。
   +  デプロイプロセスのできるだけ多くを自動化して、手動介入や潜在的なヒューマンエラーを減らします。
   +  クロスファンクショナルチーム (オペレーションやセキュリティなど) と協力して、デプロイプラクティスを調整し、継続的に改善します。

 これらのステップに従うことによって、安全で自動化されたデプロイプラクティスを AWS 環境に実装できます。これにより、セキュリティが向上し、ヒューマンエラーのリスクが軽減され、デプロイプロセスが合理化されます。

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

 **関連するベストプラクティス:** 
+  [SEC11-BP02 開発およびリリースライフサイクル全体を通じてテストを自動化する](sec_appsec_automate_testing_throughout_lifecycle.md) 
+  [DL.CI.2 ソースコードの変更時に自動的に構築をトリガー](https://docs.aws.amazon.com/wellarchitected/latest/devops-guidance/dl.ci.2-trigger-builds-automatically-upon-source-code-modifications.html) 

 **関連ドキュメント:** 
+  [Accelerate deployments on AWS with effective governance](https://aws.amazon.com/blogs/architecture/accelerate-deployments-on-aws-with-effective-governance/) 
+  [安全なハンズオフデプロイメントの自動化](https://aws.amazon.com/builders-library/automating-safe-hands-off-deployments/) 
+  [Code signing using AWS Certificate Manager Private CA and AWS Key Management Service asymmetric keys](https://aws.amazon.com/blogs/security/code-signing-aws-certificate-manager-private-ca-aws-key-management-service-asymmetric-keys/) 
+  [コード署名、AWS Lambda の信頼性および整合性のコントロール](https://aws.amazon.com/blogs/aws/new-code-signing-a-trust-and-integrity-control-for-aws-lambda/) 

 **関連動画:** 
+  [Hands-off: Automating continuous delivery pipelines at Amazon](https://www.youtube.com/watch?v=ngnMj1zbMPY) 

 **関連する例:** 
+  [ を使用したブルー/グリーンデプロイAWS Fargate](https://catalog.us-east-1.prod.workshops.aws/workshops/954a35ee-c878-4c22-93ce-b30b25918d89/en-US) 