Инструкции#

Настройка собственного домена для веб-сайта#

По умолчанию бакет, работающий в режиме веб-сайта, доступен по адресу http://bucket-name.website.k2.cloud, где bucket-name — это имя бакета. Вместо доменного имени, приведённого выше, можно использовать собственное произвольное доменное имя.

Настроить собственный домен третьего уровня для сайта#

Для размещения сайта вы можете использовать собственный домен. Например, домен третьего уровня img.example.com в зоне example.com.

Прежде всего вам нужно создать бакет с именем img.example.com, загрузить в него содержимое будущего веб-сайта и включить режим веб-сайта.

Чтобы веб-сайт стал доступен по адресу http://img.example.com, необходимо настроить DNS-сервер, обслуживающий зону example.com.

В настройках зоны example.com создайте запись типа CNAME:

BIND#
img.example.com. IN CNAME img.example.com.website.k2.cloud.

После внесения этих изменений веб-сайт будет доступен по адресу: http://img.example.com, а также (по умолчанию) по адресу: http://img.example.com.website.k2.cloud.

Настроить собственный домен второго уровня для сайта#

Для размещения сайта вы можете использовать собственный домен. Например, домен второго уровня example.com.

Создайте бакет с именем example.com, загрузите в него содержимое будущего веб-сайта и включите режим веб-сайта.

Чтобы веб-сайт стал доступен по адресу http://example.com, необходимо настроить DNS-сервер, обслуживающий зону example.com.

Важно

В данном примере используется домен второго уровня, он же корневой домен, зоны example.com. Спецификация DNS не допускает создание записи типа CNAME для корневого домена, но некоторые DNS-серверы и сервисы позволяют создавать такие записи. Убедитесь, что ваш DNS-сервер/сервис поддерживает такую возможность. Часто такие записи называются не CNAME а, например, ALIAS или ANAME.

В настройках зоны example.com создайте запись типа ALIAS или ANAME (в зависимости от того, что использует ваш DNS-провайдер):

BIND#
example.com. IN ALIAS example.com.website.k2.cloud.

Настройка HTTPS для веб-сайта#

По умолчанию бакет, работающий в режиме веб-сайта, доступен только по протоколу HTTP по адресу http://bucket-name.website.k2.cloud, где bucket-name — это имя бакета.

Вы можете включить поддержку протокола HTTPS, а также настроить автоматическое перенаправление с HTTP на HTTPS.

На данный момент API для включения протокола HTTPS средствами автоматизации не предусмотрен.

Важно

Чтобы включить HTTPS для конкретного веб-сайта, оставьте заявку на портале поддержки или в письме на адрес support@k2.cloud. Примеры обращений указаны ниже.

Настроить доступ к веб-сайту http://bucket1.website.k2.cloud по протоколу HTTPS#

Чтобы веб-сайт http://bucket1.website.k2.cloud был доступен по протоколу HTTPS, создайте бакет bucket1 и включите режим веб-сайта.

После того как эти действия выполнены, оставьте заявку на портале поддержки

Пример заявки
Тема: HTTPS для bucket1.website.k2.cloud

Описание:

 - Имя бакета: *bucket1*
 - Домен веб-сайта: *bucket1.website.k2.cloud*
 - Включить принудительное перенаправление с HTTP на HTTPS: *да/нет*

где:

 - *Имя бакета* — ваш бакет в объектном хранилище (S3), который должен быть доступен по HTTPS в режиме веб-сайта.
 - *Доменное имя веб-сайта* — имя веб-сайта, на которое будет выпущен сертификат для работы по HTTPS.
 - *Включить принудительное перенаправление с HTTP на HTTPS* — если вы хотите, чтобы пользователи, посещающие веб-сайт по HTTP, автоматически перенаправлялись на HTTPS-версию веб-сайта, укажите *да*. Если вы хотите сохранить возможность посещать веб-сайт по HTTP, укажите *нет*.

После проверки обращения для указанного доменного имени будет выпущен сертификат и включён HTTPS. В качестве центра сертификации будет использован Let’s Encrypt.

Настроить доступ к веб-сайту с собственным доменом http://img.example.com по протоколу HTTPS#

Чтобы веб-сайт http://img.example.com был доступен по протоколу HTTPS, создайте бакет img.example.com и включите режим веб-сайта. Затем настройте ваш DNS для того, чтобы веб-сайт стал доступен по адресу http://img.example.com.

После того как эти действия выполнены, оставьте заявку на портале поддержки

Пример заявки
Тема: HTTPS для img.example.com

