PipeCD: 本番を想定したコントロールプレーンの構築ーECS Fargate編
tl;dr
PipeCDのコントロールプレーンを本番を想定した構成でECS Fargate上に構築します。
コントロールプレーンの別の環境への構築方法は以下を参照してください。
参考にしたもの
ほぼほぼこのデモをやっていきます。
構成
PipeCDとは
PipeCDは、異なる種類のアプリケーション・インフラでプログレッシブデリバリーを実現するためのGitOpsスタイルのCDツールです。
PipeCDの特徴とメリットは以下の通りです:
- Kubernetes以外の対象(AWS Lambda, ECS, Google Cloud Run, Terraform)にもGitOpsスタイルの統一したインターフェースでデプロイが可能。
- 汎用性の高いパイプライン機構により、さまざまなデプロイ戦略を実行可能。
- 大規模組織や複数のプロジェクトを持つ場合でも利用しやすいマルチテナンシーの運用が可能。
PipeCDはControlPlane(アプリケーションのステート管理やAPI/WebUIの提供など)とPiped(デリバリを制御するコンポーネント)という2つのコンポーネントに分かれており、Pipedは定期的にControlPlaneに問い合わせることで動作します。これにより、PipeCDの利用者は、Pipedというステートレスなワンバイナリのエージェントをどこにでも配置することで、さまざまなプロバイダに対するアプリケーションのデリバリが可能となります。
前提
AWSアカウントは既に作成済みとします。
今回使用するAWSの各サービスやインフラ知識はあるものとしています。(あんまりよく分からなくても進むことはできると思います!やっていこー)
サンプル
kentakozuka/pipecd-sample/にあります。
FIXME
と書いてある箇所をご自身の値に書き換えれば動く、、、はずですw
なにかあればIssue立ててくれると助かりますmm
準備
Controle Plane Configの設定
control-plane-config.yaml
のFIXME
と書いてある部分を書き換えます。
Secret Manager
base64 -i config/control-plane-config.yaml > config/control-plane-config-encrypted
base64 -i config/envoy-config.yaml > config/envoy-config-encypted
aws secretsmanager create-secret --region ap-northeast-1 --name PipecdEnvoyConfig --secret-string file://${PWD}/ecs/control-plane/infra/config/envoy-config-encypted
aws secretsmanager create-secret --region ap-northeast-1 --name PipecdControlPlaneConfig --secret-string file://${PWD}/ecs/control-plane/infra/config/control-plane-config.yaml
aws secretsmanager create-secret --region ap-northeast-1 --name PipecdEncryptionKey --secret-string file://${PWD}/ecs/control-plane/infra/config/encryption-key
ACM
ACMで証明書を作ります。
export DOMAIN_NAME="pipecd-ecs.kentakozuka.com"
aws acm request-certificate \
--region ap-northeast-1 \
--domain-name $DOMAIN_NAME \
--validation-method DNS
DNSゾーン作成
ゾーンの作成
export ZONE_NAME="pipecd-ecs.kentakozuka.com"
aws route53 create-hosted-zone \
--name $ZONE_NAME \
--caller-reference `date +"%Y-%m-%d-%H-%M-%S"`
DNS NSの設定
作成したゾーンのNSレコードの値を全てドメインサービスのNSレコードとして登録します。
私のはGoogle Domainなので、そこにレコードを作ります
ドメイン認証
Route 53のページへ行き、「Route 53でレコードを作成」をクリックして、バリデーション用のレコードを作成します。
少し待つとステータスが「発行済み」に代わります。
PipeCDのデプロイ
Terraform
variables.tf
のFIXME
と書いてある部分を書き換えます。
Terraformの実行
terraform init
terraform plan
terraform apply
Session Managerを使ってアクセス
Session Managerを使ってアクセスします。
export CLUSTER="pipecd"
export TASK_ID="005xxxxxxxxxxxxxxxxx00149c00"
export CONTAINER_ID="000xxxxxxxxxxxxxxxxx-148700000"
aws ssm start-session \
--region ap-northeast-1 \
--target ecs:${CLUSTER}_${TASK_ID}_${CONTAINER_ID} \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["9090"],"localPortNumber":["18080"]}'
http://localhost:18080/ をブラウザで開きます。
ドメインでアクセス
自分のドメインでPipeCDのALBへアクセスできるようにゾーンにレコードを追加します。
無事アクセスできました。
Discussion