

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Application Load Balancer を使用して Amazon ECS の相互 TLS でアプリケーション認証を簡素化する
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs"></a>

*Olawale Olaleye と Shamanth Devagari、Amazon Web Services*

## 概要
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-summary"></a>

このパターンは、[Application Load Balancer (ALB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/mutual-authentication.html) を使用して、Amazon Elastic Container Service (Amazon ECS) の相互 TLS でアプリケーション認証を簡素化し、セキュリティ負担を軽減します。ALB では、X.509 クライアント証明書を認証できます AWS Private Certificate Authority。この強力な組み合わせにより、サービス間の安全な通信を実現し、アプリケーション内での複雑な認証メカニズムの必要性を軽減できます。また、このパターンは Amazon Elastic Container Registry (Amazon ECR) を使用してコンテナイメージを保存します。

このパターンの例では、パブリックギャラリーの Docker イメージを使用して、最初にサンプルワークロードを作成します。その後、新しい Docker イメージは Amazon ECR に保存されるように構築されます。ソースとして、GitHub、GitLab、Bitbucket などの Git ベースのシステムを検討するか、Amazon Simple Storage Service Amazon S3 (Amazon S3) を使用します。Docker イメージを構築するには、後続のイメージ AWS CodeBuild に を使用することを検討してください。

## 前提条件と制限
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-prereqs"></a>

**前提条件**
+  AWS CloudFormation スタックをデプロイするためのアクセス権 AWS アカウント を持つアクティブな 。CloudFormation をデプロイするための AWS Identity and Access Management (IAM) [ユーザーまたはロールのアクセス許可](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/control-access-with-iam.html)があることを確認します。
+ AWS Command Line Interface (AWS CLI) [がインストールされています](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。ローカルマシンまたは環境で AWS 認証情報[を設定するには](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)、 を使用するか、 `~/.aws/credentials` ファイルで環境変数 AWS CLI を設定します。
+ OpenSSL が[インストールされていること](https://www.openssl.org/)。
+ Docker が[インストールされていること](https://www.docker.com/get-started/)。
+ [「 ツール](#simplify-application-authentication-with-mutual-tls-in-amazon-ecs-tools)」で AWS のサービス 説明されている に精通していること。
+ Docker と NGINX に関する知識があること。

**制限事項**
+ Application Load Balancer の相互 TLS は、X.509v3 クライアント証明書のみをサポートします。X.509v1 クライアント証明書はサポートされていません。
+ このパターンのコードリポジトリで提供されている CloudFormation テンプレートには、スタックの一部として CodeBuild プロジェクトのプロビジョニングは含まれていません。
+ 一部の AWS のサービス は、すべてで利用できるわけではありません AWS リージョン。利用可能なリージョンについては、「[AWS サービス (リージョン別)](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」を参照してください。特定のエンドポイントについては、[「サービスエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」を参照して、サービスのリンクを選択してください。

**製品バージョン**
+ Docker バージョン 27.3.1 以降。
+ AWS CLI バージョン 2.14.5 以降

## アーキテクチャ
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-architecture"></a>

次の図は、このパターンのアーキテクチャコンポーネントを示しています。

![\[Application Load Balancer を使用して相互 TLS で認証するワークフロー\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a343fa4e-097f-416b-9c83-01a28eb57dc3/images/e1371297-b987-4487-9b13-8120933c921f.png)


 この図表は、次のワークフローを示しています:

1. Git リポジトリを作成し、アプリケーションコードをリポジトリにコミットします。

1. でプライベート認証機関 (CA) を作成します AWS Private CA。

1. CodeBuild プロジェクトを作成する。CodeBuildproject は、コミットの変更によってトリガーされ、Docker イメージを作成し、ビルドされたイメージを Amazon ECR に発行します。

1. CA から証明書チェーンと証明書本文をコピーし、証明書バンドルを Amazon S3 にアップロードします。

1. Amazon S3 にアップロードした CA バンドルを使用してトラストストアを作成します。Application Load Balancer (ALB) の相互 TLS リスナーにトラストストアを関連付けます。

1. プライベート CA を使用して、コンテナワークロードにクライアント証明書を発行します。また、 を使用してプライベート TLS 証明書を作成します AWS Private CA。

1. プライベート TLS 証明書を AWS Certificate Manager (ACM) にインポートし、ALB で使用します。

1. `ServiceTwo` のコンテナワークロードは、発行されたクライアント証明書を使用して、`ServiceOne` のコンテナワークロードと通信するときに ALB で認証します。

1. `ServiceOne` のコンテナワークロードは、発行されたクライアント証明書を使用して、`ServiceTwo` のコンテナワークロードと通信するときに ALB で認証します。

**自動化とスケール**

このパターンは、CloudFormation、 AWS Cloud Development Kit (AWS CDK) または SDK の API オペレーションを使用して AWS リソースをプロビジョニングすることで完全に自動化できます。

 AWS CodePipeline を使用して、CodeBuild を使用して継続的インテグレーションと継続的デプロイ (CI/CD) パイプラインを実装し、コンテナイメージのビルドプロセスを自動化し、Amazon ECS クラスターサービスに新しいリリースをデプロイできます。

## ツール
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-tools"></a>

**AWS のサービス **
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) は、 AWS ウェブサイトとアプリケーションを保護するパブリックおよびプライベート SSL/TLS X.509 証明書とキーの作成、保存、更新に役立ちます。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) は、 AWS リソースをセットアップし、迅速かつ一貫してプロビジョニングし、 AWS アカウント および 全体のライフサイクルを通じてリソースを管理するのに役立ちます AWS リージョン。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) は完全マネージド型の構築サービスです。ソースコードのコンパイル、ユニットテストの実行、すぐにデプロイできるアーティファクトの生成を行います。
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。
+ [Amazon Elastic Container Service (Amazon ECS)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) は、クラスターでコンテナの実行、停止、管理を簡単に行うことのできる、スケーラビリティに優れた高速なコンテナ管理サービスです。タスクとサービスは、 が管理するサーバーレスインフラストラクチャで実行できます AWS Fargate。または、インフラストラクチャをより詳細に制御するために、管理する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのクラスターでタスクとサービスを実行できます。
+ [Amazon ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html) を使用すると、最初にホストコンテナのオペレーティングシステムとやり取りしたり、インバウンドポートを開いたり、SSH キーを管理したりすることなく、コンテナと直接やり取りできます。ECS Exec を使用して、Amazon EC2 インスタンスまたは AWS Fargateで実行されているコンテナでコマンドを実行したり、シェルを取得したりできます。
+ [Elastic Load Balancing (ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) は、受信するアプリケーションまたはネットワークのトラフィックを複数のターゲットに分散します。例えば、1 つ以上のアベイラビリティーゾーンの Amazon EC2 インスタンス、コンテナ、および IP アドレスにトラフィックを分散できます。ELB は、登録されているターゲットの状態をモニタリングし、正常なターゲットにのみトラフィックをルーティングします。ELB は、受信トラフィックの時間的な変化に応じて、ロードバランサーをスケールします。また、大半のワークロードに合わせて自動的にスケールできます。
+ [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) を使用すると、サーバーや Amazon EC2 インスタンスを管理せずにコンテナを実行できます。Fargate は Amazon ECS と Amazon Elastic Kubernetes Service (Amazon EKS) の両方と互換性があります。Amazon ECS タスクとサービスは、Fargate 起動タイプまたは Fargate キャパシティプロバイダーで実行できます。そのためには、アプリケーションをコンテナにパッケージ化し、CPU とメモリ要件を指定して、ネットワークと IAM ポリシーを定義してから、アプリケーションを起動します。各Fargate タスクは、独自の分離境界を持ち、基盤となるカーネル、CPU リソース、メモリリソース、Elastic Network Interface を別のタスクと共有しません。
+ [AWS Private Certificate Authority](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) では、オンプレミス CA の運用にかかる投資コストや保守コストなしに、ルート CA や下位 CA を含むプライベート認証機関 (CA) 階層を作成できます。

**その他のツール******
+ [Docker](https://www.docker.com/) は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしての Platform as a Service (PaaS) 製品のセットです。
+ [GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories)、[GitLab](https://docs.gitlab.com/ee/user/get_started/get_started_projects.html)、[Bitbucket](https://support.atlassian.com/bitbucket-cloud/docs/tutorial-learn-bitbucket-with-git/) は、ソースコードの変更を追跡するために一般的に使用される Git ベースのソース管理システムの一部です。
+ [NGINX オープンソース](https://nginx.org/en/docs/?_ga=2.187509224.1322712425.1699399865-405102969.1699399865)は、オープンソースのロードバランサー、コンテンツキャッシュ、ウェブサーバーです。このパターンでは、ウェブサーバーとして使用します。
+ [OpenSSL](https://www.openssl.org/) は、TLS と CMS の OpenSSL 実装で使用されるサービスを提供するオープンソースライブラリです。

**コードリポジトリ**

このパターンのコードは、GitHub の [mTLS-with-Application-Load-Balancer-in-Amazon-ECS](https://github.com/aws-samples/mTLS-with-Application-Load-Balancer-in-Amazon-ECS) リポジトリで入手できます。

## ベストプラクティス
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-best-practices"></a>
+ Amazon ECS Exec を使用して、コマンドを実行するか、Fargate で実行されているコンテナにシェルを取得します。ECS Exec を使用すると、デバッグに必要な診断情報を収集することもできます。
+ セキュリティグループとネットワークアクセスコントロールリスト (ACL) を使用して、サービス間のインバウンドトラフィックとアウトバウンドトラフィックを制御します。Fargate のタスクは仮想プライベートクラウド (VPC) 内の設定済みサブネットから IP アドレスを受け取ります。

## エピック
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-epics"></a>

### リポジトリを作成する
<a name="create-the-repository"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ソースコードをダウンロードします。 | このパターンのソースコードをダウンロードするには、GitHub の [mTLS-with-Application-Load-Balancer-in-Amazon-ECS](https://github.com/aws-samples/mTLS-with-Application-Load-Balancer-in-Amazon-ECS) リポジトリをフォークまたはクローンします。 | DevOps エンジニア | 
| Git リポジトリを作成します。 | Dockerfile と `buildspec.yaml` ファイルを含む Git リポジトリを作成するには、次の手順を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)`git clone https://github.com/aws-samples/mTLS-with-Application-Load-Balancer-in-Amazon-ECS.git` | DevOps エンジニア | 

### CA を作成して証明書を生成する
<a name="create-ca-and-generate-certificates"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| でプライベート CA を作成します AWS Private CA。 | プライベート認証局 (CA) を作成するには、ターミナルで次のコマンドを実行します。サンプル変数の値は独自の値に置き換えます。<pre>export AWS_DEFAULT_REGION="us-west-2"<br />export SERVICES_DOMAIN="www.example.com"<br /><br />export ROOT_CA_ARN=`aws acm-pca create-certificate-authority \<br />    --certificate-authority-type ROOT \<br />    --certificate-authority-configuration \<br />    "KeyAlgorithm=RSA_2048,<br />    SigningAlgorithm=SHA256WITHRSA,<br />    Subject={<br />        Country=US,<br />        State=WA,<br />        Locality=Seattle,<br />        Organization=Build on AWS,<br />        OrganizationalUnit=mTLS Amazon ECS and ALB Example,<br />        CommonName=${SERVICES_DOMAIN}}" \<br />        --query CertificateAuthorityArn --output text`</pre>詳細については、 AWS ドキュメントの「 [でプライベート CA を作成する AWS Private CA](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)」を参照してください。 | DevOps エンジニア、AWS DevOps | 
| プライベートルート CA 証明書を作成してインストールします。 | プライベートルート CA の証明書を作成してインストールするには、ターミナルで次のコマンドを実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html) | AWS DevOps、DevOps エンジニア | 
| マネージド証明書をリクエストします。 | でプライベート ALB AWS Certificate Manager で使用するプライベート証明書をリクエストするには、次のコマンドを使用します。<pre>export TLS_CERTIFICATE_ARN=`aws acm request-certificate \<br />    --domain-name "*.${DOMAIN_DOMAIN}" \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --query CertificateArn --output text`</pre> | DevOps エンジニア、AWS DevOps | 
| プライベート CA を使用してクライアント証明書を発行します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)`openssl req -out client_csr1.pem -new -newkey rsa:2048 -nodes -keyout client_private-key1.pem``openssl req -out client_csr2.pem -new -newkey rsa:2048 -nodes -keyout client_private-key2.pem`このコマンドは、2 つのサービスの CSR とプライベートキーを返します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)<pre>SERVICE_ONE_CERT_ARN=`aws acm-pca issue-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --csr fileb://client_csr1.pem \<br />    --signing-algorithm "SHA256WITHRSA" \<br />    --validity Value=5,Type="YEARS" --query CertificateArn --output text` <br /><br />echo "SERVICE_ONE_CERT_ARN: ${SERVICE_ONE_CERT_ARN}"<br /><br />aws acm-pca get-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --certificate-arn ${SERVICE_ONE_CERT_ARN} \<br />     | jq -r '.Certificate' > client_cert1.cert<br /><br />SERVICE_TWO_CERT_ARN=`aws acm-pca issue-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --csr fileb://client_csr2.pem \<br />    --signing-algorithm "SHA256WITHRSA" \<br />    --validity Value=5,Type="YEARS" --query CertificateArn --output text` <br /><br />echo "SERVICE_TWO_CERT_ARN: ${SERVICE_TWO_CERT_ARN}"<br /><br />aws acm-pca get-certificate \<br />    --certificate-authority-arn ${ROOT_CA_ARN} \<br />    --certificate-arn ${SERVICE_TWO_CERT_ARN} \<br />     | jq -r '.Certificate' > client_cert2.cert</pre>詳細については、 AWS ドキュメントの[「プライベートエンドエンティティ証明書を発行](https://docs.aws.amazon.com/privateca/latest/userguide/PcaIssueCert.html)する」を参照してください。 | DevOps エンジニア、AWS DevOps | 

### AWS サービスをプロビジョニングする
<a name="provision-aws-services"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CloudFormation テンプレート AWS のサービス を使用してプロビジョニングします。 | 仮想プライベートクラウド (VPC)、Amazon ECS クラスター、Amazon ECS サービス、Application Load Balancer、Amazon Elastic Container Registry (Amazon ECR) をプロビジョニングするには、CloudFormation テンプレートを使用します。 | DevOps エンジニア | 
| 変数を取得します。 | 2 つのサービスが実行されている Amazon ECS クラスターがあることを確認します。リソースの詳細を取得し、変数として保存するには、次のコマンドを使用します。<pre><br />export LoadBalancerDNS=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`LoadBalancerDNS`].OutputValue')<br /><br />export ECRRepositoryUri=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ECRRepositoryUri`].OutputValue')<br /><br />export ECRRepositoryServiceOneUri=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ECRRepositoryServiceOneUri`].OutputValue')<br /><br />export ECRRepositoryServiceTwoUri=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ECRRepositoryServiceTwoUri`].OutputValue')<br /><br />export ClusterName=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`ClusterName`].OutputValue')<br /><br />export BucketName=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`BucketName`].OutputValue')<br /><br />export Service1ListenerArn=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`Service1ListenerArn`].OutputValue')<br /><br />export Service2ListenerArn=$(aws cloudformation describe-stacks --stack-name ecs-mtls \<br />--output text \<br />--query 'Stacks[0].Outputs[?OutputKey==`Service2ListenerArn`].OutputValue')</pre> | DevOps エンジニア | 
| CodeBuild プロジェクトを作成する。 | CodeBuild プロジェクトを使用して Amazon ECS サービスの Docker イメージを作成するには、次の手順を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)詳細については、 AWS ドキュメントの[「 でビルドプロジェクトを作成する AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/create-project.html)」を参照してください。 | AWS DevOps、DevOps エンジニア | 
| Docker イメージを構築します。 | CodeBuild を使用してイメージビルドプロセスを実行できます。CodeBuild には Amazon ECR とやりとりしたり Amazon S3 を操作したりするためのアクセス権限が必要です。プロセスの一環として、Docker イメージがビルドされ、Amazon ECR レジストリにプッシュされます。テンプレートとコードの詳細については、「[追加情報](#simplify-application-authentication-with-mutual-tls-in-amazon-ecs-additional)」を参照してください。(オプション) テスト目的でローカルでビルドするには、次のコマンドを使用します。<pre># login to ECR<br />aws ecr get-login-password | docker login --username AWS --password-stdin $ECRRepositoryUri<br /><br /># build image for service one<br />cd /service1<br />aws s3 cp s3://$BucketName/serviceone/ service1/ --recursive<br />docker build -t $ECRRepositoryServiceOneUri .<br />docker push $ECRRepositoryServiceOneUri<br /><br /># build image for service two<br />cd ../service2<br />aws s3 cp s3://$BucketName/servicetwo/ service2/ --recursive<br />docker build -t $ECRRepositoryServiceTwoUri .<br />docker push $ECRRepositoryServiceTwoUri</pre> | DevOps エンジニア | 

### 相互 TLS を有効にする
<a name="enable-mutual-tls"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| CA 証明書を Amazon S3 にアップロードします。 | CA 証明書を Amazon S3 バケットにアップロードするには、次のコマンド例を使用します。`aws s3 cp ca-cert.pem s3://$BucketName/acm-trust-store/ ` | AWS DevOps、DevOps エンジニア | 
| トラストストアを作成します。 | トラストストアを作成するには、次のコマンド例を使用します。<pre>TrustStoreArn=`aws elbv2 create-trust-store --name acm-pca-trust-certs \<br />    --ca-certificates-bundle-s3-bucket $BucketName \<br />    --ca-certificates-bundle-s3-key acm-trust-store/ca-cert.pem --query 'TrustStores[].TrustStoreArn' --output text`</pre> | AWS DevOps、DevOps エンジニア | 
| クライアント証明書をアップロードします。 | Docker イメージのクライアント証明書を Amazon S3 にアップロードするには、次のコマンド例を使用します。<pre># for service one<br />aws s3 cp client_cert1.cert s3://$BucketName/serviceone/<br />aws s3 cp client_private-key1.pem s3://$BucketName/serviceone/<br /><br /># for service two<br />aws s3 cp client_cert2.cert s3://$BucketName/servicetwo/<br />aws s3 cp client_private-key2.pem s3://$BucketName/servicetwo/</pre> | AWS DevOps、DevOps エンジニア | 
| リスナーを変更します。 | ALB で相互 TLS を有効にするには、次のコマンドを使用して HTTPS リスナーを変更します。<pre>aws elbv2 modify-listener \<br />    --listener-arn $Service1ListenerArn \<br />    --certificates CertificateArn=$TLS_CERTIFICATE_ARN_TWO \<br />    --ssl-policy ELBSecurityPolicy-2016-08 \<br />    --protocol HTTPS \<br />    --port 8080 \<br />    --mutual-authentication Mode=verify,TrustStoreArn=$TrustStoreArn,IgnoreClientCertificateExpiry=false<br /><br />aws elbv2 modify-listener \<br />    --listener-arn $Service2ListenerArn \<br />    --certificates CertificateArn=$TLS_CERTIFICATE_ARN_TWO \<br />    --ssl-policy ELBSecurityPolicy-2016-08 \<br />    --protocol HTTPS \<br />    --port 8090 \<br />    --mutual-authentication Mode=verify,TrustStoreArn=$TrustStoreArn,IgnoreClientCertificateExpiry=false<br /></pre>詳細については、 AWS ドキュメントの[Application Load Balancer での相互 TLS の設定](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/configuring-mtls-with-elb.html)」を参照してください。 | AWS DevOps、DevOps エンジニア | 

### サービスを更新する
<a name="update-the-services"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon ECS タスク定義を更新します。 | Amazon ECS タスク定義を更新するには、新しいリビジョンで `image` パラメータを変更します。それぞれのサービスの値を取得するには、前のステップで構築した新しい Docker イメージ URI (`echo $ECRRepositoryServiceOneUri` または `echo $ECRRepositoryServiceTwoUri`) でタスク定義を更新します。<pre><br />    "containerDefinitions": [<br />        {<br />            "name": "nginx",<br />            "image": "public.ecr.aws/nginx/nginx:latest",   # <----- change to new Uri<br />            "cpu": 0,</pre>詳細については、 AWS ドキュメント[の「コンソールを使用した Amazon ECS タスク定義の更新](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-task-definition-console-v2.html)」を参照してください。 | AWS DevOps、DevOps エンジニア | 
| Amazon ECS サービスを更新します。 | 最新のタスク定義でサービスを更新します。このタスク定義は、新しく構築された Docker イメージのブループリントであり、相互 TLS 認証に必要なクライアント証明書が含まれています。 サービスを更新するには、次の手順を使用します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html)他のサービスについても、この手順を繰り返します。 | AWS 管理者、AWS DevOps、DevOps エンジニア | 

### アプリケーションにアクセスする
<a name="access-the-application"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| アプリケーション URL をコピーします。 | Amazon ECS コンソールを使用してタスクを表示します。タスクステータスが**実行中**に更新されたら、タスクを選択します。**[タスク]** セクションで、タスク ID をコピーします。 | AWS 管理者、AWS DevOps | 
| アプリケーションをテストします。 | アプリケーションをテストするには、ECS Exec を使用してタスクにアクセスします。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/simplify-application-authentication-with-mutual-tls-in-amazon-ecs.html) | AWS 管理者、AWS DevOps | 

## 関連リソース
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-resources"></a>

**Amazon ECS ドキュメント**
+ [コンソールを使用した Amazon ECS タスク定義の作成](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-task-definition.html)
+ [Amazon ECS で使用するコンテナイメージの作成](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html)
+ [Amazon ECS クラスター](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html)
+ [の Amazon ECS AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-container-image.html#create-container-image-next-steps)
+ [Amazon ECS ネットワーキングのベストプラクティス](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/networking-best-practices.html)
+ [Amazon ECS サービス定義パラメータ](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_definition_parameters.html)

**その他の AWS リソース**
+ [AWS プライベート CA を使用して Application Load Balancer で mTLS を設定する方法を教えてください。](https://repost.aws/knowledge-center/elb-alb-configure-private-ca-mtls) (AWS re:Post)

## 追加情報
<a name="simplify-application-authentication-with-mutual-tls-in-amazon-ecs-additional"></a>

**Docker ファイルの編集******

以下のコードは、サービス 1 の Dockerfile で編集するコマンドを示しています。

```
FROM public.ecr.aws/nginx/nginx:latest
WORKDIR /usr/share/nginx/html
RUN echo "Returning response from Service 1: Ok" > /usr/share/nginx/html/index.html
ADD client_cert1.cert client_private-key1.pem /usr/local/share/ca-certificates/
RUN chmod -R 400 /usr/local/share/ca-certificates/
```

以下のコードは、サービス 2 の Dockerfile で編集するコマンドを示しています。

```
FROM public.ecr.aws/nginx/nginx:latest
WORKDIR /usr/share/nginx/html
RUN echo "Returning response from Service 2: Ok" > /usr/share/nginx/html/index.html
ADD client_cert2.cert client_private-key2.pem /usr/local/share/ca-certificates/
RUN chmod -R 400 /usr/local/share/ca-certificates/
```

CodeBuild を使用して Docker イメージを構築する場合、`buildspec` ファイルは CodeBuild ビルド番号を使用してイメージバージョンをタグ値として一意に識別します。次の `buildspec ` カスタムコードに示すように、要件に合わせて `buildspec` ファイルを変更できます。

```
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=${COMMIT_HASH:=latest}
  build:
    commands:
        # change the S3 path depending on the service
      - aws s3 cp s3://$YOUR_S3_BUCKET_NAME/serviceone/ $CodeBuild_SRC_DIR/ --recursive 
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $ECR_REPOSITORY_URI:latest .
      - docker tag $ECR_REPOSITORY_URI:latest $ECR_REPOSITORY_URI:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker images...
      - docker push $ECR_REPOSITORY_URI:latest
      - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG
      - echo Writing image definitions file...
      # for ECS deployment reference
      - printf '[{"name":"%s","imageUri":"%s"}]' $CONTAINER_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json   

artifacts:
  files:
    - imagedefinitions.json
```