envsubst というコマンドを知った。テキストファイルに環境変数を埋め込んでくれるツール。

置換前

// $ cat config.json
{
  "TargetCapacity": 1,
  "Type": "request",
  "TagSpecifications": [
    {
      "ResourceType": "spot-fleet-request",
      "Tags": [
        {
          "Key": "Name",
          "Value": "$EC2_INSTANCE_NAME"
        }
      ]
    }
  ],
  // ...
}

環境変数を設定し、テキストを envsubst に渡すと置換される。

// $ export EC2_INSTANCE_NAME=my-instance
// $ cat config.json | envsubst
{
  "TargetCapacity": 1,
  "Type": "request",
  "TagSpecifications": [
    {
      "ResourceType": "spot-fleet-request",
      "Tags": [
        {
          "Key": "Name",
          "Value": "my-instance"
        }
      ]
    }
  ],
  // ...
}

GNU gettext というパッケージに含まれており、割と多くのディストリで標準で使えるようだ。

以前は sed で置換するとか、 JSON ファイルなら jq でセットするなどしていたが、単純な処理ならこちらの方が簡単だ。