Описание:

 - Имя бакета: *img.example.com*
 - Домен веб-сайта: *img.example.com*
 - Включить принудительное перенаправление с HTTP на HTTPS: *да/нет*
 - Использовать собственный сертификат: *да/нет*

где:

 - *Имя бакета* — ваш бакет в объектном хранилище (S3), который должен быть доступен по HTTPS в режиме веб-сайта.
 - *Доменное имя веб-сайта* — имя веб-сайта, на которое будет выпущен сертификат для работы по HTTPS.
 - *Включить принудительное перенаправление с HTTP на HTTPS* — если вы хотите, чтобы пользователи, посещающие веб-сайт по HTTP, автоматически перенаправлялись на HTTPS версию веб-сайта, укажите *да*. Если вы хотите сохранить возможность заходить на веб-сайт по HTTP, укажите *нет*.
 - *Использовать собственный сертификат*. При использовании собственного домена для веб-сайта вы можете передать нам свой сертификат. В этом случае вам нужно указать *да* и вложить в обращение сертификат для указанного доменного имени. Это может быть нужно в тестовых целях или в тех случаях, когда необходимо, чтобы сертификат обладал особыми атрибутами. Если вы укажите *нет*, то для этого домена будет выпущен и использован сертификат от центра сертификации Let's Encrypt.

Настройка правил перенаправления веб-сайта#

Бакет, работающий в режиме веб-сайта, может быть настроен для перенаправления всех или некоторых приходящих запросов на другие бакеты или внешние ресурсы.

В документации можно ознакомиться с составом поддерживаемых в К2 Облаке команд S3 API и инструкцией по настройке AWS CLI.

Для получения текущей конфигурации веб-сайта конкретного бакета можно воспользоваться командой aws s3api get-bucket-website.

aws --endpoint-url https://s3.k2.cloud s3api get-bucket-website --bucket bucket1

{
  "IndexDocument": {
      "Suffix": "index.html"
  }
}

Для задания конфигурации веб-сайта бакета используйте команду s3api put-bucket-website.

Существует несколько вариантов перенаправления:

Поддерживаемые параметры правил перенаправления#

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

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

Блок

Параметр

Описание

Condition

HttpErrorCodeReturnedEquals

Код ошибки HTTP при применении перенаправления. Если код возникшей ошибки равен этому значению, то применяется указанный редирект. Требуется, если задан блок Condition и не указан KeyPrefixEquals. Если указаны оба условия, то для применения перенаправления они оба должны выполняться.

Condition

KeyPrefixEquals

Префикс имени ключа объекта при применении перенаправления. Например, для перенаправления запросов к ExamplePage.html префиксом ключа будет ExamplePage.html. Для перенаправления запроса всех страниц с префиксом docs/, префиксом ключа будет docs/, который идентифицирует все объекты в папке docs/. Требуется, когда указан Condition и не указан HttpErrorCodeReturnedEquals. Если указаны оба условия, то для применения перенаправления они оба должны выполняться.

Redirect

HostName

Имя хоста в запросе при перенаправлении.

Redirect

HttpRedirectCode

HTTP-код в ответе при перенаправлении.

Redirect

Protocol

Протокол, используемый при перенаправлении запросов. По умолчанию используется протокол в исходном запросе.

Redirect

ReplaceKeyPrefixWith

Префикс ключа объекта для использования в запросе на перенаправление. Например, чтобы перенаправить запросы для всех страниц с префиксом docs/ (объекты в папке docs/) в documents/, можно задать KeyPrefixEquals как docs/ и в блоке Redirect задать ReplaceKeyPrefixWith как documents/. Может присутствовать только в том случае, если ReplaceKeyWith не используется.

Redirect

ReplaceKeyWith

Конкретный ключ объекта для использования в запросе на перенаправление. Например, запрос перенаправления на error.html. Может присутствовать только при отсутствии ReplaceKeyPrefixWith.

Перенаправить все запросы на другой ресурс#

Если вы хотите, чтобы все запросы перенаправлялись на другой ресурс, подготовьте JSON-файл со следующими параметрами бакета bucket1.json.

Файл bucket1.json
{
  "RedirectAllRequestsTo": {
    "HostName": "new-site.com",
    "Protocol": "http"
  }
}

В этом примере бакет bucket1.website.k2.cloud конфигурируется как веб-сайт. Однако конфигурация указывает, что все GET-запросы для конечной точки сайта bucket1.website.k2.cloud будут перенаправлены на хост new-site.com. Этот редирект может быть полезен, когда у вас есть два веб-сайта: старый — old-site.com (в нашем примере это bucket1.website.k2.cloud) и новый — new-site.com, и вы хотите, чтобы все запросы, которые приходят на старый веб-сайт, перенаправлялись на новый.

