ecspresso advent calendar 2020 day 24 - lambroll, sailtrim

公開:2020/12/23
更新:2021/01/06
4 min読了の目安(約3700字TECH技術記事

Amazon ECS のデプロイツールである ecspresso の利用法をまとめていく ecspresso Advent calendar 24日目です。

ecspresso の兄弟プロダクト

ecspresso には、思想を一にした兄弟というべきデプロイツールがあります。AWS Lambda のデプロイツール lambroll と、Lightsail Container のデプロイツール sailtrim です。

ここでは、この2プロダクトを紹介します。

lambroll

https://github.com/fujiwara/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年にプロジェクトが停止してしまいました。代替として SAMServerless を試してはみたものの、フルスタック過ぎて Apex の代替にはなりづらく、それならば自分で書くしかない、と開発して2019年11月にリリースしたのが lambroll です。

使い勝手は ecspresso とほぼ同じになるように作ってあるため、ecspresso に慣れた人なら違和感なく扱えるかと思います。

内部で使用している構造体を SDK のものをそのままにするというのも ecspresso と同様です。そのため、2020年の re:Invent で発表された Lambda のコンテナイメージサポートに対しても、発表後1日以内に最小限のコード追加で対応できました。

https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-container-image-support/

https://github.com/fujiwara/lambroll/releases/tag/v0.10.0

sailtrim

https://github.com/fujiwara/sailtrim

2020年11月に発表された Lightsail Container のデプロイツールです。「セイルトリム」と読みます。

Lightsail Container は、簡単にロードバランサー込みでコンテナを使ったアプリケーションを公開できるサービスです。

https://aws.amazon.com/jp/blogs/news/lightsail-containers-an-easy-way-to-run-your-containers-in-the-cloud/

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 アドベントカレンダーもいよいよ最終日です。明日はお知らせがあります!

https://sfujiwara.hatenablog.com/entry/ecspresso-handbook