← Cloudflare Workers VPC / workers-vpc
Workers Binding API
Привязки VPC предоставляют API для доступа к приватным сервисам из вашего Worker. Оба Службы VPC и Сети VPC предоставляет fetch() метод для HTTP-трафика. VPC Networks также предоставляют connect() метод для необработанных TCP-соединений. Различие между типами привязок заключается в области действия маршрутизации, а не в наборе API.
Типы привязок
VPC Service
VPC Service binding направляет запросы к заранее зарегистрированному хосту и порту. Настройка VPC Service всегда определяет цель подключения, даже если другой URL или хост указан в fetch() вызов.
- host указанный в
fetch()не управляет маршрутизацией. Он только заполняетHostзаголовок, а при использованииhttps, значение Server Name Indication (SNI). - порт указанный в
fetch()игнорируется: всегда используется порт, указанный в конфигурации VPC Service.
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);Параметры
resource(string | URL | Request): URL-адрес для запроса. Должен быть абсолютным URL-адресом, включающим протокол, хост и путь (например,http://internal-api/api/users).options(необязательный RequestInit): стандартные параметры fetch, включая:method: метод HTTP (GET, POST, PUT, DELETE и т. д.)headers: заголовки запросаbody: тело запросаsignal: AbortSignal для отмены запроса
Возвращаемое значение
Возвращает 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);Параметры
address(string | SocketAddress): адрес назначения для подключения. Передайте строку в формате"host:port"в формате (например,"10.0.1.50:6379") илиSocketAddressобъект сhostnameиport.
Возвращаемое значение
Возвращает 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. Определения ролей см. в Роли.
Следующие шаги
- Настройте Службы VPC
- Настройте Сети VPC
- См. примеры использования