aws --endpoint-url https://s3.k2.cloud s3api put-bucket-website --bucket old-site.com --website-configuration file://bucket1.json

Примечание

Если в конфигурации вы укажете параметр RedirectAllRequestTo, вы не сможете указать другой параметр.

Настроить гибкие правила перенаправления на другой ресурс#

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

Предположим, что ваш бакет bucket2 содержит следующие объекты:

index.html
docs/site1.html
docs/site2.html

Если вы решили переименовать папку docs/ в documents/, вам нужно перенаправить запросы на префикс docs/ в documents/. Например, если запрос docs/site1.html должен быть перенаправлен на documents/site1.html, вы обновляете конфигурацию сайта и добавляете правило маршрутизации, как показано в следующем JSON-файле bucket2.json:

Файл bucket2.json
{
  "IndexDocument": {
    "Suffix": "index.html"
  }
  "ErrorDocument": {
    "Key": "Error.html"
  }

  "RoutingRules": [
    {
    "Condition": {
      "KeyPrefixEquals": "docs/"
    }
    "Redirect": {
      "ReplaceKeyPrefixWith": "documents/"
    }
  }
  ]
}
aws --endpoint-url https://s3.k2.cloud s3api put-bucket-website --bucket bucket2 --website-configuration file://bucket2.json

Настроить несколько правил перенаправления на другой ресурс#

Если вы хотите использовать нескольких правил перенаправления одновременно, подготовьте соответствующий JSON-файл. Например, чтобы настроить разные правила редиректа для русской локализации веб-сайта отдельно от английской, необходимо подготовить JSON-файл bucket3.json:

Файл bucket3.json
{
  "IndexDocument": {
      "Suffix": "index.html"
  },
  "ErrorDocument": {
      "Key": "error.html"
  },
  "RoutingRules": [
      {
          "Redirect": {
              "ReplaceKeyWith": "ru/data.html",
              "HostName": "new-site.com",
              "Protocol": "https",
              "HttpRedirectCode": "302"
          },
          "Condition": {
              "KeyPrefixEquals": "ru/manual/data.html"
          }
      },
      {
          "Redirect": {
              "ReplaceKeyWith": "en/data.html",
              "HostName": "new-site.com",
              "Protocol": "https",
              "HttpRedirectCode": "302"
          },
          "Condition": {
              "KeyPrefixEquals": "en/manual/data.html"
          }
      }
  ]
}
aws --endpoint-url https://s3.k2.cloud s3api put-bucket-website --bucket old-site --website-configuration file://bucket3.json

Настройка жизненного цикла объектов в бакете#

Чтобы хранение объектов в бакете было экономически эффективным, можно настроить жизненный цикл. Если вы используете бакет для хранения лог-файлов или регулярных отчётов, то в какой-то момент файлов может стать слишком много. В таком случае можно сократить время на хранение и время, затрачиваемое на ручное удаление объектов, настроив автоудаление объектов из бакета с помощью BucketLifecycle.

Для настройки регулярного удаления объектов из бакета необходимо описать правила жизненного цикла в JSON-файле. Пример правила из файла lifecycle.json, в соответствии с которым объекты будут автоматически удаляться из бакета bucket_with_logs через 30 дней после загрузки.

Пример правила из файла lifecycle.json
{
    "Rules": [
        {
            "ID": "Expire old logs",
            "Filter": {
                    "Prefix": "logs/"
            },
            "Status": "Enabled",
            "Expiration": {
                    "Days": 30
             }
        }
    ]
}
aws --endpoint-url https://s3.k2.cloud s3api put-bucket-lifecycle-configuration --bucket bucket_with_logs --lifecycle-configuration file://lifecycle.json

Подробнее про объектное хранилище.

Настройка блокировки версий объектов#

Если вы хотите запретить удаление и перезапись объектов и их версий, то можете воспользоваться методами блокировки S3 Object Lock. В данной инструкции рассматриваются основные действия для настройки блокировки, более подробное описание принципов и методов блокировки можно найти в справочнике API по методам Object Lock. Для настройки блокировки используется утилита командной строки AWS (см. как её установить и сконфигурировать).

Создание бакета#

Блокирование объектов в бакете возможно, только если при создании бакета была включена блокировка объектов. Для её включения при создании бакета необходимо указать опцию –object-lock-enabled-for-bucket.

aws s3api create-bucket --bucket <bucket-name> --object-lock-enabled-for-bucket --endpoint-url=https://s3.k2.cloud

Задание политики по умолчанию#

