こんにちはエンジニアの sakasai です。
今回はAmazon ECSを使うためのコマンドラインツールAWS Copilotを使ってFocalboardが実行できる環境を作ってみようと思います。
AWS Copilotとは
上述の通りAmazon ECSを使うためのコマンドラインツールです。
いくつかのコマンドを実行するだけでECS上で実行するコンテナアプリケーションのビルド、リリース、運用を実現することが出来ます。
App Runnerにも対応しています。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/AWS_Copilot.html
https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/
AWS Copilotについては下記のLiveDemoがわかりやすいと思います。自分も参考にさせていただきました。
Focalboardとは
こちらのブログでも何度か紹介させていただいてますが、チャットツールのMattermostが開発しているオープンソースのプロジェクト管理ツールです。
https://github.com/mattermost/focalboard
現在GAに向けて開発が行われています。
Mattermostのプラグインとしても開発されていますが、セルフホスト型のツールとしても開発されています。
Dockerイメージも公開されているのでローカル環境でちょっと試してみるなど気軽にできるかと思います。
https://hub.docker.com/r/mattermost/focalboard
今回はこちらを使ってAmazon ECSにデプロイしてみようと思います。
やってみる
それではさっそくやってみます。
今回使用しているDockerfileなどはGithubで公開していますので参照してください。
https://github.com/msakasai/Focalboard-on-Docker
AWS Copilotのインストールなどについては公式ドキュメント等を参照してください。
今回は下記バージョンで実行していきます。
% copilot --version
copilot version: v1.9.0
copilot app init
https://aws.github.io/copilot-cli/ja/docs/commands/app-init/
最初にアプリケーションを作成します。
コマンドはDockerfileがあるディレクトリで実行します。
% ls
Dockerfile LICENSE README.md copilot docker-compose.yml
% copilot app init
What would you like to name your application? [? for help] focalboard-app
最初にアプリケーション名が聞かれるので今回は「focalboard-app」とつけました。
入力するとアプリケションの作成が行われます。
Application name: focalboard-app
✔ Created the infrastructure to manage services and jobs under application focalboard-app..
✔ The directory copilot will hold service manifests for application focalboard-app.
AWS Copilotを実行するとCloudFormationでAWS上にリソースが作成されます。
この時点ではアプリケーション用のロールがいくつか作成されています。
copilot env init
https://aws.github.io/copilot-cli/ja/docs/commands/env-init/
次にdevelopmentやstaging、productionなどの環境を作成します。
% copilot env init
What is your environment's name? [? for help] development
最初に環境名が聞かれるので今回は「development」にしました。
Which credentials would you like to use to create development? [Use arrows to move, type to filter, ? for more help]
Enter temporary credentials
> [profile default]
[profile test]
次に環境を作るAWSプロファイルが聞かれます。
ローカルにAWS Configureでセットアップしたプロファイルが複数ある場合はそこから選ぶことが出来ます。
Would you like to use the default configuration for a new environment?
- A new VPC with 2 AZs, 2 public subnets and 2 private subnets
- A new ECS Cluster
- New IAM Roles to manage services and jobs in your environment
[Use arrows to move, type to filter]
> Yes, use default.
Yes, but I'd like configure the default resources (CIDR ranges).
No, I'd like to import existing resources (VPC, subnets).
次にVPCやサブネットなどのネットワーク周りの作成について聞かれます。
デフォルトを選択すると作成する環境用に新たにVPCなどが作られます。今回はデフォルトを選択して新たに作りました。
選択後にリソースの作成が行われます。
✔ Proposing infrastructure changes for the focalboard-app-development environment.
- Creating the infrastructure for the focalboard-app-development environment. [create complete] [88.7s]
- An IAM Role for AWS CloudFormation to manage resources [create complete] [24.6s]
- An ECS cluster to group your services [create complete] [10.3s]
- Enable long ARN formats for the authenticated AWS principal [create complete] [3.0s]
- An IAM Role to describe resources in your environment [create complete] [24.4s]
- A security group to allow your containers to talk to each other [create complete] [5.6s]
- An Internet Gateway to connect to the public internet [create complete] [17.8s]
- Private subnet 1 for resources with no internet access [create complete] [16.7s]
- Private subnet 2 for resources with no internet access [create complete] [16.7s]
- Public subnet 1 for resources that can access the internet [create complete] [16.7s]
- Public subnet 2 for resources that can access the internet [create complete] [16.7s]
- A Virtual Private Cloud to control networking of your AWS resources [create complete] [17.8s]
✔ Created environment development in region ap-northeast-1 under application focalboard-app.
完了するとAWS上でも実際に作成されていることが確認できました。(下記画像以外のリソースも作られています)
copilot svc init
https://aws.github.io/copilot-cli/ja/docs/commands/svc-init/
環境ができたらサービスを作っていきます。
まずはinitコマンドを実行します。
% copilot svc init
Note: It's best to run this command in the root of your workspace.
Which service type best represents your service's architecture? [Use arrows to move, type to filter, ? for more help]
Request-Driven Web Service (App Runner)
> Load Balanced Web Service (Internet to ECS on Fargate)
Backend Service (ECS on Fargate)
最初にサービスの種類を聞かれます。今回はApp RunnerではなくFargateで実行するサービスでかつロードバランサーからトラフィックを受け取るアプリケーションをデプロイするので「Load Balanced Web Service」を選択します。
What do you want to name this Load Balanced Web Service? [? for help] focalboard-frontend
次にサービスの名前が聞かれます。今回は「focalboard-frontend」という名前にしました。
Which Dockerfile would you like to use for focalboard-frontend? [Use arrows to move, type to filter, ? for more help]
> ./Dockerfile
Enter custom path for your Dockerfile
Use an existing image instead
次に使用するDockerfileを聞かれるのでローカルのファイルパスをそのまま選択します。
Service type: Load Balanced Web Service
Service name: focalboard-frontend
Dockerfile: ./Dockerfile
Note: Architecture type arm64 is currently unsupported. Setting platform linux/amd64 instead.\nSee 'platform' field in your manifest.\n
✔ Wrote the manifest for service focalboard-frontend at copilot/focalboard-frontend/manifest.yml
Your manifest contains configurations like your container size and port (:8000).
✔ Created ECR repositories for service focalboard-frontend..
initが終わるとローカルにmanifest.ymlという設定ファイルが作成されます。
% ls copilot/focalboard-frontend
manifest.yml
ここにサービスの設定などが記述されています。
今回は特に変更しませんが、この中身を書き換えることで各種設定の変更や追加をすることが出来ます。
https://aws.github.io/copilot-cli/ja/docs/manifest/lb-web-service/
copilot svc deploy
https://aws.github.io/copilot-cli/ja/docs/commands/svc-deploy/
initが終わったらサービスをデプロイします。
% copilot svc deploy
Only found one service, defaulting to: focalboard-frontend
Only found one environment, defaulting to: development
Environment development is already on the latest version v1.5.1, skip upgrade.
[+] Building 9.0s (6/6) FINISHED
...
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
Login Succeeded
Using default tag: latest
The push refers to repository
...
✔ Proposing infrastructure changes for stack focalboard-app-development-focalboard-frontend
- Creating the infrastructure for stack focalboard-app-development-focalboard-frontend [create complete] [269.8s]
- Service discovery for your services to communicate within the VPC [create complete] [1.5s]
- Update your environment's shared resources [update complete] [148.9s]
- A security group for your load balancer allowing HTTP and HTTPS traffic [create complete] [6.6s]
- An Application Load Balancer to distribute public traffic to your services [create complete] [121.0s]
- An IAM Role for the Fargate agent to make AWS API calls on your behalf [create complete] [25.6s]
- A CloudWatch log group to hold your service logs [create complete] [1.5s]
- An ECS service to run and maintain your tasks in the environment cluster [create complete] [59.1s]
Deployments
Revision Rollout Desired Running Failed Pending
PRIMARY 1 [completed] 1 1 0 0
- A target group to connect the load balancer to your service [create complete] [1.5s]
- An ECS task definition to group your containers and run them on ECS [create complete] [2.7s]
- An IAM role to control permissions for the containers in your tasks [create complete] [25.6s]
✔ Deployed focalboard-frontend, you can access it at http://xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com.
ローカルでビルドが行われ、コンテナイメージのプッシュが実行されて、ECS上にタスク定義などが作成され、アプリケーションが実行されます。
正常に完了すると最後にアクセス可能なロードバランサーのURLが表示されます。
また、マネージメントコンソール上でもESCのサービスでタスクが実行されていることが確認できました。
Focalboardにアクセス
表示されたURLにアクセスします。
ログイン画面が表示されました。
初回アクセスなので下部のリンクからアカウントを作成してみます。
アカウントを作成するとFocalboardにログインして使用できる状態になりました。
左下のボードを追加するで試しにボードを追加してみます。
「Project Tasks」のテンプレートを選んでみました。
テンプレートとサンプルのデータがいくつか入った状態で作成されます。
テンプレートで用意されているビューに切り替えたり、新たにビューを追加したりすることも出来ます。
copilot app delete
https://aws.github.io/copilot-cli/ja/docs/commands/app-delete/
このコマンドを実行すると関連付けられたリソースをすべて削除することが出来ます。
% copilot app delete
Are you sure you want to delete application focalboard-app? [? for help] (Y/n) y
実行するとすべて削除されます。
Are you sure you want to delete application focalboard-app? Yes
✔ Deleted service focalboard-frontend from environment development..
✔ Deleted resources of service focalboard-frontend from application focalboard-app..
✔ Deleted service focalboard-frontend from application focalboard-app.
✔ Deleted environment development from application focalboard-app..
✔ Cleaned up deployment resources..
✔ Deleted application resources..
✔ Deleted application configuration..
✔ Deleted local .workspace file.
まとめ
AWS CopilotでFocalboardを実行して使ってみました。
FocalboardはGAに向けて機能追加や改善が行われているので、いつか実際の業務でも使ってみたいと思っています。