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

Workers Binding API

Привязки VPC предоставляют API для доступа к приватным сервисам из вашего Worker. Оба Службы VPC и Сети VPC предоставляет fetch() метод для HTTP-трафика. VPC Networks также предоставляют connect() метод для необработанных TCP-соединений. Различие между типами привязок заключается в области действия маршрутизации, а не в наборе API.

Типы привязок

VPC Service

VPC Service binding направляет запросы к заранее зарегистрированному хосту и порту. Настройка VPC Service всегда определяет цель подключения, даже если другой URL или хост указан в fetch() вызов.

VPC Network

VPC Network binding предоставляет доступ к любому сервису, доступному через привязанный Cloudflare Tunnel или Cloudflare Mesh: в том числе к маршрутам по подсети и имени хоста, объявленным через Cloudflare Tunnel или Mesh, а также к назначениям, подключённым через точки входа Cloudflare WAN (GRE, IPsec или CNI). URL, передаваемый в fetch() или адрес, переданный в connect() определяет фактический адрес назначения: имя хоста или IP-адрес и порт.

fetch()

Выполняет HTTP-запрос к приватному сервису через привязанный Cloudflare Tunnel или Cloudflare Mesh. Доступно как для привязок VPC Service, так и для привязок VPC Network.

const response = await env.MY_BINDING.fetch(resource, options);

Параметры

Возвращаемое значение

Возвращает Promise<Response> который разрешается в стандартный объект Response из Fetch API ↗.

Примеры

Следующие примеры применимы как к привязкам VPC Service, так и к привязкам VPC Network.

Базовый GET-запрос

export default {
	async fetch(request, env) {
		const privateRequest = new Request(
			"http://internal-api.company.local/users",
		);
		const response = await env.MY_BINDING.fetch(privateRequest);
		const users = await response.json();

		return new Response(JSON.stringify(users), {
			headers: { "Content-Type": "application/json" },
		});
	},
};

POST-запрос с телом

export default {
	async fetch(request, env) {
		const privateRequest = new Request(
			"http://internal-api.company.local/users",
			{
				method: "POST",
				headers: {
					"Content-Type": "application/json",
					Authorization: `Bearer ${env.API_TOKEN}`,
				},
				body: JSON.stringify({
					name: "John Doe",
					email: "[email protected]",
				}),
			},
		);

		const response = await env.MY_BINDING.fetch(privateRequest);

		if (!response.ok) {
			return new Response("Failed to create user", { status: response.status });
		}

		const user = await response.json();
		return new Response(JSON.stringify(user), {
			headers: { "Content-Type": "application/json" },
		});
	},
};

Запрос с HTTPS и IP-адресом

export default {
	async fetch(request, env) {
		const privateRequest = new Request("https://10.0.1.50/api/data");
		const response = await env.MY_BINDING.fetch(privateRequest);

		return response;
	},
};

connect()

Открывает прямое TCP-соединение с частным адресом назначения через привязанный Cloudflare Tunnel или Cloudflare Mesh. Доступно только для привязок VPC Network.

const socket = await env.MY_BINDING.connect(address);

Параметры

Возвращаемое значение

Возвращает Promise<Socket> который разрешается в Socket с readable и writable потоков. Если connect() не может установить соединение, выбрасывается исключение.

Примеры

Подключение к приватному экземпляру Redis

export default {
	async fetch(request, env) {
		const socket = await env.MY_BINDING.connect("10.0.1.50:6379");

		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("PING\r\n"));
		await writer.close();

		return new Response(socket.readable);
	},
};

Подключение с помощью объекта SocketAddress

export default {
	async fetch(request, env) {
		const socket = await env.MY_BINDING.connect({
			hostname: "10.0.1.50",
			port: 6379,
		});

		const writer = socket.writable.getWriter();
		await writer.write(new TextEncoder().encode("PING\r\n"));
		await writer.close();

		return new Response(socket.readable);
	},
};

Необходимые роли

Чтобы привязать VPC Service или VPC Network в Worker, вашему пользователю необходимо Connectivity Directory Bind (или Connectivity Directory Admin). Прямая привязка к Cloudflare Tunnel через VPC Network binding требует Connectivity Directory Admin. Определения ролей см. в Роли.

Следующие шаги