AWS Emulatorが送るテレメトリーの中身と止める方法

​​AWS Emulator​AWS CLI,strace,Ubuntu

AWS Emulator は、初期設定のまま起動すると、使われ方のデータ(テレメトリー)を AWS に送ります。送る前のデータを手元で開いてみると、中にあったのは呼び出した API の名前と回数、成否、OS や AWS CLI のバージョンなどで、バケット名やオブジェクトのキーは入っていませんでした。テレメトリーを切ると、エミュレーターのプロセスから外への接続は出なくなりました。ローカル環境での開発や CI のテストで、エミュレーターから外へ通信を出したくないときに、何が送られ、どう止めればよいかを、検証環境で実行したコマンドと出力のまま載せます。

補足

検証環境は Ubuntu 24.04(x86_64)、AWS Emulator 1.0.353(2026年11月14日リリース)、AWS CLI 2.40.3、strace 6.8 です。AWS のアカウントと認証情報は使っていません。外への接続は、エミュレーターのプロセスに strace を付けて見ました。検証環境では、外への HTTPS は環境変数 HTTPS_PROXY に設定したプロキシを通るので、エミュレーターが接続した先はプロキシで、そこから先の接続先はプロキシに送った CONNECT の行で確かめています。AWS の側でデータがどう保存され、どう使われるかは確かめておらず、公式ドキュメントの記述として書いています。Docker で動かす場合と、Rust のテストに組み込む場合は試していません。

入れ方は、別の記事「AWS EmulatorをUbuntuに入れて使い始める方法」で扱っています。ここでは、Linux 向けの手順のとおり Debian パッケージを入れ、署名を確かめてから apt-get install しました。

text
$ aws-emulator -v
Version: 1.0.353
Release date: 2026.11.14
Commit: ca8a89dedfa8e4b5e67a3c90dc736f921ba409a1

公式ドキュメントに書かれている、送るもの・送らないもの

テレメトリーのページによると、テレメトリーは初期設定でオンです。送る値は、どれもランダムな ID、数値、決まった選択肢の中の値で、自由に書かれた文章は送らないとされています。

送るものとして挙げられているのは、次のようなデータです。

  • インストールごと・起動ごとのランダムな ID
  • OS と CPU の種類、リクエストを送った SDK やツールとそのバージョン、使ったリージョン
  • エミュレーターを動かしている AI のコーディングアシスタントの種類(使っている場合)
  • エミュレーターのバージョン
  • API の操作ごとの呼び出し回数と結果、応答時間の最小・最大・合計
  • メモリー使用量の範囲などの性能と、クラッシュの種類

エラーは ValidationError のような種類だけを送り、メッセージの文章は送りません。

送らないものとしては、リクエストとレスポンスの中身、リソースの名前・ARN・キー・ファイルのパス、環境変数や設定ファイルの値、認証情報やコード、User-Agent の文字列そのもの、エラーメッセージ、アカウントIDや個人のデータが挙げられています。データは TLS で AWS の受け口に送られ、第三者とは共有せず、最長90日保管すると書かれています。IP アドレスは、受け口を乱用から守るためにネットワークの入り口でだけ使い、テレメトリーの記録には入れないとされています。

送るタイミングは、メモリーにためたものを5分おきに1回と、止めるときに1回です。送り先に届かないときは手元にためておいて、あとで送り直し、14日より古いものは捨てるとあります。

送る前のデータを手元で開いて見る

送る前のデータは ~/.aws/emulator/telemetry/ に置かれます。初期設定のまま起動して止めると、このフォルダーには次のファイルができていました。

text
$ ls ~/.aws/emulator/telemetry
installation-id
outbox.sqlite
server-config.json
server-config.lock

installation-id は、インストールごとのランダムな ID(UUID)が1行入ったファイルです。outbox.sqlite は、送る前のデータをためる SQLite のデータベースで、送れたあとは空になっていました。

中身を見るために、テレメトリーはオンのまま、送り先に届かないようにして起動しました。環境変数 HTTPS_PROXY を、何も待ち受けていない http://127.0.0.1:9 にしています。この状態で、S3 のバケット example-bucket を作り、secret-name.txt というキーで「にゃー」と書いたファイルを置き、ないキー no-such-key.txt を読もうとして NoSuchKey のエラーを出し、バケットの一覧を取ってから止めました。

止めたあと、outbox.sqlite の outbox テーブルに1行が残っていました。body 列には1行に1つの JSON が並んでいて、1つ目がその起動全体の情報です(読みやすいように整形しています)。