Вы можете задать политику блокировки для бакета, которая по умолчанию будет применяться ко всем загружаемых объектам (если для конкретного объекта не указаны иные параметры блокировки). Политика устанавливает срок хранения версии объекта и режим хранения (COMPLIANCE или GOVERNANCE). Политику по умолчанию определять не обязательно, однако при её отсутствии придётся задавать параметры блокировки при загрузке каждого объекта, который требуется защитить.

Режим COMPLIANCE предусматривает строгую блокировку — версию объекта нельзя удалить или перезаписать до окончания срока хранения. При использовании режима GOVERNANCE срок хранения может изменить любой пользователь с правами на объектное хранилище. В приводимом примере для загружаемого объекта устанавливается блокировка сроком на 360 дней в режиме COMPLIANCE.

aws s3api --endpoint-url=https://s3.k2.cloud put-object-lock-configuration \
 --bucket <bucket-name> \
 --object-lock-configuration "ObjectLockEnabled=Enabled,Rule={DefaultRetention={Mode=COMPLIANCE,Days=360}}"

Заданную по умолчанию политику можно посмотреть с помощью команды get-object-lock-configuration:

aws s3api --endpoint-url=https://s3.k2.cloud get-object-lock-configuration \
  --bucket <bucket-name>

{
    "ObjectLockConfiguration": {
        "ObjectLockEnabled": "Enabled",
        "Rule": {
            "DefaultRetention": {
                "Mode": "GOVERNANCE",
                "Days": 360
            }
        }
    }
}

Загрузка объекта#

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

В данном примере для загружаемого объекта устанавливается режим GOVERNANCE со сроком хранения до 20 октября 2024 г.

aws s3api --endpoint-url=https://s3.k2.cloud put-object \
  --bucket <bucket-name> \
  --key <object-name> \
  --body <path-to-file> \
  --object-lock-mode GOVERNANCE \
  --object-lock-retain-until-date "2024-11-20"

{
    "ETag": "\"dff23456a91215d7153f85a7c127aaa9\"",
    "VersionId": "<version-id>"
}

Изменение параметров блокировки#

Если для версии объекта задан режим COMPLIANCE, то вы можете только увеличить срок хранения версии. Если же задан режим GOVERNANCE, то вы можете как увеличить, так и уменьшить срок хранения версии, а также изменить сам режим хранения. Для сокращения срока хранения и изменения режима блокировки необходимо использовать опцию –bypass-governance-retention.

Пример увеличения срока хранения.

aws s3api --endpoint-url=https://s3.k2.cloud put-object-retention \
  --bucket <bucket-name> \
  --key <object-name> \
  --version-id <version-id> \
  --retention '{ "Mode": "GOVERNANCE", "RetainUntilDate": "2024-12-01T00:00:00" }'

Пример уменьшения срока хранения.

aws s3api--endpoint-url=https://s3.k2.cloud put-object-retention \
  --bucket <bucket-name> --key <object-name> \
  --key <object-name> \
  --version-id <version-id> \
  --bypass-governance-retention \
  --retention '{ "Mode": "GOVERNANCE", "RetainUntilDate": "2024-10-01T00:00:00" }'

Текущие параметры блокировки для версии объекта можно узнать с помощью команды get-object-retention.

aws s3api --endpoint-url=https://s3.k2.cloud get-object-retention \
  --bucket <bucket-name> \
  --key <object-name> \
  --version-id <version-id>

{
    "Retention": {
        "Mode": "GOVERNANCE",
        "RetainUntilDate": "2024-10-01T00:00:00.000000000Z"
    }
}

Включение бессрочной блокировки#

Для версии объекта можно также включить бессрочную блокировку (Legal Hold). Этот способ блокировки независим от блокировки на предопределённый период времени. При его включении версия объекта будет защищена от удаления, даже когда закончится срок её хранения (Retention Period).

Пример включения бессрочной блокировки при загрузке объекта.

aws s3api --endpoint-url=https://s3.k2.cloud put-object \
  --bucket <bucket-name> \
  --key <object-name> \
  --body <path-to-file> \
  --object-lock-legal-hold-status ON

{
    "ETag": "\"dff23456a91215d7153f85a7c127aaa9\"",
    "VersionId": "1TrVY0XDY44WvOmMqxw04HbSIemIHtG"
}

Пример включения бессрочной блокировки для версии объекта.

aws s3api --endpoint-url=https://s3.k2.cloud put-object-legal-hold \
  --bucket <bucket-name> \
  --key <object-name> \
  --legal-hold Status=ON \
  --version-id <version-id>

Пример отключения бессрочной блокировки у версии объекта.

Примечание

Отключить бессрочную блокировку может любой пользователь проекта с полным набором привилегий для работы с объектным хранилищем.

