INTEGRITY Документация

Переменные окружения и секреты

Переменные окружения можно передать в Container с помощью envVars поле в Container класс, либо задав вручную при запуске Container.

Передать секреты в Container можно с помощью Worker Secrets или Secret Store, а затем передавая их в Container в виде переменных окружения.

Значения KV можно передать в Container с помощью Workers KV, затем считывая значения и передавая их в Container в виде переменных окружения.

В этих примерах показаны различные способы передачи секретов, значений KV и переменных окружения. В каждом из них мы передаём:

На практике вы, скорее всего, будете использовать только один из способов хранения секретов и данных, но мы приводим все способы для полноты картины.

Создание secrets и данных KV

Сначала создадим "WORKER_SECRET" секрет в разделе Worker Secrets:

npx wrangler secret put WORKER_SECRET

Затем создадим в Secret Store хранилище с именем "demo" и добавим в него "SECRET_STORE_SECRET" секрет к нему:

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

Далее создадим пространство имён KV с названием DEMO_KV и добавьте пару ключ-значение:

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

Полные сведения о создании секретов см. в документация Workers Secrets и документация Secret Store. О настройке KV см. документация Workers KV.

Добавление привязок

Далее нужно добавить привязки для доступа к секретам, значениям KV и переменным окружения в конфигурации 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>"

Обратите внимание, что "WORKER_SECRET" не нужно указывать в конфигурационном файле Wrangler, так как оно автоматически добавляется в env.

Также обратите внимание, что мы не настраивали ничего специального для переменных окружения, секретов или значений KV в связанные с контейнерами часть файла конфигурации Wrangler.

Использование envVars в классе Container

Теперь передадим переменные окружения и секреты в наш контейнер с помощью envVars поле в Container класс:

// 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
	};
}

Каждый экземпляр этого Container теперь при запуске будет получать эти переменные и секреты в виде переменных окружения.

Настройка переменных среды для каждого экземпляра

А что, если нужно задавать переменные окружения отдельно для каждого экземпляра?

В этом случае используйте startAndWaitForPorts() метод для передачи переменных окружения для каждого экземпляра.

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 ...
	},
};

Чтение значений KV в контейнерах

Значения KV особенно полезны для данных конфигурации, которые меняются редко, но должны быть доступны контейнерам. Поскольку операции KV асинхронны, значения нужно считывать во время выполнения при запуске контейнеров.

Ниже приведены типичные шаблоны использования KV с контейнерами:

Данные конфигурации

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");
		}
	},
};

Флаги функций

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");
		}
	},
};

Переменные окружения времени сборки

Наконец, можно задать переменные окружения времени сборки, которые доступны только при сборке образа контейнера, с помощью image_vars поле в конфигурации Wrangler.