皆さん、お疲れ様です!秋葉です。
前回の基礎編では、Amazon WorkSpaces Cost Optimizerの概要と主要な設定パラメータについて解説しました。
「さっそく導入だ!」といきたいところですが、実際の現場、特にセキュリティ要件が厳しい案件など「インターネット接続が許可されない閉域環境(プライベートサブネットのみ)」では、標準のテンプレートから構築するだけでは動作しません…。
そこで今回は、そんな厳しい制約下でもコスト最適化を諦めない、「インターネット非接続環境」向けの実装手順を解説します!
事前準備
コンテナイメージを操作するため、インターネットに接続可能な作業用端末に Docker Desktop をインストールしておいてください。
Docker: コンテナー アプリケーション開発の加速

実装手順
本手順は、以下AWSブログを参考に記載しています。
https://aws.amazon.com/jp/blogs/desktop-and-application-streaming/deploy-the-cost-optimizer-for-amazon-workspaces-in-a-highly-regulated-environment/
手順① プライベートECRリポジトリを作成する
AWSマネジメントコンソールで、このソリューション専用のリポジトリを作成します。

手順② コンテナイメージをプッシュする
2-1 公式イメージを取得する(Pull)
作業用端末で、AWSが公開している最新のCost Optimizerイメージを手元にダウンロードします。
docker pull public.ecr.aws/aws-solutions/workspaces-cost-optimizer:v2.8_stable

2-2 DockerクライアントでECRにログイン(認証)
作業用端末から自社のECRへプッシュできる権限を認証します。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
2-3 Dockerイメージをプッシュする
取得した公式イメージにタグを付け直し、手順①で作った自社リポジトリへプッシュします。
docker tag <イメージID> 528900497898.dkr.ecr.ap-northeast-1.amazonaws.com/costoptimizer-akiba/private-ecs-akiba:Test
docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/costoptimizer-akiba/private-ecs-akiba:Test

手順③ VPCエンドポイントの作成
以下のサービスに対し、VPCエンドポイントを作成します。
| エンドポイント名 | 使用用途 |
| com.amazonaws.ap-northeast-1.ecr.api | FargateがECRからコンテナイメージの情報を取得し、認証を行うために使用 |
| com.amazonaws.ap-northeast-1.ecr-dkr | 実際にコンテナイメージをプルするために使用 |
| com.amazonaws.ap-northeast-1.ecs-agent | Fargate上のエージェントが、コンテナの起動・停止などの指示をECSコントロールプレーンから受け取るために使用 |
| com.amazonaws.ap-northeast-1.ecs-telemetry | Fargateの状態やメトリクスをECSサービス側に送信するために使用 |
| com.amazonaws.ap-northeast-1.logs | Fargateの標準出力(awslogs)をCloudWatch Logsへ転送するために使用 |
| com.amazonaws.ap-northeast-1.monitoring | CloudWatch Metricsから、各WorkSpacesの UserConnected(ユーザー接続履歴)や Available メトリクスを取得し、変更判断を行うために使用 |
| com.amazonaws.ap-northeast-1.workspaces | ・稼働中のWorkSpaces一覧を取得する (DescribeWorkspaces) ・課金モード(AutoStop/AlwaysOn)を変更する |
| com.amazonaws.ap-northeast-1.sts | IAMロールの一時認証に使用 |
| com.amazonaws.ap-northeast-1.s3(Gateway型) | ECRの実体データ(レイヤー)はS3に保存されているため、ECRからイメージをプルする裏側でS3へのアクセスが発生 |
| com.amazonaws.ap-northeast-1.dynamodb(Gateway型:なくても動作は可能) | Spokeアカウントを使用する際に使用 |
| com.amazonaws.ap-northeast-1.secretsmanager(なくても動作は可能) | – |
手順④ IAMロールの更新
ECSタスク実行ロールなどが、新しく作成したECRリポジトリやVPCエンドポイントを経由してリソースを操作できるよう、以下ポリシーを追記するように編集します。
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:GetLifecyclePolicy",
"ecr:GetLifecyclePolicyPreview",
"ecr:ListTagsForResource",
"ecr:DescribeImageScanFindings"
],
"Resource": ["*"]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": ["arn:aws:s3:::prod--starport-layer-bucket/*"]
}
手順⑤ セキュリティグループの更新
ECSタスクから各VPCエンドポイントへのHTTPS(ポート443)通信を許可します。
手順⑥ ECSタスクの更新
タスク定義を更新し、コンテナイメージの参照先を「2-3」でプッシュした自社ECRのURIに変更します。環境変数にて以下画像のように修正します。


手順⑦ EventBridgeルールの更新
手順⑥で更新したリビジョンを実行するように修正します。

まとめ
本構成の実装により、厳格なセキュリティポリシーを遵守しつつ、インターネットから完全に隔離された環境での自動コスト最適化が可能となります。今回ドヤ顔で解説していますが、実は構築中、画面の前で「なんで動かないの!?」と何度も頭を抱えました…。
基礎編とあわせて全2回にわたってお届けした「WorkSpaces Cost Optimizer」特集
本記事で紹介したポイントを軸に、ぜひ自身のプロジェクトや業務の中でWorkSpaces Cost Optimizerを活用してみてください。
これからAWSを使うみなさんの挑戦や成長の一助になれば幸いです。
ぜひ一緒に、“WorkSpaces Cost Optimizerマスター”を目指して頑張りましょう!

