HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

AWSがついに独自のAWSエミュレーターを開発

AWS Finally Built Its Own AWS Emulator (github.com)

625 pointsby super_linear208 コメント

要約

AWSは、開発者がAWSアカウントやコストなしでローカル環境でアプリケーションをテストできる、独自のAWS APIエミュレーターをオープンソースで公開しました。このエミュレーターはサーバーモードと組み込みモードをサポートし、開発やCI/CDパイプラインを容易にしますが、本番環境やセキュリティテストには適していません。

全文翻訳

AWS Emulator README

AWS Emulatorは、AWS APIのローカルエミュレーターです。これにより、AWSに接続することなく、自分のマシン、開発サーバー、または継続的インテグレーション(CI)でソフトウェアをテストできます。AWSアカウントは不要です。リクエストはAWSではなくエミュレーターに送信されるため、AWSリソースではなくエミュレートされたリソースを扱います。AWS Emulatorには追加のサービス料金はかかりません。AWSにデプロイした場合にのみ、AWSリソースに対して料金が発生します。

このエミュレーターは、AWS APIエンドポイントを提供するローカルプログラムです。グラフィカルインターフェイスはありません。エミュレーターを起動した後、環境変数を設定して、AWS CLIまたはAWS SDKをそのエンドポイントに向けます。その後、通常通りコードを実行します。組み込みモードでは、エミュレーターのHTTPクライアントをSDKに渡します。

AWS Emulatorはビルドとテスト用です。本番ワークロードやセキュリティテストには使用しないでください。詳細はAWS Emulatorのセキュリティを参照してください。

ドキュメント: AWS Emulatorユーザーガイド

クイックスタート

AIコーディングエージェントとの連携

aws-emulator スキルをインストールし、エージェントにエミュレーターの設定を依頼してください。これにはAWS CLIバージョン2.35.0以降が必要です。AIコーディングエージェントの開始方法を参照してください。

aws agent-toolkit add-skill --skill-name aws-emulator --region us-east-1
サーバーモード(CLIおよび任意のSDK)
  • Linux: RPMまたはDebianパッケージをインストールし、aws-emulator を実行します。Linuxでの開始方法を参照してください。
  • Windows / macOS: Dockerfileからビルドされたコンテナでエミュレーターを実行します。Dockerでの開始方法を参照してください。

環境変数を設定して、実行中のエミュレーターにSDKを向けます。AWS SDKをAWS Emulatorに向ける方法を参照してください。

組み込みモード(Rustテスト)

エミュレーターを開発依存関係として追加し、テストごとに分離されたインスタンスとしてインプロセスで実行します。エンドポイントURL、証明書、環境変数の設定は不要です。テストはエミュレーターのHTTPクライアントを直接SDKクライアントに配線します。組み込みモードの開始方法および、ビルドコストについては以下のソースからのビルドを参照してください。

既知の問題

各サービスがAWSにどれだけ近いかを確認するには、リリースページでリリースごとに公開されている忠実度スコアを確認してください。自身のプロジェクトが動作するかどうかを確認するには、AWS Emulatorでプロジェクトが動作するか確認するを参照してください。

個々のギャップは、リポジトリの issues/ ディレクトリで追跡されています。まだ動作しないAPIや動作は issues/things-that-do-not-work/ の下にあり、既に修正されたものは issues/things-that-now-work/ に移動します。

ソースからのビルド

エミュレーターを変更している場合、チェックアウトから実行している場合、または組み込みモードを使用している場合は、これが必要です。組み込みモードはエミュレーターをテストバイナリにコンパイルするため、以下の前提条件とビルドコストのガイダンスも適用されます。ほとんどの他のユーザーは、代わりにビルド済みのパッケージをインストールします(クイックスタートを参照)。ソースからのビルドは、Linux (x86_64およびaarch64) でサポートされています。WindowsおよびmacOSでは、上記のDockerパスを使用してください。

前提条件
  • Cargo を含む Rust ツールチェーン(rustup 経由でインストール)
  • GCCまたはclangなどのCコンパイラ。一部の依存関係はCコードをビルドします。
  • target/ 用に少なくとも100 GBの空きディスク容量。ワークスペースはサービスごとに1つのクレートを持つため、デバッグビルド全体は大きくなり、サービスが追加されるにつれて増加します。
  • マルチコアマシン。コールドフルビルドはすべてのサービスクレートをコンパイルするため、最初のビルドには時間がかかります。コア数が少ないほど、比例して時間がかかります。その後、1つのサービスへの変更後に再ビルドするのははるかに高速です。
ビルドと実行
cargo build -p aws-emulator-router
cargo run   -p aws-emulator-router

エミュレーターは 127.0.0.1:9297 でHTTPSをサービスします(自己署名証明書)。

組み込みモードのビルドコスト

