はじめに
ECS Fargateのデプロイ周りをやってみたので、導入や使い方の手順を備忘録として書きました。今更ながら私はECSを初めて触ったのですが、ECS周りの知識がない方は先にそちらの知識を入れることをおすすめします。
動機
ECS Fargateでサービスを運用していく際に、Terraformでリソース作成、GitHub Actionsでデプロイを行うとすると
- ECSタスク定義が2重管理になる
- Terraformで管理する他リソースとコンテナ上のアプリケーションの更新サイクルが異なる
などあり、Terraformの管理とコンテナデプロイを分けたい場合があります。
そこで、ecspressoというツールを使って、コンテナ周りの管理を行います。
導入手順
Macbook Pro M2へインストールする手順になります。
ecspressoのインストール
- Homebrewでインストール
> brew install kayac/tap/ecspresso
- asdfでインストール
> asdf plugin add ecspresso
> asdf install ecspresso latest
> asdf global ecspresso latest
AWS Credentialsの設定
ecspressoを使うには、~/.aws/credentials
にAWS CLIのプロファイルを作成しておく必要があります。
.aws/credentials
[<プロファイル名>]
aws_access_key_id = <IAMから取得>
aws_secret_access_key = <IAMから取得>
region = <リージョン>
[<プロファイル名>-long-term]
aws_access_key_id = <IAMから取得>
aws_secret_access_key = <IAMから取得>
region = <リージョン>
aws_mfa_device = MFA_DEVICE_ARN(IAMで確認)
> export AWS_PROFILE=<プロファイル名>
使い方
既存のECSクラスタを読み込む
config.yaml
に指定した名前でファイルが生成されます。
> ecspresso init --config config.yaml --region ap-northeast-1 --cluster < ECSクラスタ名 > --service < ECSサービス名 >
デプロイ
> ecspresso deploy --config config.yaml
その他TIPS
envfileから値を取得
env
やmust_env
などのキーを使って環境変数から値を取ってくることができます。
ecs-service-def.json
...
"loadBalancers": [
{
"containerName": "{{ must_env `CONTAINER_NAME` }}",
...
}
],
...
実行
> ecspresso deploy --envfile <ENVファイル> --config <YAMLファイル>
tfstateから値を取得
設定ファイルにtfstateを置いているURLを追加します。
config.yaml
plugins:
- name: tfstate
config:
url: "s3://hogehoge/test/terraform.tfstate"
以下のように取得。
ecs-service-def.json
...
"networkConfiguration": {
"awsvpcConfiguration": {
"assignPublicIp": "DISABLED",
"securityGroups": [
"{{ tfstate `AAAA.id` }}",
"{{ tfstate `BBBB.id` }}",
"{{ tfstate `CCCC.id` }}"
],
"subnets": [
"{{ tfstate `XXXX.id` }}",
"{{ tfstate `YYYY.id` }}",
"{{ tfstate `ZZZZ.id` }}"
]
}
},
...
参考
以下のリンクで詳細に書かれています。