🐕

PipeCD: 本番を想定したコントロールプレーンの構築ーECS Fargate編

2023/07/06に公開

tl;dr

PipeCDのコントロールプレーンを本番を想定した構成でECS Fargate上に構築します。

コントロールプレーンの別の環境への構築方法は以下を参照してください。

参考にしたもの

https://github.com/pipe-cd/control-plane-aws-ecs-terraform-demo/

ほぼほぼこのデモをやっていきます。

構成

PipeCDとは

https://github.com/pipe-cd/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.yamlFIXMEと書いてある部分を書き換えます。

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.tfFIXMEと書いてある部分を書き換えます。

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