ちょっと話題の記事

stelligent mu で作成するECS Fargate用のCI/CD環境(検証環境と手動承認も付いてるよ)

stelligent mu を使用して、ECS Fargate用のCI/CD環境を作成してみました。 検証環境と手動承認も付いています。
2019.01.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おはようございます、加藤です。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 変更をコミットしてリポジトリにプッシュしたことを検出するために使用されます。

表示されたトークンをメモしてください。

Prerequisites · stelligent/devops-essentials Wiki

リポジトリ

GitHubリポジトリを作成してください。私はmu-ecs-fargateという名前で作成しました。 リポジトリをローカルにクローンします、自分のものに置き換えて下記のコマンドを実行してください。

$ git clone git@github.com:kmd2kmd/mu-ecs-fargate.git
$ cd mu-ecs-fargate

以降はこのディレクトリで作業を行います。

ファイル作成

下記の4つのファイルを作成してください。

Dockerfile

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>stelligent mu ECS Fargate</body>
</html>

buildspec.yml

version: 0.1

phases:
  build:
    commands:
      - echo "replace me with real build commands..."

artifacts:
  files:
    - index.html
    - mu.yml
    - Dockerfile

mu.yml

---
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に情報があるので触ってみてください!!