aws s3api --endpoint-url=https://s3.k2.cloud put-object-legal-hold \
  --bucket <bucket-name> \
  --key <object-name> \
  --version-id <version-id> \
  --legal-hold Status=OFF

Текущий статус блокировки для версии объекта можно узнать с помощью команды get-object-legal-hold.

aws s3api --endpoint-url=https://s3.k2.cloud get-object-legal-hold \
  --bucket <bucket-name> \
  --key <object-name> \
  --version-id <version-id>

{
    "LegalHold": {
        "Status": "ON"
    }
}

Удаление объекта#

При удалении объекта из бакета с включённым версионированием последняя версия объекта не удаляется — создаётся лишь маркер удаления. Однако если версию объекта без блокировки можно затем удалить, то версия объекта с блокировкой защищена от удаления.

В режиме COMPLIANCE заблокированную версию объекта невозможно удалить до окончания срока хранения. В режиме GOVERNANCE версию можно удалить с помощью обхода блокировки (опция x-amz-bypass-governance-retention).

Пример удаления объекта с созданием маркера удаления.

aws s3api --endpoint-url=https://s3.k2.cloud delete-object \
  --bucket <bucket-name> \
  --key <object-name>

  {
      "DeleteMarker": true,
      "VersionId": "<delete-marker-id>"
  }

Пример удаления версии объекта с обходом блокировки для версии с режимом GOVERNANCE.

aws s3api --endpoint-url=https://s3.k2.cloud delete-object \
  --bucket <bucket-name> \
  --key <object-name> \
  --version-id <version-id> \
  --bypass-governance-retention

{
    "VersionId": "<version-id>"
}

Расширенные возможности управления объектным хранилищем с помощью S3cmd#

Расширенные возможности даёт утилита S3cmd. Ниже приведена последовательность действий для её установки.

  1. Перед установкой вам необходимо получить настройки для доступа по API. Сделать это можно в консоли управления облаком. Нажмите на логин пользователя в правом верхнем углу и выберите Профиль Получить настройки доступа к API.

  2. Утилита S3cmd входит по умолчанию в репозитории Ubuntu, Debian, Fedora, CentOS и RHEL Linux. Её можно установить с помощью следующих команд.

    # yum install epel-release -y
    # yum install s3cmd -y
    
    # sudo apt-get install s3cmd
    
  3. Далее настройте S3cmd (access key и secret key содержатся в настройках для доступа по API):

    Настройки s3cmd
    # s3cmd --configure
    
    Enter new values or accept defaults in brackets with Enter.
    Refer to user manual for detailed description of all options.
    Access key and Secret key are your identifiers for Amazon S3.
    Leave them empty for using the env variables.
    
    Access Key: <имя проекта в К2 Облаке>:<учётная запись в К2 Облаке>
    Secret Key: XXXXXXXXXXXXXXXXXXXXXX
    Default Region [US]:
    
    Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
    S3 Endpoint [s3.amazonaws.com]: s3.k2.cloud
    
    Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3.
    "%(bucket)s" and "%(location)s" vars can be used
    if the target S3 system supports dns based buckets.
    DNS-style bucket+hostname:port template for accessing
    a bucket [%(bucket)s.s3.amazonaws.com]: %(bucket)s.s3.k2.cloud
    
    Encryption password is used to protect your files from reading
    by unauthorized persons while in transfer to S3
    Encryption password:
    Path to GPG program [/usr/bin/gpg]:
    
    When using secure HTTPS protocol all communication with Amazon S3
    servers is protected from 3rd party eavesdropping. This method is
    slower than plain HTTP, and can only be proxied with Python 2.7 or newer
    Use HTTPS protocol [No]: yes
    
    On some networks all internet access must go through a HTTP proxy.
    Try setting it here if you can't connect to S3 directly
    HTTP Proxy server name:
    
    New settings:
    Access Key: <имя проекта в К2 Облаке>:<Учётная запись в К2 Облаке>
    Secret Key: XXXXXXXXXXXXXXXXXXXXXX
    Default Region: US
    S3 Endpoint: s3.k2.cloud
    DNS-style bucket+hostname:port template for accessing a bucket: %(bucket)s.s3.k2.cloud
    Encryption password:
    Path to GPG program: /usr/bin/gpg
    Use HTTPS protocol: True
    HTTP Proxy server name:
    HTTP Proxy server port: 0
    
    Test access with supplied credentials? [Y/n] y
    
    Save settings? [y/N] y
    

После этого вы можете использовать утилиту S3cmd. Если вам нужна помощь в использовании утилиты, откройте руководство посредством команды s3cmd --help.