json
{
 "recordType": "batch",
 "schemaVersion": "1",
 "installationId": "5944fa99-faeb-4b1b-95d6-94b893cd3708",
 "sessionId": "ec4ed447-4630-4d66-998c-3d23cff7fe53",
 "projectId": "proj-a85d506b35244f71850223e92be29acb",
 "batchId": "8ca81f23-e965-4bca-af95-bbd858015937",
 "flushSequence": 1,
 "isFinal": true,
 "sentAt": "2026-11-14T02:59:35Z",
 "sessionDurationMs": 3704,
 "productVersion": "1.0.353",
 "firstRun": false,
 "environment": {
  "os": "linux",
  "arch": "x86_64",
  "sdkName": "aws-cli",
  "sdkVersion": "2.40.3",
  "region": "us-east-1",
  "runMode": "standalone",
  "installChannel": "binary",
  "isCi": false,
  "containerRuntime": "none",
  "featureFlags": {
   "persistence": false,
   "multiRegion": false,
   "authEmulation": false,
   "strictMode": false,
   "requestLogging": false,
   "fidelityGating": false
  }
 },
 "performance": {
  "memoryUsage": "256_to_512_mib",
  "throughput": 1,
  "peakConcurrency": 1,
  "coldStartTime": 113,
  "startupOutcome": "success"
 }
}

installationId は installation-id のファイルと同じ値で、sessionId は起動ごとの ID です。projectId は、公式ドキュメントによると、同じリリースを使う人はみな同じ値になる、ビルドごとの ID です。このデータは止めたときに作られたもので(sentAt が止めた時刻と同じ 02:59:35)、isFinal は true でした。公式ドキュメントの「AI のコーディングアシスタントの種類」に当たる項目は、この検証で見たデータにはありませんでした。

2つ目からは、API の操作ごとの記録です。4つの操作が1つずつ並び、エラーになった GetObject は次のようになっていました。

json
{
 "recordType": "metric",
 "type": "operation",
 "namespace": "s3",
 "operation": "GetObject",
 "count": 1,
 "outcome": "client_error",
 "errorType": "ResourceNotFound",
 "latency": {
  "min": 0,
  "max": 0,
  "sumMillis": 0
 }
}

エラーは ResourceNotFound という種類だけで、S3 が返したエラーの名前 NoSuchKey やメッセージは入っていません。outbox テーブルの body 列(下の出力では「本文」)に、使った名前や中身が含まれていないかも調べました。

text
本文に 'example-bucket' が含まれるか: False
本文に 'secret-name' が含まれるか: False
本文に 'no-such-key' が含まれるか: False
本文に 'にゃー' が含まれるか: False
本文に 'NoSuchKey' が含まれるか: False

バケット名、キー、ファイルの中身、エラーの名前は、どれも入っていませんでした。ホームディレクトリや作業ディレクトリのパスも入っていませんでした。

オンとオフで、外への接続を比べる

エミュレーターのプロセスに strace を付けて起動し、connect と sendto のシステムコールを記録しました。エミュレーター自身の待ち受け(127.0.0.1:9297)への接続と UNIX ソケットは数えていません。下の表の4つの起動と、あとで出てくる約6分動かした起動、バイト数を記録した起動では、AWS CLI で同じ4つの操作をしてから止めています。値の違いや、オンに戻せるかを確かめた起動では、起動して止めただけです。

初期設定のまま(オン)起動したときは、プロキシへの接続が1回あり、プロキシに、次の接続先への中継を頼んでいました(時刻は UTC、プロキシのポート番号は伏せています)。

