INTEGRITY Dokumentace

Proměnné prostředí a Secrets

Proměnné prostředí lze do Container předat pomocí envVars pole v Container třída, nebo ručním nastavením při spuštění Containeru.

Do kontejneru lze předat tajné údaje pomocí Worker Secrets nebo Secret Store, a poté je předat do Container jako proměnné prostředí.

Hodnoty KV lze do Containeru předat pomocí Workers KV, a následně načíst hodnoty a předat je do Container jako proměnné prostředí.

Tyto příklady ukazují různé způsoby předávání tajných hodnot, hodnot KV a proměnných prostředí. V každém z nich předáváme:

V praxi obvykle postačí použít jen jednu z metod pro ukládání tajných klíčů a dat, ale pro úplnost si ukážeme všechny metody.

Vytváření tajných údajů a dat KV

Nejprve vytvoříme "WORKER_SECRET" tajný údaj v části Worker Secrets:

npx wrangler secret put WORKER_SECRET

Poté v Secret Store vytvořte úložiště s názvem "demo" a přidejte do něj "SECRET_STORE_SECRET" tajný údaj k němu:

npx wrangler secrets-store store create demo --remote
npx wrangler secrets-store secret create demo --name SECRET_STORE_SECRET --scopes workers --remote

Dále vytvoříme KV namespace s názvem DEMO_KV a přidejte pár klíč-hodnota:

npx wrangler kv namespace create DEMO_KV
npx wrangler kv key put --binding DEMO_KV KV_VALUE 'Hello from KV!'

Podrobný postup vytváření secrets najdete v dokumentace Workers Secrets a Dokumentace Secret Store. Nastavení KV najdete v dokumentace Workers KV.

Přidání bindings

Dále musíme přidat vazby pro přístup k našim tajným hodnotám, hodnotám KV a proměnným prostředí v konfiguraci Wrangler.

{
	"name": "my-container-worker",
	"vars": {
		"ENV_VAR": "my-env-var"
	},
	"secrets_store_secrets": [
		{
			"binding": "SECRET_STORE",
			"store_id": "demo",
			"secret_name": "SECRET_STORE_SECRET"
		}
	],
	"kv_namespaces": [
		{
			"binding": "DEMO_KV",
			"id": "<your-kv-namespace-id>"
		}
	]
	// rest of the configuration...
}
name = "my-container-worker"

[vars]
ENV_VAR = "my-env-var"

[[secrets_store_secrets]]
binding = "SECRET_STORE"
store_id = "demo"
secret_name = "SECRET_STORE_SECRET"

[[kv_namespaces]]
binding = "DEMO_KV"
id = "<your-kv-namespace-id>"

Upozorňujeme, že "WORKER_SECRET" nemusí být zadán v konfiguračním souboru Wrangler, protože se automaticky přidává do env.

Také si všimněte, že jsme nekonfigurovali nic konkrétního pro proměnné prostředí, tajné údaje ani hodnoty KV v související s kontejnery částí konfiguračního souboru Wrangler.

Použití envVars na třídě Container

Nyní předáme proměnné prostředí a tajné hodnoty do našeho kontejneru pomocí envVars v Container třída:

// https://developers.cloudflare.com/workers/runtime-apis/bindings/#importing-env-as-a-global
import { env } from "cloudflare:workers";
export class MyContainer extends Container {
	defaultPort = 8080;
	sleepAfter = "10s";
	envVars = {
		WORKER_SECRET: env.WORKER_SECRET,
		ENV_VAR: env.ENV_VAR,
		// we can't set the secret store binding or KV values as defaults here, as getting their values is asynchronous
	};
}

Každá instance tohoto Container bude mít nyní tyto proměnné a tajné údaje nastavené jako proměnné prostředí při spuštění.

Nastavení proměnných prostředí pro jednotlivé instance

Co ale když chcete nastavit proměnné prostředí pro každou instanci zvlášť?

V tomto případě použijte startAndWaitForPorts() metodu, kterou pro každou instanci předáte proměnné prostředí.

export class MyContainer extends Container {
	defaultPort = 8080;
	sleepAfter = "10s";
}

export default {
	async fetch(request, env) {
		if (new URL(request.url).pathname === "/launch-instances") {
			let instanceOne = env.MY_CONTAINER.getByName("foo");
			let instanceTwo = env.MY_CONTAINER.getByName("bar");

			// Each instance gets a different set of environment variables

			await instanceOne.startAndWaitForPorts({
				startOptions: {
					envVars: {
						ENV_VAR: env.ENV_VAR + "foo",
						WORKER_SECRET: env.WORKER_SECRET,
						SECRET_STORE_SECRET: await env.SECRET_STORE.get(),
						KV_VALUE: await env.DEMO_KV.get("KV_VALUE"),
					},
				},
			});

			await instanceTwo.startAndWaitForPorts({
				startOptions: {
					envVars: {
						ENV_VAR: env.ENV_VAR + "bar",
						WORKER_SECRET: env.WORKER_SECRET,
						SECRET_STORE_SECRET: await env.SECRET_STORE.get(),
						KV_VALUE: await env.DEMO_KV.get("KV_VALUE"),
						// You can also read different KV keys for different instances
						INSTANCE_CONFIG: await env.DEMO_KV.get("instance-bar-config"),
					},
				},
			});
			return new Response("Container instances launched");
		}

		// ... etc ...
	},
};

Čtení hodnot KV v kontejnerech

Hodnoty KV jsou užitečné zejména pro konfigurační data, která se mění jen zřídka, ale musí být dostupná vašim kontejnerům. Protože operace KV jsou asynchronní, musíte hodnoty načítat za běhu při spouštění kontejnerů.

Zde jsou běžné vzory používání KV s kontejnery:

Konfigurační data

export default {
	async fetch(request, env) {
		if (new URL(request.url).pathname === "/configure-container") {
			// Read configuration from KV
			const config = await env.DEMO_KV.get("container-config", "json");
			const apiUrl = await env.DEMO_KV.get("api-endpoint");

			let container = env.MY_CONTAINER.getByName("configured");

			await container.startAndWaitForPorts({
				startOptions: {
					envVars: {
						CONFIG_JSON: JSON.stringify(config),
						API_ENDPOINT: apiUrl,
						DEPLOYMENT_ENV: await env.DEMO_KV.get("deployment-env"),
					},
				},
			});

			return new Response("Container configured and launched");
		}
	},
};

Feature flags

export default {
	async fetch(request, env) {
		if (new URL(request.url).pathname === "/launch-with-features") {
			// Read feature flags from KV
			const featureFlags = {
				ENABLE_FEATURE_A: await env.DEMO_KV.get("feature-a-enabled"),
				ENABLE_FEATURE_B: await env.DEMO_KV.get("feature-b-enabled"),
				DEBUG_MODE: await env.DEMO_KV.get("debug-enabled"),
			};

			let container = env.MY_CONTAINER.getByName("features");

			await container.startAndWaitForPorts({
				startOptions: {
					envVars: {
						...featureFlags,
						CONTAINER_VERSION: "1.2.3",
					},
				},
			});

			return new Response("Container launched with feature flags");
		}
	},
};

Proměnné prostředí v době sestavení

Nakonec můžete nastavit i proměnné prostředí pro dobu sestavení, které jsou dostupné pouze při sestavování obrazu kontejneru, a to pomocí image_vars pole v konfiguraci Wrangler.