Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

環境変数

最終更新 Markdown で表示Agent セットアップ

exec()createTerminal() は、それぞれ独立したプロセスを起動します。あるプロセスでシェルの export を実行しても、次の起動には反映されません。プロセスの環境は、コンテナイメージ、setEnvVars、起動ごとの env で設定します。

環境変数は シークレットではない 設定(パス、フィーチャーフラグ、NODE_ENV など)に使います。有効な API キーや長期間有効な認証情報をサンドボックスに入れないでください。認証情報が必要な外部サービスを呼ぶときは、送信トラフィックのハンドラー を使い、シークレットは Worker に残します。

プロセスが環境を受け取る仕組み

プロセス起動時、ランタイムは次の順で環境を組み立てます。

  1. コンテナ の環境(イメージの ENV とデフォルト)。
  2. setEnvVars で登録した名前(exec() を使う場合。次の節で説明します)。
  3. その起動に渡した env オプション(指定した場合)。

後の起動は、前の起動の上書きを引き継ぎません。あるプロセス内で export FOO=bar を実行しても、次の exec() には影響しません。

fetch ハンドラー内の Worker バインディングは、プロセスの環境変数ではありません。setEnvVars または起動時の env で渡した値だけがプロセス内に現れます(長期間有効なシークレットは渡さないでください)。

setEnvVars()

setEnvVars(envVars: Record<string, string | undefined>): Promise<void>
効果
string 以降の exec() 起動にこの環境変数を設定します
undefined 以前に保存した変数を削除します

exec() で、SDK は保存した名前を、そのプロセスの起動時環境にマージします。

保存した名前は、サンドボックスの Durable Object のメモリにあります。コンテナのファイルシステムには書き込まれず、バックアップにも含まれません。Durable Object が退避または置き換えられたあとに同じ名前が必要なら、もう一度 setEnvVars を呼ぶか、各 exec()env を渡します。

const sandbox = getSandbox(env.Sandbox, "user-123");

await sandbox.setEnvVars({
	NODE_ENV: "production",
	APP_HOME: "/workspace/app",
	LOG_LEVEL: "info",
});

const migrate = await sandbox.exec(["python", "migrate.py"], {
	cwd: "/workspace/app",
});
await migrate.output({ encoding: "utf8" });

const seed = await sandbox.exec(["python", "seed.py"], {
	cwd: "/workspace/app",
});
await seed.output({ encoding: "utf8" });

await sandbox.setEnvVars({
	LOG_LEVEL: "debug",
	TEMP_FLAG: undefined,
});
const sandbox = getSandbox(env.Sandbox, "user-123");

await sandbox.setEnvVars({
	NODE_ENV: "production",
	APP_HOME: "/workspace/app",
	LOG_LEVEL: "info",
});

const migrate = await sandbox.exec(["python", "migrate.py"], {
	cwd: "/workspace/app",
});
await migrate.output({ encoding: "utf8" });

const seed = await sandbox.exec(["python", "seed.py"], {
	cwd: "/workspace/app",
});
await seed.output({ encoding: "utf8" });

await sandbox.setEnvVars({
	LOG_LEVEL: "debug",
	TEMP_FLAG: undefined,
});

env on exec()

const process = await sandbox.exec(["node", "app.js"], {
	cwd: "/workspace/app",
	env: {
		NODE_ENV: "production",
		PORT: "3000",
	},
});
const process = await sandbox.exec(["node", "app.js"], {
	cwd: "/workspace/app",
	env: {
		NODE_ENV: "production",
		PORT: "3000",
	},
});
動作 詳細
スコープ この起動だけ
マージ順 コンテナ環境、次に setEnvVars、次にこの env
副作用 setEnvVars の保存内容は更新しません

サンドボックス全体の名前とコンテナ環境だけで足りる場合は、env を省略します。

env on createTerminal()

const terminal = await sandbox.createTerminal({
	command: ["bash"],
	cwd: "/workspace",
	env: {
		TERM: "xterm-256color",
		APP_HOME: "/workspace/app",
	},
});
const terminal = await sandbox.createTerminal({
	command: ["bash"],
	cwd: "/workspace",
	env: {
		TERM: "xterm-256color",
		APP_HOME: "/workspace/app",
	},
});

ターミナル起動時の env は、そのターミナルだけコンテナ環境に上書きします。ターミナルが必要とする名前は createTerminal に渡します。

対話シェル内の export は、そのターミナルの存続中だけ有効です。後続の exec() には適用されません。ターミナル を参照してください。

外部 API と認証情報

サンドボックス内のコードに、本番のプロバイダー認証情報を持たせないでください。シークレットは Worker に置き、outboundByHost(および enableInternet / allowedHosts などの関連ポリシー)で送信 HTTP(S) を傍受します。サンドボックスは通常のリクエスト、またはクライアントライブラリが求めるプレースホルダーを送れます。Worker が、リクエストがアカウントから出る前に本物の認証情報を付けます。

送信トラフィックを処理する を参照してください。認証情報の安全な注入も含みます。サンドボックスからホスト名で到達する Workers バインディング(KV、R2 など)は Workers バインディングに接続する を参照してください。

関連情報

役に立ちましたか?