text
02:59:25.093452 connect(16, {sa_family=AF_INET, sin_port=htons(<プロキシのポート>), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
02:59:25.094271 CONNECT aws-emulator-telemetry.us-west-2.api.aws:443

接続先は aws-emulator-telemetry.us-west-2.api.aws の 443 番です。この起動で作られた server-config.json には、送り先の URL と、送る間隔などの設定が入っていました(一部を抜き出しています)。

json
"ingestEndpoint": "https://aws-emulator-telemetry.us-west-2.api.aws/v1/events",
"flushIntervalSeconds": 300,
"configTtlSeconds": 3600

テレメトリーを切った起動では、記録した範囲で、外への接続は1回もありませんでした。切り方を変えて試した結果をまとめます。

起動のしかた 起動時の知らせ 外への接続
初期設定のまま enabled 1回(上の接続先)
aws-emulator -t off disabled 0回
EMULATOR_TELEMETRY=off disabled 0回
config.toml に enabled = false disabled 0回

「起動時の知らせ」は、起動したときに標準エラーに出る1行のメッセージです。初期設定のままだと、次のように出ました(ホームディレクトリのパスは ~ に置き換えています)。

text
This emulator collects usage and error telemetry: enabled (on by default; opt out any time); disable with EMULATOR_TELEMETRY=off or [telemetry] enabled = false in ~/.aws/emulator/config.toml

公式ドキュメントによると、エミュレーターはこの行を出す前には何も送りません。CI のログでテレメトリーがオンかオフかを確かめたいときは、この行を見れば分かります。

接続が出たタイミング

テレメトリーがオンの起動では、外への接続はどれも1回だけでしたが、タイミングは起動によって違いました。server-config.json がまだない最初の起動では、起動のログが出た直後に接続しています。そのあと、5分たたずに止めた起動では、止めたときに接続しました。止めたときの接続で読み書きしたバイト数を記録すると、次のとおりです。

text
03:07:10.535206 sendto 117
03:07:10.785969 recvfrom 39
03:07:10.786683 writev 282
03:07:10.936480 recvfrom 4096
03:07:10.936930 writev 6
03:07:10.937165 recvfrom 294
03:07:10.937479 writev 58
03:07:10.937851 writev 1687
03:07:11.129471 recvfrom 330

最初の117バイトがプロキシへの CONNECT の行です。そのあとの読み書きは TLS で暗号化されているので、中身は見ていません。止めたあとの outbox テーブルは0行で、送れずに残ったデータはありませんでした。

もう1つ、オンのまま約6分動かし続け、最初に4つの操作をしたあとは何もしないでおきました。03:00:22 に起動して、外への接続は 03:05:22 に1回ありました。公式ドキュメントの「5分おき」のとおりです。03:06:25 に止めたときには、新しい接続は出ませんでした。止めたあとの outbox テーブルは、このときも0行でした。

毎回オプションを付けずに止める

-t off(--telemetry off の短い形)は、その起動だけに効きます。毎回付けずに済む方法として、公式ドキュメントには環境変数と設定ファイルが挙げられています。

環境変数 EMULATOR_TELEMETRY は、そのシェルから起動するエミュレーターすべてに効きます。

bash
export EMULATOR_TELEMETRY=off
aws-emulator
text
This emulator collects usage and error telemetry: disabled (via EMULATOR_TELEMETRY=off) — to turn it back on, remove every opt-out setting and restart

公式ドキュメントによると、オフにする値は off、false、0 で、大文字・小文字は区別しません。FALSE でも、同じく disabled (via EMULATOR_TELEMETRY=off) と出てオフになりました。決まっていない値を入れたときもオフになり、警告が出ます。nope と入れると、次の2行が出ました。

text
This emulator collects usage and error telemetry: disabled (invalid EMULATOR_TELEMETRY value or ~/.aws/emulator/config.toml; failing safe to off) — to turn it back on, remove every opt-out setting and restart
warning: ignoring invalid EMULATOR_TELEMETRY value "nope" (expected on|true|1 or off|false|0); telemetry is off

そのマシンでのすべての起動に効かせるなら、設定ファイル ~/.aws/emulator/config.toml に次の2行を書きます。

toml
[telemetry]
enabled = false
text
This emulator collects usage and error telemetry: disabled (via ~/.aws/emulator/config.toml) — to turn it back on, remove every opt-out setting and restart

設定ファイルを別の場所に置きたいときは、環境変数 EMULATOR_CONFIG にそのパスを入れます。同じ2行を書いたファイルを指して起動すると、知らせの括弧の中にそのファイルのパスが出て、オフになりました(パスは /path/to/emulator.toml に置き換えています)。

text
This emulator collects usage and error telemetry: disabled (via /path/to/emulator.toml) — to turn it back on, remove every opt-out setting and restart

なお、-t off で起動したときの知らせは disabled (via the embedding configuration) でした。どの方法でも外への接続は0回だったことは、上の表のとおりです。

オフの設定は、オンの設定より強い

公式ドキュメントによると、どれか1つでもオフにしていれば、テレメトリーはオフになります。aws-emulator --help にも、-t on は環境変数や設定ファイルのオフを上書きできないと書かれています。EMULATOR_TELEMETRY=off を設定したシェルで aws-emulator -t on と起動すると、知らせは disabled (via EMULATOR_TELEMETRY=off) のままで、外への接続もありませんでした。

オンに戻すには、オフにしている設定をすべて外してから起動し直します。環境変数を unset し、config.toml を消して起動すると、知らせが enabled に戻り、外への接続がまた1回出ました。

ポイント

CI では EMULATOR_TELEMETRY=off をジョブの環境変数に入れ、手元のマシンでは ~/.aws/emulator/config.toml に enabled = false を書いておくと、起動のコマンドに -t off を付け忘れても送られません。

オフにすると、手元の ID とためたデータも消える

公式ドキュメントには、オフのときはインストールの ID とためたデータを消し、新しい ID も作らないと書かれています。送り先に届かずにデータが1行たまっている状態から -t off で起動して止めると、installation-id と outbox.sqlite がなくなっていました。

text
$ ls ~/.aws/emulator/telemetry
installation-id
outbox.sqlite
server-config.json
server-config.lock

このあと aws-emulator -t off で起動して止め、もう一度一覧を出しました。

text
$ ls ~/.aws/emulator/telemetry
server-config.json
server-config.lock

環境変数と設定ファイルで切ったときも、同じく2つのファイルが消えました。server-config.json は残りましたが、中身は送り先の URL や送る間隔などの設定と、取得した時刻だけです。テレメトリーをオンに戻して起動すると、installation-id はまた作られました。

​Posted by 86