組み込みモードはエミュレーターをテストバイナリにコンパイルするため、プロジェクトの最初の cargo test はエミュレーターのサービスクレートをコードと一緒にビルドします。上記のソースからのビルドと同様の順序で、最初のビルドと target/ の予算を確保し、その後は高速な増分ビルドを行います。推奨事項: プロジェクト間で1つの CARGO_TARGET_DIR を再利用し、CIで target/ をキャッシュ(またはsccacheを使用)し、エミュレーターをリリースコミットにピン留めして、変更ごとに再ビルドされないようにします。

リポジトリレイアウト

.
├── Cargo.toml              # workspace: サービスごとに1つのメンバー、およびコアクレート
├── services/
│   └── service-<name>/     # サービスごとに1つのクレート
│       ├── smithy-model/   # <name>.json — ワイヤープロトコルを駆動するSmithyモデル
│       ├── build.rs        # モデルからサービス宣言を生成
│       ├── src/
│       │   ├── service.rs  # リクエストルーティングと拒否オーバーライド
│       │   ├── state.rs    # このサービスのインメモリ状態
│       │   └── ops/        # 操作ごとに1つのファイル
│       └── tests/
├── core/
│   ├── router/             # エミュレーターバイナリ: すべてのサービスを1つのエンドポイントにマウント
│   └── embedded/           # インプロセス(組み込みモード)ファサード
├── vendor/                 # フレームワーククレート — 編集不可(更新時に置き換えられます)
└── issues/                 # トラッキングされている忠実度問題

テレメトリ

AWS Emulatorは、AWS Emulatorの使用状況に関する洞察を得るために、使用状況データの収集とAWSへの報告が設定されています。テレメトリはデフォルトでオンになっています。AWS Emulatorは、厳格なデータ最小化を念頭に置いてテレメトリデータを収集し、特定のユーザー、アカウント、または組織への識別や帰属を防ぎます。そのレコードには、リクエストやレスポンスの内容、コード、認証情報、個人データが含まれることは決してありません。テレメトリを第三者と共有することはありません。

収集される内容とデータの処理方法の詳細については、AWS Emulatorのテレメトリを参照してください。テレメトリをオフにするには、次のいずれかのオプションを使用します。

コマンドラインオプションの使用

エミュレーターを --telemetry オプション(短縮形 -t)を off に設定して起動します。この設定は、そのエミュレータープロセスにのみ適用されます。

aws-emulator --telemetry off

コンテナ内では、docker run コマンドのイメージ名の後に --telemetry off を追加します。

環境変数の使用

エミュレーターを起動する前に EMULATOR_TELEMETRY を off に設定します。この設定は、そのシェルから起動するすべてのアミュレーターに適用されます。

EMULATOR_TELEMETRY は、テレメトリをオンにするには on、true、または 1 を受け入れ、オフにするには off、false、または 0 を受け入れます。値は大文字小文字を区別しません。それ以外の値はテレメトリをオフにし、起動時の通知に警告が表示されます。

export EMULATOR_TELEMETRY=off
aws-emulator
設定ファイルの使用

マシン上のすべての実行に対してテレメトリをオフにするには、エミュレーター設定ファイル config.toml にこれらの行を追加します。ファイルはLinuxおよびmacOSでは ~/.aws/emulator/config.toml、Windowsでは %USERPROFILE%\.aws\emulator\config.toml です。別のファイルを使用するには、EMULATOR_CONFIG 環境変数にそのパスを設定します。

[telemetry]
enabled = false
組み込み設定APIの使用

組み込みモードでは、エミュレーターを作成する際に渡すオプションでテレメトリをオフにします。

use aws_emulator_embedded::{AwsEmulatorEmbedded, EmbeddedOptions, Telemetry};

fn main() {
    let emulator = AwsEmulatorEmbedded::new(EmbeddedOptions::default().telemetry(Telemetry::Off));
    let _http_client = emulator.http_client();
}

エミュレーターを含むツールをビルドする場合(例:他の人が実行するテストフレームワーク)、ユーザーにテレメトリについて伝え、オフにする方法を提供することができます。テレメトリをオフにしてツールを配布することも可能です。

問題の報告と貢献

バグや忠実度のギャップはGitHub Issuesに報告してください。最も役立つレポートは、サービス、操作、SDKとバージョン、送信したリクエスト、およびレスポンスが実際のAWSとどのように異なったかを明記するものです。このリポジトリではPRは受け付けていません。

ライセンス

このソフトウェアは、vendor/ ディレクトリ内のコード(Apache License 2.0の下)を除き、CC0 1.0 Universal (CC0-1.0) ライセンスの下でライセンスされています。詳細はLICENSEを参照してください。vendor/ ディレクトリ内のコードのライセンスについては、vendor/README.mdを参照してください。