ecspresso advent calendar 2020 day 24 - lambroll, sailtrim
Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 24日目です。
ecspresso の兄弟プロダクト
ecspresso には、思想を一にした兄弟というべきデプロイツールがあります。AWS Lambda のデプロイツール lambroll と、Lightsail Container のデプロイツール sailtrim です。
ここでは、この2プロダクトを紹介します。
lambroll
AWS Lambda のデプロイツールです。「ラムロール」と読みます。
lambroll is a minimal deployment tool for AWS Lambda.
ミニマル、と名乗っているとおり、AWS Lambda に対して関数のみをデプロイすることに特化したツールです。
使用する設定ファイルは function.json
というファイルひとつだけ、その構造は AWS SDK の lambda.CreateFunctionInput
そのものです。
-
function.json
では ecspresso の定義ファイルと同様、env, must_env, tfstate 関数を使用したテンプレート処理が行えます - 指定したディレクトリの内容を zip にまとめて Lambda にデプロイすることと、
function.json
の変更を適用することができます - IAM Role, VPC(Subnet) などの管理は行いません
外部リソースの ID などは、tfstate 参照機能で解決します - 既存の関数と設定を
lambroll init
コマンドでコード化できます
function.json
は次のような形式になっています。
{
"Description": "hello function",
"FunctionName": "hello",
"Handler": "index.js",
"MemorySize": 128,
"Role": "{{ tfstate `aws_iam_role.lambda.arn` }}",
"Runtime": "nodejs12.x",
"Timeout": 5,
"TracingConfig": {
"Mode": "PassThrough"
}
}
もともと、Apex という軽量なデプロイツールを利用していたのですが、2019年にプロジェクトが停止してしまいました。代替として SAM や Serverless を試してはみたものの、フルスタック過ぎて Apex の代替にはなりづらく、それならば自分で書くしかない、と開発して2019年11月にリリースしたのが lambroll です。
使い勝手は ecspresso とほぼ同じになるように作ってあるため、ecspresso に慣れた人なら違和感なく扱えるかと思います。
内部で使用している構造体を SDK のものをそのままにするというのも ecspresso と同様です。そのため、2020年の re:Invent で発表された Lambda のコンテナイメージサポートに対しても、発表後1日以内に最小限のコード追加で対応できました。
sailtrim
2020年11月に発表された Lightsail Container のデプロイツールです。「セイルトリム」と読みます。
Lightsail Container は、簡単にロードバランサー込みでコンテナを使ったアプリケーションを公開できるサービスです。
ECS ではほぼ必須になる、IAM Role, サブネット、セキュリティーグループ、ターゲットグループなどの用意をせずに利用できるため、設定が非常に簡素です。
次の例は、nginx:latest
イメージを使用して Web サーバーを公開するための sailtrim の設定ファイルと定義ファイルです。この3ファイルのみで、コンテナで起動した nginx を HTTPS でグローバルに公開できます。
service: service.json
deployment: deployment.json
{
"containerServiceName": "container-service-1",
"power": "micro",
"scale": 1
}
{
"containers": {
"nginx": {
"image": "nginx:latest",
"command": [],
"environment": {},
"ports": {
"80": "HTTP"
}
}
},
"publicEndpoint": {
"containerName": "nginx",
"containerPort": 80,
"healthCheck": {
"healthyThreshold": 2,
"unhealthyThreshold": 2,
"timeoutSeconds": 2,
"intervalSeconds": 5,
"path": "/",
"successCodes": "200-499"
}
}
}
sailtrim も設定ファイルでのテンプレート処理による環境変数展開 (env, must_env) が利用できます。tfstate 連携は現在のところありません。なぜないかというと、設定を見ての通り外部のリソースの ID が必要になる場面がほぼないためです。
既存のサービスの設定を sailtrim init
コマンドでコード化できるのは、兄弟プロダクトと共通した特徴です。
2020年11月に開発をはじめたばかりで、まだ機能が十分に揃っているわけではありませんが、今後も開発を続けていく予定です。
ecspresso と共通する特徴と思想
ecspresso, lambroll, sailtrim には共通した次のような特徴があります。
- 既存の AWS 上の設定を
init
コマンドでコード化できます - AWS SDK の薄い wrapper として実装されています
- 設定ファイルに環境変数や Terraform tfstate の内容を展開できるテンプレート記法があります
- Go で実装されたシングルバイナリのコマンドです
最初に AWS コンソールなどで作成したサービスを後からコード管理できるようにする。頻繁に更新されるアプリケーションをデプロイするツールとそれ以外のミドルウェアやマネージドサービスの管理を分ける。AWS のサービスに特化したツールとして AWS SDK をそのまま使うことで、新機能への追従を容易に可能にする。という思想で実装されています。
24日間に渡って更新してきた ecspresso アドベントカレンダーもいよいよ最終日です。明日はお知らせがあります!
Discussion