stelligent mu で作成するECS Fargate用のCI/CD環境(検証環境と手動承認も付いてるよ)
はじめに
おはようございます、加藤です。AWSでCI/CDと言えばCodePipelineですよね、でもCodePipelineをInfrastructure as Codeで作るのはちょっと大変だったりしませんか? そんな悩みを解決してくれるツールを知ったので実際に触ってみました!
stelligent mu とは
stelligent mu(以降、mu)は、マイクロサービスをDockerコンテナ(以降、コンテナ)としてAWSへデプロイする為のプラットフォームです。 Lambda, API Gateway, DynamoDB をServerless Frameworkで扱うように、ECS, ECR, CodeBuild, CodePipeline, etc... をmuで扱う事ができます。 AWSへのデプロイはCloudFormation(CFn)を使用しています。
やってみた
公式のQuickstartではECS(EC2)が紹介されていましたが、最近Fargateが値下げされたのでFargateでやってみます!! 公式リポジトリの例を参考にしてECS FargateでNginxを動かしてみます。 検証・本番の2環境のVPC(NatGateway, ELB, etc...)を作成するので、途中までやって放置すると結構なAWS利用費がかかるのでご注意ください。
mu/examples/ecs-fargate at develop · stelligent/mu
インストール
Homebrewでmuをインストールします。
$ brew install stelligent/tap/mu-cli
Homebrewを使わず下記のコマンドでインストールも可能です。
$ curl -s https://getmu.io/install.sh | sh
Homebrewでインストールされたmuのバージョンは1.5.10でした。
$ mu --version mu version 1.5.10
GitHubの準備
Personal access tokens
GitHubのPersonal access tokenが必要です。下記ページより発行します。 Personal Access Tokens
下記の権限が必要です。
権限 | 用途 |
---|---|
repo | これは、パブリックおよびプライベートのリポジトリからアーティファクトを読み込んでパイプラインに引き込むために使用されます。 |
admin:repo_hook | 変更をコミットしてリポジトリにプッシュしたことを検出するために使用されます。 |
表示されたトークンをメモしてください。
リポジトリ
GitHubリポジトリを作成してください。私はmu-ecs-fargate
という名前で作成しました。
リポジトリをローカルにクローンします、自分のものに置き換えて下記のコマンドを実行してください。
$ git clone git@github.com:kmd2kmd/mu-ecs-fargate.git $ cd mu-ecs-fargate
以降はこのディレクトリで作業を行います。
ファイル作成
下記の4つのファイルを作成してください。
FROM nginx:alpine COPY index.html /usr/share/nginx/html/index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body>stelligent mu ECS Fargate</body> </html>
version: 0.1 phases: build: commands: - echo "replace me with real build commands..." artifacts: files: - index.html - mu.yml - Dockerfile
--- environments: - name: acceptance provider: ecs-fargate - name: production provider: ecs-fargate service: name: ecs-fargate healthEndpoint: / port: 80 pathPatterns: - /*
$ tree . ├── Dockerfile ├── buildspec.yml ├── index.html └── mu.yml 0 directories, 4 files
リポジトリにPushします。
$ git add --all && git commit -m "初回コミット" && git push
AWS認証情報の設定
muを使用するにはAWS認証情報が必要です。 私は下記ブログの手順を使って環境変数に格納しています。 [小ネタ]ディレクトリ移動した際に自動で一時クレデンシャルを取得・設定する | DevelopersIO
デプロイ
muを使ってデプロイします。
$ mu pipeline up
大量にStackが作成されます。
mu-ecs-fargateというパイプラインが作成されているので状態を確認します。
検証環境(Acceptance)へのデプロイまで完了し、本番環境(Production)へのデプロイ前に手動承認を待っている状態です。 CLIでも確認ができます。
$ mu svc show Pipeline URL: https://console.aws.amazon.com/codesuite/codepipeline/pipelines/mu-ecs-fargate/view?region=ap-northeast-1 +------------+----------+------------------------------------------+-------------+---------------------+ | STAGE | ACTION | REVISION | STATUS | LAST UPDATE | +------------+----------+------------------------------------------+-------------+---------------------+ | Source | Source | 4f16c4bdaecb19930fc06cd7698c2b6875c3eb57 | Succeeded | 2019-01-09 15:50:14 | | Build | Artifact | - | Succeeded | 2019-01-09 15:51:01 | | Build | Image | - | Succeeded | 2019-01-09 15:52:06 | | Acceptance | Deploy | - | Succeeded | 2019-01-09 16:00:56 | | Acceptance | Test | - | Succeeded | 2019-01-09 16:01:29 | | Production | Approve | - | InProgress | 0001-01-01 09:00:00 | | Production | Deploy | - | - | - | | Production | Test | - | - | - | +------------+----------+------------------------------------------+-------------+---------------------+ Deployments: +-------------+----------+------------------+---------------------+ | ENVIRONMENT | REVISION | STATUS | LAST UPDATE | +-------------+----------+------------------+---------------------+ | production | 392ff05 | CREATE_COMPLETE | 2019-01-09 15:38:28 | | acceptance | 392ff05 | CREATE_COMPLETE | 2019-01-09 15:38:28 | +-------------+----------+------------------+---------------------+
検証環境の状態を詳しく確認してみます。
$ mu env show acceptance Environment: acceptance Provider: ecs-fargate Cluster Stack: mu-environment-acceptance (CREATE_COMPLETE) VPC Stack: mu-vpc-acceptance (CREATE_COMPLETE) Bastion Host: Base URL: http://mu-load-Elb-1F7Z9KQS77LR-**********.ap-northeast-1.elb.amazonaws.com Services: +-------------+----------+------------------+---------------------+ | SERVICE | REVISION | STATUS | LAST UPDATE | +-------------+----------+------------------+---------------------+ | ecs-fargate | 4f16c4b | CREATE_COMPLETE | 2019-01-09 15:59:04 | +-------------+----------+------------------+---------------------+
Base URL
にブラウザでアクセスしてみましょう。下図のように表示されればOKです。
続いて本番環境にデプロイします。再びパイプラインの画面を開き、手動承認を行います。
コメントの入力は必須です。
AMCでパイプラインの画面を見るかmu svc show
でデプロイの完了を確認しましょう。
完了したらURLを確認してブラウザでアクセスします。
$ mu env show production Environment: production Provider: ecs-fargate Cluster Stack: mu-environment-production (CREATE_COMPLETE) VPC Stack: mu-vpc-production (CREATE_COMPLETE) Bastion Host: Base URL: http://mu-load-Elb-1LN7GPVWGGO24-*********.ap-northeast-1.elb.amazonaws.com Services: +-------------+----------+------------------+---------------------+ | SERVICE | REVISION | STATUS | LAST UPDATE | +-------------+----------+------------------+---------------------+ | ecs-fargate | 4f16c4b | CREATE_COMPLETE | 2019-01-09 17:17:47 | +-------------+----------+------------------+---------------------+
検証環境と同様に確認ができればOKです!!
環境の確認
まず、下図をごらんください。
ローカル端末で実行したmuによってCodePipelineが作成されます。CodePipeline内のCodeBuildでもmuを使用して環境のデプロイを行っています。 CFnのマネジメントコンソールを開きリソース一覧から追って確認して頂くと理解が深まりやすいと思います!
環境の破棄
まず、パイプラインを削除します。
$ mu pipeline term
次に、CFnでmu-*
というスタックが大量に作成されているので削除を行います。
下記のスタックはmuを使用する際に共通的に使用する物なので引き続き利用する場合は残して置きましょう、削除しても次回に再度作成はされます。
- mu-iam-common
- mu-bucket-codedeploy
- mu-bucket-codepipeline
一部のスタック(ECRやS3)はイメージやデータが残っているので削除に失敗します、エラーメッセージを確認してイメージ&データを削除してからリトライしてください。
あとがき
ECS Fargateの現実的なCI/CD環境が超簡単に作成できてしまいました。今回はお試しなのでSSL証明書やテストの実行などはカットしていますが、引き続き触ってできるか確認したいですね。 また、EKSにも対応しているようです。 興味があるかたは公式リポジトリのWikiに情報があるので触ってみてください!!