Организация защищенного доступа к контенту в Yandex Cloud CDN
- Подготовьте облако к работе
- Создайте виртуальную машину с веб-сервером
- Создайте и настройте публичную зону DNS
- Добавьте TLS-сертификат в Yandex Certificate Manager
- Подготовьте бакет-источник для CDN-ресурса
- Создайте CDN-ресурс
- Создайте ресурсную запись CNAME для CDN-ресурса
- Опубликуйте сайт на веб-сервере
- Проверьте работу защищенного доступа к файлам
- Как удалить созданные ресурсы
В этом руководстве вы создадите веб-сайт, который будет генерировать подписанные ссылки с защищенным токеном на CDN-ресурс Cloud CDN. Доступ к контенту по такой ссылке будет разрешен только в течение пяти минут с момента получения ссылки и только тому пользователю, для которого ссылка была сгенерирована.
Веб-сайт будет развернут на виртуальной машине, созданной из публичного образа LAMP с предустановленным веб-сервером Apache HTTP Server
Чтобы настроить защищенный доступ к контенту в Cloud CDN:
- Подготовьте облако к работе.
- Создайте виртуальную машину с веб-сервером.
- Создайте и настройте публичную зону DNS.
- Добавьте TLS-сертификат в Yandex Certificate Manager.
- Подготовьте бакет-источник для CDN-ресурса.
- Создайте CDN-ресурс.
- Создайте ресурсную запись CNAME для CDN-ресурса.
- Опубликуйте сайт на веб-сервере.
- Проверьте работу защищенного доступа к файлам.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки создаваемого решения входят:
- плата за использование публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за вычислительные ресурсы и диски ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование публичной DNS-зоны и публичные DNS-запросы (см. тарифы Yandex Cloud DNS);
- плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage);
- плата за исходящий трафик с CDN-серверов (см. тарифы Cloud CDN).
Создайте облачную сеть и подсеть
- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Virtual Private Cloud.
- Справа сверху нажмите Создать сеть.
- В поле Имя укажите
webserver-network
. - В поле Дополнительно отключите опцию Создать подсети.
- Нажмите Создать сеть.
- На панели слева выберите
Подсети. - Справа сверху нажмите Создать подсеть.
- В поле Имя укажите
webserver-subnet-ru-central1-b
. - В поле Зона выберите зону доступности
ru-central1-b
. - В поле Сеть выберите облачную сеть
webserver-network
. - В поле CIDR укажите
192.168.1.0/24
. - Нажмите Создать подсеть.
-
Создайте сеть
webserver-network
:yc vpc network create webserver-network
Результат:
id: enp1gg8kr3pv******** folder_id: b1gt6g8ht345******** created_at: "2023-12-20T20:08:11Z" name: webserver-network default_security_group_id: enppne4l2eg5********
Подробнее о команде
yc vpc network create
читайте в справочнике CLI. -
Создайте подсеть в зоне доступности
ru-central1-b
:yc vpc subnet create webserver-subnet-ru-central1-b \ --zone ru-central1-b \ --network-name webserver-network \ --range 192.168.1.0/24
Результат:
id: e2li9tcgi7ii******** folder_id: b1gt6g8ht345******** created_at: "2023-12-20T20:11:16Z" name: webserver-subnet-ru-central1-b network_id: enp1gg8kr3pv******** zone_id: ru-central1-b v4_cidr_blocks: - 192.168.1.0/24
Подробнее о команде
yc vpc subnet create
читайте в справочнике CLI.
-
Чтобы создать сеть, воспользуйтесь методом REST API create для ресурса Network или вызовом gRPC API NetworkService/Create.
-
Чтобы создать подсеть, воспользуйтесь методом REST API create для ресурса Subnet или вызовом gRPC API SubnetService/Create.
Создайте группу безопасности
Создайте группу безопасности, разрешающую входящий TCP-трафик для портов 22
, 80
и 443
, а также любой исходящий трафик.
-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
В списке сервисов выберите Virtual Private Cloud.
-
На панели слева выберите
Группы безопасности. -
Нажмите Создать группу безопасности.
-
В поле Имя укажите имя
webserver-sg
. -
В поле Сеть выберите созданную ранее сеть
webserver-network
. -
В блоке Правила создайте следующие правила для управления трафиком:
Направление
трафикаОписание Диапазон портов Протокол Источник /
НазначениеCIDR блоки Входящий http
80
TCP
CIDR
0.0.0.0/0
Входящий https
443
TCP
CIDR
0.0.0.0/0
Входящий ssh
22
TCP
CIDR
0.0.0.0/0
Исходящий any
Весь
Любой
CIDR
0.0.0.0/0
-
Нажмите Сохранить.
Выполните команду:
yc vpc security-group create \
--name webserver-sg \
--rule "description=http,direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=https,direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=ssh,direction=ingress,port=22,protocol=tcp,v4-cidrs=[0.0.0.0/0]" \
--rule "description=any,direction=egress,port=any,protocol=any,v4-cidrs=[0.0.0.0/0]" \
--network-name webserver-network
Результат:
id: enp4htsnl1sa********
folder_id: b1gt6g8ht345********
created_at: "2023-12-23T19:07:03Z"
name: webserver-sg
network_id: enp37qpnksl2********
status: ACTIVE
rules:
- id: enpdu0t8san9********
description: http
direction: INGRESS
ports:
from_port: "80"
to_port: "80"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpr7oirpff5********
description: https
direction: INGRESS
ports:
from_port: "443"
to_port: "443"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enp0bgk6dkdd********
description: ssh
direction: INGRESS
ports:
from_port: "22"
to_port: "22"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpspns0tfml********
description: any
direction: EGRESS
protocol_name: ANY
protocol_number: "-1"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
Подробнее о команде yc vpc security-group create
читайте в справочнике CLI.
Сохраните полученный идентификатор (id
) группы безопасности — он понадобится при создании виртуальной машины.
Чтобы создать группу безопасности, воспользуйтесь методом REST API create для ресурса SecurityGroup или вызовом gRPC API SecurityGroupService/Create.
Подготовьте файлы для загрузки в бакет
-
Сохраните любое изображение в формате JPEG в файл
content.jpg
. -
Создайте файл
index.html
:<html> <body> </body> </html>
Создайте виртуальную машину с веб-сервером
Перед тем как приступать к созданию виртуальной машины, подготовьте пару ключей (открытый и закрытый) для доступа к ВМ по SSH.
-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите Создать виртуальную машину.
-
В блоке Общая информация:
- В поле Имя укажите имя
mywebserver
. - В поле Зона доступности выберите
ru-central1-b
.
- В поле Имя укажите имя
-
В блоке Образ загрузочного диска перейдите на вкладку Marketplace и нажмите Показать все продукты Marketplace.
-
В открывшемся окне найдите и выберите продукт LAMP.
-
В блоке Сетевые настройки:
- В поле Подсеть выберите созданную ранее подсеть
webserver-subnet-ru-central1-b
. - В поле Публичный адрес выберите
Автоматически
. - В поле Группы безопасности выберите созданную ранее группу безопасности
webserver-sg
.
- В поле Подсеть выберите созданную ранее подсеть
-
В блоке Доступ укажите данные для доступа к ВМ:
- В поле Логин укажите имя пользователя
yc-user
. - В поле SSH-ключ вставьте содержимое созданного ранее публичного ключа.
- В поле Логин укажите имя пользователя
-
Нажмите Создать ВМ.
Выполните команду:
yc compute instance create \
--name mywebserver \
--zone ru-central1-b \
--network-interface subnet-name=webserver-subnet-ru-central1-b,nat-ip-version=ipv4,security-group-ids=<идентификатор_группы_безопасности> \
--create-boot-disk image-folder-id=standard-images,image-id=fd8jtn9i7e9ha5q25niu \
--ssh-key ~/.ssh/id_ed25519.pub
Где:
<идентификатор_группы_безопасности>
— сохраненный ранее идентификатор группы безопасности.--ssh-key
— путь к файлу с открытым SSH-ключом. Например:~/.ssh/id_ed25519.pub
.
Результат:
done (32s)
id: fhmaq4shfrcm********
folder_id: b1gt6g8ht345********
created_at: "2023-12-23T05:36:34Z"
name: mywebserver
zone_id: ru-central1-b
platform_id: standard-v2
resources:
memory: "2147483648"
cores: "2"
core_fraction: "100"
status: RUNNING
metadata_options:
gce_http_endpoint: ENABLED
aws_v1_http_endpoint: ENABLED
gce_http_token: ENABLED
aws_v1_http_token: DISABLED
boot_disk:
mode: READ_WRITE
device_name: fhmprher1d0q********
auto_delete: true
disk_id: fhmprher1d0q********
network_interfaces:
- index: "0"
mac_address: d0:0d:ad:13:91:7e
subnet_id: e9bk1m87r4m4********
primary_v4_address:
address: 192.168.1.11
one_to_one_nat:
address: 158.160.***.***
ip_version: IPV4
security_group_ids:
- enpa5j0mrgm4********
gpu_settings: {}
fqdn: fhmaq4shfrcm********.auto.internal
scheduling_policy: {}
network_settings:
type: STANDARD
placement_policy: {}
Подробнее о команде yc compute instance create
читайте в справочнике CLI.
Чтобы создать виртуальную машину, воспользуйтесь методом REST API create для ресурса Instance или вызовом gRPC API InstanceService/Create.
В вашем каталоге будет создана виртуальная машина mywebserver
. Чтобы подключиться к ней по SSH, используйте логин yc-user
и публичный IP-адрес этой ВМ. Если вы планируете пользоваться созданным веб-сервером длительное время, сделайте публичный IP-адрес этой ВМ статическим.
Создайте и настройте публичную зону DNS
-
Создайте публичную зону DNS в Yandex Cloud DNS.
Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud DNS.
-
Нажмите Создать зону.
-
Задайте настройки зоны, соответствующие вашему домену:
- Зона — доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоны
example.com.
соответствует доменуexample.com
. Чтобы создать доменную зону с нелатинскими символами, используйте кодировку Punycode . - Тип —
Публичная
. - Имя —
my-domain-zone
.
- Зона — доменная зона. Название зоны должно заканчиваться точкой. Например, название доменной зоны
-
Нажмите Создать.
Выполните команду:
yc dns zone create \ --name my-domain-zone \ --zone <имя_домена> \ --public-visibility
Где
--zone
— имя вашего домена, напримерexample.com.
. Значение параметра--zone
должно заканчиваться точкой. Например, название доменной зоныexample.com.
соответствует доменуexample.com
.Результат:
id: dns39gihj0ef******** folder_id: b1gt6g8ht345******** created_at: "2023-12-21T16:43:37.883Z" name: my-domain-zone zone: example.com. public_visibility: {}
Подробнее о команде
yc dns zone create
читайте в справочнике CLI.Чтобы создать публичную зону DNS, воспользуйтесь методом REST API create для ресурса DnsZone или вызовом gRPC API DnsZoneService/Create.
-
-
Делегируйте ваш домен сервису Cloud DNS. Для этого в личном кабинете вашего регистратора домена укажите в настройках домена адреса DNS-серверов
ns1.yandexcloud.net
иns2.yandexcloud.net
. -
Создайте в вашей зоне DNS ресурсную A-запись, указывающую на публичный IP-адрес созданной ранее ВМ с веб-сервером:
Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud DNS.
-
Выберите созданную ранее DNS-зону.
-
Нажмите Создать запись.
-
Задайте параметры записи:
-
В поле Имя выберите
Совпадает с именем зоны (@)
. -
В поле Тип выберите тип записи
A
. -
В поле Значение укажите публичный IP-адрес созданной ранее ВМ с веб-сервером.
Узнать IP-адрес виртуальной машины можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get mywebserver
.
-
-
Нажмите Создать.
Выполните команду:
yc dns zone add-records \ --name my-domain-zone \ --record "@ 600 A <IP-адрес_ВМ>"
Где
<IP-адрес_ВМ>
— публичный IP-адрес созданной ранее ВМ с веб-сервером.Узнать IP-адрес виртуальной машины можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get mywebserver
.Результат:
+--------+--------------+------+---------------+-----+ | ACTION | NAME | TYPE | DATA | TTL | +--------+--------------+------+---------------+-----+ | + | example.com. | A | 51.250.**.*** | 600 | +--------+--------------+------+---------------+-----+
Подробнее о команде
yc dns zone add-records
читайте в справочнике CLI.Чтобы создать ресурсную запись в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
-
Добавьте TLS-сертификат в Yandex Certificate Manager
-
Добавьте в сервис Certificate Manager сертификат от Let's Encrypt® для ваших доменов, которые будут использоваться веб-сервером и CDN-ресурсом.
Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
В списке сервисов выберите Certificate Manager.
-
Нажмите Добавить сертификат и выберите Сертификат от Let's Encrypt.
-
В открывшемся окне в поле Имя укажите
mymanagedcert
. -
В поле Домены укажите имя вашего домена, например
example.com
.В этом же поле укажите с новой строки имя поддомена, который будет использоваться для CDN-ресурса, например
cdn.example.com
. -
Выберите тип проверки прав на домен
DNS
. -
Нажмите Создать.
Выполните команду:
yc certificate-manager certificate request \ --name mymanagedcert \ --challenge dns \ --domains <имя_домена>,<имя_поддомена>
Где:
<имя_домена>
— имя вашего домена для веб-сервера. Например:example.com
.<имя_поддомена>
— имя поддомена, который будет использоваться CDN-ресурсом. Например:cdn.example.com
.
Результат:
id: fpqbs12t6ion******** folder_id: b1gt6g8ht345******** created_at: "2023-12-24T14:36:39.299844798Z" name: mymanagedcert type: MANAGED domains: - example.com - cdn.example.com status: VALIDATING updated_at: "2023-12-24T14:36:39.299844798Z"
Подробнее о команде
yc certificate-manager certificate request
читайте в справочнике CLI.Сохраните идентификатор (
id
) созданного сертификата: он пригодится при создании CDN-ресурса.Чтобы добавить сертификат, воспользуйтесь методом REST API requestNew для ресурса Certificate или вызовом gRPC API CertificateService/RequestNew.
В списке сертификатов появится новый сертификат со статусом
Validating
. Этот статус означает, что запрос на выпуск сертификата от Let's Encrypt® создан, и для его успешной обработки вам необходимо пройти процедуру проверки прав на домены. -
-
Для успешного выпуска сертификата пройдите проверку прав на домены:
Консоль управленияYandex Cloud CLIAPI- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Certificate Manager.
- В списке сертификатов выберите
mymanagedcert
. - В открывшемся окне в блоке Проверка прав на домены выберите
CNAME-запись
. - В секции первого домена ниже нажмите Создать запись и в открывшемся окне нажмите Создать.
- Повторите предыдущее действие для второго домена.
Проверка прав на домены может занять от нескольких минут до нескольких дней — дождитесь ее успешного завершения. В результате сертификат будет выпущен и перейдет в статус
Issued
.-
Получите значения ресурсных записей, необходимых для прохождения проверки:
yc certificate-manager certificate get \ --name mymanagedcert \ --full
Результат:
id: fpq2gpi42teg******** folder_id: b1gt6g8ht345******** created_at: "2023-12-24T18:13:45.960Z" name: mymanagedcert type: MANAGED domains: - example.com - cdn.example.com status: VALIDATING updated_at: "2023-12-24T18:13:45.960Z" challenges: - domain: cdn.example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.cdn.example.com. type: CNAME value: fpq2gpi42teg********.cm.yandexcloud.net. - domain: cdn.example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.cdn.example.com. type: TXT value: d9RzZH8WZucSY8mXs9cEg1wNteaaNqbxZK7******** - domain: example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.example.com type: CNAME value: fpq2gpi42teg********.cm.yandexcloud.net. - domain: example.com type: DNS created_at: "2023-12-24T18:13:45.960Z" updated_at: "2023-12-24T18:13:49.280Z" status: PENDING message: Create a record in your DNS provider. dns_challenge: name: _acme-challenge.example.com. type: TXT value: iiyJJJlsaFIqQ7DMUzira0OKU3iXuaqiN7U********
Подробнее о команде
yc certificate-manager certificate get
читайте в справочнике CLI.Сохраните значения полей
value
из разделов с типомCNAME
в блокахchallenges.dns_challenge
для обоих доменных имен. Эти значения понадобятся на следующем шаге. -
Создайте ресурсные записи CNAME для прохождения проверки ваших прав на домены:
yc dns zone add-records \ --name my-domain-zone \ --record "_acme-challenge 600 CNAME <значение_dns_challenge>" \ --record "_acme-challenge.<поддомен> 600 CNAME <значение_dns_challenge>"
Где:
<значение_dns_challenge>
— сохраненное на предыдущем шаге значение, необходимое для проверки прав на соответствующий домен с помощью CNAME-записи.<поддомен>
— имя, которое вы присвоили поддомену CDN-ресурса. Например:cdn
, в этом случае запись будет выглядеть как_acme-challenge.cdn 600 CNAME fpq2gpi42teg********.cm.yandexcloud.net.
Результат:
+--------+----------------------------------+-------+------------------------------------------+-----+ | ACTION | NAME | TYPE | DATA | TTL | +--------+----------------------------------+-------+------------------------------------------+-----+ | + | _acme-challenge.cdn.example.com. | CNAME | fpq2gpi42teg********.cm.yandexcloud.net. | 600 | | + | _acme-challenge.example.com. | CNAME | fpq2gpi42teg********.cm.yandexcloud.net. | 600 | +--------+----------------------------------+-------+------------------------------------------+-----+
Подробнее о команде
yc dns zone add-records
читайте в справочнике CLI.Проверка прав на домены может занять от нескольких минут до нескольких дней — дождитесь ее успешного завершения. В результате сертификат будет выпущен и перейдет в статус
Issued
. -
Убедитесь, что статус сертификата изменился на
Issued
:yc certificate-manager certificate get \ --name mymanagedcert
Результат:
id: fpqr2j0sdb1n******** folder_id: b1gt6g8ht345******** created_at: "2023-12-24T16:38:02.206Z" name: mymanagedcert type: MANAGED domains: - cdn.example.com - example.com status: ISSUED issuer: CN=R3,O=Let's Encrypt,C=US subject: CN=cdn.example.com serial: 4b7d7f0968097ae1a7707854a80******** updated_at: "2023-12-24T16:46:03.578Z" issued_at: "2023-12-24T16:46:03.578Z" not_after: "2024-03-23T15:44:59Z" not_before: "2023-12-24T15:45:00Z"
Для получения информации, необходимой для прохождения процедуры проверки прав на домены, воспользуйтесь методом REST API get для ресурса Certificate или вызовом gRPC API CertificateService/Get с флагом
view=FULL
.Чтобы создать ресурсную запись CNAME в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
Примечание
Чтобы DNS-проверка прав на домен по записи
CNAME
прошла успешно, для поддомена_acme-challenge
проверяемого доменного имени не должно быть создано никаких ресурсных записей, кроме записиCNAME
. Например, для имени_acme-challenge.example.com.
должна существовать только CNAME-запись и не должно быть TXT-записи. - В консоли управления
Подготовьте бакет-источник для CDN-ресурса
-
Создайте бакет Object Storage, который будет использоваться в качестве источника для CDN-ресурса. Имя бакета должно быть уникальным.
Консоль управленияYandex Cloud CLIAWS CLIAPI- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Object Storage.
- Справа сверху нажмите Создать бакет.
- В поле Имя укажите имя бакета, например
cdn-source-bucket
. - В поле Макс. размер укажите
1 ГБ
. - В полях Доступ на чтение объектов и Доступ к списку объектов выберите
Публичный
. - Нажмите Создать бакет.
- На странице со списком бакетов выберите созданный бакет.
- На панели слева выберите Настройки.
- На вкладке Веб-сайт:
- Выберите
Хостинг
. - В поле Главная страница укажите
index.html
.
- Выберите
- Нажмите Сохранить.
-
Создайте бакет:
yc storage bucket create \ --name <имя_бакета> \ --default-storage-class standard \ --max-size 1073741824 \ --public-read \ --public-list
Где
--name
— имя бакета, уникальное для всего сервиса Object Storage. Например:cdn-source-bucket
.Результат:
name: cdn-source-bucket folder_id: b1gt6g8ht345******** anonymous_access_flags: read: false list: false default_storage_class: STANDARD versioning: VERSIONING_DISABLED max_size: "1073741824" acl: {} created_at: "2023-12-22T18:11:23.028836Z"
Подробнее о команде
yc storage bucket create
читайте в справочнике CLI. -
Включите в бакете хостинг статического сайта:
yc storage bucket update \ --name <имя_бакета> \ --website-settings '{"index": "index.html"}'
Результат:
name: cdn-source-bucket folder_id: b1gt6g8ht345******** default_storage_class: STANDARD versioning: VERSIONING_DISABLED max_size: "1073741824" acl: {} created_at: "2023-12-23T09:56:58.249721Z" website_settings: redirect_all_requests: {}
Подробнее о команде
yc storage bucket update
читайте в справочнике CLI.
Если у вас еще нет интерфейса командной строки AWS CLI, установите и сконфигурируйте его.
Назначьте сервисному аккаунту, через который работает AWS CLI, роль
storage.editor
.-
Создайте бакет:
aws s3api create-bucket \ --endpoint-url https://storage.yandexcloud.net \ --bucket <имя_бакета> \ --acl public-read
Где
--bucket
— имя бакета, уникальное для всего сервиса Object Storage. Например:cdn-source-bucket
.Результат:
{ "Location": "/cdn-source-bucket" }
-
Включите в бакете хостинг статического сайта:
aws --endpoint-url https://storage.yandexcloud.net \ s3 website "s3://<имя_бакета>" \ --index-document index.html
Где
<имя_бакета>
— имя созданного ранее бакета. Например:cdn-source-bucket
.
Чтобы создать бакет, воспользуйтесь методом REST API create для ресурса Bucket, вызовом gRPC API BucketService/Create или методом S3 API create.
Чтобы включить в бакете хостинг статического сайта, воспользуйтесь методом REST API update для ресурса Bucket, вызовом gRPC API BucketService/Update или методом S3 API upload.
- В консоли управления
-
Загрузите в бакет подготовленные файлы:
Консоль управленияAWS CLIAPI- В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. - В списке сервисов выберите Object Storage.
- Выберите созданный ранее бакет.
- В правом верхнем углу страницы нажмите
Загрузить и выберите созданные файлыindex.html
иcontent.jpg
. - В открывшемся окне подтвердите загрузку объектов.
-
Загрузите в бакет файл
index.html
:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp ./index.html s3://<имя_бакета>/index.html
Где
<имя_бакета>
— имя созданного ранее бакета. Например:cdn-source-bucket
.Результат:
upload: ./index.html to s3://cdn-source-bucket/index.html
-
Загрузите в бакет файл
content.jpg
:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp ./content.jpg s3://<имя_бакета>/content.jpg
Результат:
upload: ./content.jpg to s3://cdn-source-bucket/content.jpg
Чтобы загрузить файлы в бакет, воспользуйтесь методом S3 API upload.
- В консоли управления
Создайте CDN-ресурс
-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud CDN.
-
Если CDN-провайдер еще не активирован, нажмите кнопку Подключиться к провайдеру. Подключение произойдет автоматически.
Если кнопки Подключиться к провайдеру нет, и вам доступно создание ресурсов и групп источников, значит, провайдер уже активирован. Переходите к следующему шагу.
-
Нажмите Создать ресурс.
-
В блоке Контент укажите:
- Запрос контента —
Из одного источника
. - Тип источника —
Сервер
. - В поле Доменное имя источника укажите
<имя_бакета>.website.yandexcloud.net
, где<имя_бакета>
— имя созданного ранее бакета, использующегося CDN-ресурсом в качестве источника.
- Запрос контента —
-
В блоке Доменные имена для раздачи контента в поле Доменное имя укажите доменное имя, которое вы присвоите вашему CDN-ресурсу: например
cdn.example.com
.Внизу блока Доменные имена для раздачи контента отобразилось значение CNAME-записи. Скопируйте это значение: оно понадобится при создании CNAME-записи для CDN-ресурса.
-
В блоке Дополнительно:
- В поле Протокол для источников выберите
Как у клиента
. - В поле Переадресация клиентов выберите
Не использовать
. - В поле Тип сертификата выберите
Сертификат из Certificate Manager
и в появившемся списке выберите созданный ранее сертификатmymanagedcert
. - В поле Заголовок Host выберите
Свое значение
и появившемся поле Значение заголовка укажите<имя_бакета>.website.yandexcloud.net
, где<имя_бакета>
— имя созданного ранее бакета, использующегося CDN-ресурсом в качестве источника. - Включите опцию Доступ по защищённому токену.
- В появившемся поле Секретный ключ укажите секретный ключ — произвольную строку длиной от 6 до 32 символов. Он будет передан в конфигурацию CDN-ресурса и будет использоваться для формирования и проверки подписанных ссылок.
- В поле Ограничение доступа по IP-адресу выберите
Только доверенные IP-адреса
.
- В поле Протокол для источников выберите
-
Нажмите Создать.
-
Если вы создаете свой первый CDN-ресурс, сначала подключитесь к провайдеру:
yc cdn provider activate \ --type gcore
Подробнее о команде
yc cdn provider activate
читайте в справочнике CLI. -
Создайте ресурс:
yc cdn resource create <имя_поддомена> \ --origin-custom-source <имя_бакета>.website.yandexcloud.net \ --origin-protocol 'match' \ --cert-manager-ssl-cert-id <идентификатор_сертификата> \ --host-header <имя_бакета>.website.yandexcloud.net \ --secure-key <секретный_ключ> \ --enable-ip-url-signing
Где:
<имя_поддомена>
— доменное имя, для которого ранее был создан TLS-сертификат и который будет использоваться CDN-ресурсом. Например:cdn.example.com
.<имя_бакета>
— имя созданного ранее бакета Object Storage. Например:cdn-source-bucket
.--cert-manager-ssl-cert-id
— идентификатор TLS-сертификата, сохраненный ранее при его создании.--secure-key
— секретный ключ, произвольная строка длиной от 6 до 32 символов. Секретный ключ будет передан в конфигурацию CDN-ресурса и будет использоваться для формирования и проверки подписанных ссылок.
Результат:
id: bc8yqhobvxk6******** folder_id: b1gt6g8ht345******** cname: cdn.example.com created_at: "2024-06-22T19:59:05.430376Z" updated_at: "2024-06-22T19:59:05.430394Z" active: true options: edge_cache_settings: enabled: true default_value: "345600" query_params_options: ignore_query_string: enabled: true value: true host_options: host: enabled: true value: cdn-source-bucket.website.yandexcloud.net stale: enabled: true value: - error - updating secure_key: enabled: true key: sdh******** type: ENABLE_IP_SIGNING origin_group_id: "310699" origin_group_name: Origins for cdn.example.com (211929) origin_protocol: MATCH ssl_certificate: type: CM status: READY data: cm: id: fpqia0s2fc21********
Подробнее о команде
yc cdn resource create
читайте в справочнике CLI.
Воспользуйтесь методом REST API create для ресурса Resource или вызовом gRPC API ResourceService/Create.
Чтобы новые настройки существующего ресурса применились к CDN-серверам, может потребоваться до 15 минут. После этого рекомендуется очистить кеш ресурса.
Контент на созданном CDN-ресурсе будет доступен только по подписанным ссылкам.
Создайте ресурсную запись CNAME для CDN-ресурса
-
В консоли управления
выберите каталог, в котором вы будете создавать ресурсы. -
Выберите сервис Cloud DNS.
-
Выберите созданную ранее DNS-зону.
-
Нажмите Создать запись.
-
Задайте параметры записи:
- В поле Имя выберите
Создать поддомен
и укажите имя, которое вы присвоили поддомену CDN-ресурса. Например: если доменное имя вашего CDN-ресурса —cdn.example.com
, укажите толькоcdn
. - В поле Тип выберите тип записи
CNAME
. - В поле Значение укажите скопированное при создании CDN-ресурса значение CNAME-записи.
- В поле Имя выберите
-
Нажмите Создать.
-
Получите значение CNAME-записи для CDN-ресурса:
yc cdn resource get-provider-cname
Результат:
cname: cl-ms6*****90.edgecdn.ru folder_id: b1gt6g8ht345********
Подробнее о команде
yc cdn resource get-provider-cname
читайте в справочнике CLI.Сохраните полученное значение
cname
: оно пригодится на следующем шаге. -
Создайте ресурсную запись CNAME в сервисе Cloud DNS:
yc dns zone add-records \ --name my-domain-zone \ --record "<поддомен> 600 CNAME <значение_cname>"
Где:
<поддомен>
— поддомен, созданный для CDN-ресурса. Например, для доменного имениcdn.example.com
здесь нужно указатьcdn
.<значение_cname>
— полученное на предыдущем шаге значениеcname
для CDN-ресурса.
Результат:
+--------+------------------+-------+--------------------------+-----+ | ACTION | NAME | TYPE | DATA | TTL | +--------+------------------+-------+--------------------------+-----+ | + | cdn.example.com. | CNAME | cl-ms6*****90.edgecdn.ru | 600 | +--------+------------------+-------+--------------------------+-----+
Подробнее о команде
yc dns zone add-records
читайте в справочнике CLI.
Чтобы получить значение CNAME-записи для CDN-ресурса, воспользуйтесь методом REST API getProviderCName для ресурса Resource или вызовом gRPC API ResourceService/GetProviderCName.
Чтобы создать ресурсную запись CNAME в зоне DNS, воспользуйтесь методом REST API updateRecordSets для ресурса DnsZone или вызовом gRPC API DnsZoneService/UpdateRecordSets.
Опубликуйте сайт на веб-сервере
Далее вы создадите и опубликуете на вашем веб-сервере простой сайт, который будет генерировать подписанные ссылки на контент, расположенный на защищенном CDN-ресурсе. Чтобы обеспечить безопасность передаваемых данных, вы также скопируете на веб-сервер созданный ранее TLS-сертификат и включите SSL-шифрование.
Выгрузите сертификат из Certificate Manager
Чтобы использовать в конфигурации вашего веб-сервера созданный в Certificate Manager TLS-сертификат, выгрузите цепочку сертификатов и закрытый ключ в текущую директорию:
-
Узнайте идентификатор созданного ранее TLS-сертификата:
yc certificate-manager certificate list
Результат:
+----------------------+---------------+-----------------------------+---------------------+---------+--------+ | ID | NAME | DOMAINS | NOT AFTER | TYPE | STATUS | +----------------------+---------------+-----------------------------+---------------------+---------+--------+ | fpq90lobsh0l******** | mymanagedcert | cdn.example.com,example.com | 2024-03-22 16:42:53 | MANAGED | ISSUED | +----------------------+---------------+-----------------------------+---------------------+---------+--------+
Подробнее о команде
yc certificate-manager certificate list
читайте в справочнике CLI. -
Выгрузите ключ и сертификат, указав полученный на предыдущем шаге идентификатор:
yc certificate-manager certificate content \ --id <идентификатор_сертификата> \ --chain ./certificate_full_chain.pem \ --key ./private_key.pem
Подробнее о команде
yc certificate-manager certificate content
читайте в справочнике CLI.
Настройте веб-сервер
-
Скопируйте на виртуальную машину с веб-сервером полученные сертификаты и закрытый ключ:
scp ./certificate_full_chain.pem yc-user@<IP-адрес_ВМ>:certificate_full_chain.pem \ && scp ./private_key.pem yc-user@<IP-адрес_ВМ>:private_key.pem
Где
<IP-адрес_ВМ>
— публичный IP-адрес созданной ранее виртуальной машины с веб-сервером.Узнать IP-адрес виртуальной машины можно в консоли управления
на странице ВМ в блоке Сеть или с помощью команды CLIyc compute instance get mywebserver
.При первом подключении к ВМ появится предупреждение о неизвестном хосте:
The authenticity of host '51.250.**.*** (51.250.**.***)' can't be established. ED25519 key fingerprint is SHA256:PpcKdcT09gjU045pkEIwIU8lAXXLpwJ6bKC********. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])?
Введите в терминале слово
yes
и нажмите Enter. -
Подключитесь к виртуальной машине с веб-сервером:
ssh yc-user@<IP-адрес_ВМ>
-
Создайте директорию для сертификата и перенесите в нее скопированные файлы:
sudo mkdir /etc/ssl-certificates sudo mv certificate_full_chain.pem /etc/ssl-certificates/ sudo mv private_key.pem /etc/ssl-certificates/
-
Создайте директорию для файлов вашего сайта и предоставьте необходимые права на нее пользователю
www-data
:sudo mkdir -p /var/www/<имя_домена>/public_html sudo chown www-data:www-data /var/www/<имя_домена>/public_html
Где
<имя_домена>
— доменное имя вашего сайта, напримерexample.com
. -
Настройте виртуальный хост для вашего сайта:
-
Создайте файл конфигурации виртуального хоста:
sudo nano /etc/apache2/sites-available/mywebsite.conf
-
Поместите в созданный файл следующую конфигурацию:
<VirtualHost *:443> ServerName <имя_домена> ServerAdmin webmaster@localhost DocumentRoot /var/www/<имя_домена>/public_html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl-certificates/certificate_full_chain.pem SSLCertificateChainFile /etc/ssl-certificates/certificate_full_chain.pem SSLCertificateKeyFile /etc/ssl-certificates/private_key.pem </VirtualHost>
Где
<имя_домена>
— доменное имя вашего сайта, напримерexample.com
. -
Активируйте созданный виртуальный хост:
sudo a2ensite mywebsite
Результат:
Enabling site mywebsite. To activate the new configuration, you need to run: systemctl reload apache2
-
Включите для веб-сервера поддержку
ssl
:sudo a2enmod ssl
Результат:
Considering dependency setenvif for ssl: Module setenvif already enabled Considering dependency mime for ssl: Module mime already enabled Considering dependency socache_shmcb for ssl: Enabling module socache_shmcb. Enabling module ssl. See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates. To activate the new configuration, you need to run: systemctl restart apache2
-
Перезапустите веб-сервер:
sudo systemctl reload apache2
-
Создайте сайт
-
Создайте файл главной страницы сайта:
sudo nano /var/www/<имя_домена>/public_html/index.php
Где
<имя_домена>
— доменное имя вашего сайта, напримерexample.com
. -
Поместите в созданный файл
index.php
следующий код:<!DOCTYPE html> <html> <head> <title>Secure token generator website</title> <meta charset="utf-8" /> </head> <body> <h2>Генератор защищенных ссылок</h2> <p>Ниже сгенерирована подписанная ссылка на защищенный CDN-ресурс. Срок жизни ссылки — 5 минут. Контент по ссылке доступен лишь тому пользователю, для которого сайт эту ссылку сгенерировал (проверяется по IP-адресу).</p> <br> <?php $secret = '<secure_key>'; $ip = trim(getUserIpAddr()); $domain_name = '<cdn_domain_name>'; $path = '<object_key>'; $expires = time() + 300; $link = "$expires$path$ip $secret"; $md5 = md5($link, true); $md5 = base64_encode($md5); $md5 = strtr($md5, '+/', '-_'); $md5 = str_replace('=', '', $md5); $url = '<a href="https://'.$domain_name.$path.'?md5='.$md5.'&expires='.$expires.'" target="_blank">Подписанная ссылка на файл</a>'; echo "<p>Ваш IP-адрес: <b>".$ip."</b></p><p>Если вы используете VPN, ссылка может не сработать. Для корректной работы генератора подписанных ссылок отключите VPN.</p>"; echo "<br><br>"; echo $url; function getUserIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $addr = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $addr = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $addr = $_SERVER['REMOTE_ADDR']; } return $addr; } ?> </body> </html>
Где:
<secure_key>
— созданный при настройке CDN-ресурса секретный ключ.<cdn_domain_name>
— доменное имя созданного CDN-ресурса. Например:cdn.example.com
.<object_key>
— ключ объекта в бакете-источнике, например/content.jpg
. Сайт генерирует подписанную ссылку для доступа к этому объекту через CDN-ресурс.
Проверьте работу защищенного доступа к файлам
Чтобы проверить работу генератора подписанных ссылок на защищенный CDN-ресурс:
-
Откройте в браузере созданный сайт, например
https://example.com
. -
Пройдите по сгенерированной ссылке.
Если все работает правильно, у вас должно открыться изображение на защищенном CDN-ресурсе.
Примечание
Подключенный VPN может мешать правильной работе генератора подписанных ссылок. Для корректной работы сайта отключите VPN.
-
Откройте полученную ссылку на другом устройстве, выходящем в интернет с другого IP-адреса. Например, на смартфоне.
Доступ к контенту окажется запрещен.
-
Попробуйте открыть полученную ссылку на исходном устройстве по истечении пяти минут.
Доступ к контенту окажется запрещен.
Вы настроили защищенный доступ к контенту.
При формировании ссылок также можно задать определенный доверенный IP-адрес, например IP-адрес компании, который используется в корпоративной сети для доступа к интернету. Так вы сможете запретить доступ к вашему контенту за пределами сетевой инфраструктуры вашей компании.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите CDN-ресурс, затем удалите группу источников.
- Удалите созданные в бакете объекты, затем удалите сам бакет.
- Удалите созданную виртуальную машину.
- Удалите созданную доменную зону.
- Удалите созданный TLS-сертификат.
- Удалите созданную группу безопасности, затем удалите созданную подсеть, затем удалите созданную сеть.