Блог Amazon Web Services

Amazon Elastic Container Service теперь поддерживает файловые системы Amazon EFS

Оригинал статьи: ссылка (Martin Beeby, Principal Advocate, .NET)

Прошло всего пять лет с тех пор, как Jeff Barr написал в этом блоге о запуске Amazon Elastic Container Service. Я помню, как читал этот пост и думал, что контейнеры это что-то необычное и экзотическое. Всего через пять лет контейнеры стали частью повседневной жизни большинства разработчиков. В то время как наши клиенты все больше используют оркестраторы контейнеров, такие как ECS, все еще существуют некоторые типы приложений, которые сложно перенести в этот контейнеризированный мир.

При создании приложений, требующих постоянного хранения данных или общего хранилища, клиенты столкнулись с проблемой реализации такого хранилища, так как контейнеры по своей природе являются временными. По мере динамического масштабирования контейнеров все локальные данные теряются по мере прекращения работы контейнеров. Сегодня мы решили эту проблему, запустив поддержку файловых систем Amazon Elastic File System (EFS) в ECS. Контейнеры, работающие и на ECS и на AWS Fargate, могут использовать Amazon Elastic File System (EFS).

Эта новая возможность поможет клиентам контейнеризировать приложения, требующие общего хранилища, такие как системы управления контентом (CMS), внутренние инструменты DevOps и системы машинного обучения. Теперь целый новый класс задач можно будет запускать в контейнерах, позволяя клиентам ускорить процесс развертывания, оптимизировать использование инфраструктуры и построить более устойчивые системы.

Amazon Elastic File System (EFS) предоставляет простую, масштабируемую, полностью управляемую AWS общую файловую систему.  С ее помощью вы можете хранить данные отдельно от своих приложений. Также это сервис регионального уровня – это означает, что сервис хранит данные в 3 зонах доступности, для обеспечения высокой доступности и надежности хранения.

Ранее было возможно использовать EFS с ECS, если вы запускали свои контейнеры на кластере EC2 инстансов. Однако если вы хотели использовать AWS Fargate для запуска контейнеров, то до этого обновления вы не могли смонтировать файловую систему EFS. Fargate не позволяет вам получить доступ к его управляемым инстансам, поэтому вы не можете внести изменения, необходимые для подключения EFS.

Я уверен, что многие наши клиенты обрадуются возможности легко подключать файловые системы EFS к ECS. Лично я очень рад, что мы можем использовать эту новую функцию в сочетании с Fargate, она будет идеально подходить для небольшого проекта, над которым я сейчас работаю, и, наконец, даст нам возможность работать с постоянными хранилищами данных в сочетании с serverless контейнерами.

Есть одна веская причина, почему и ECS, и EFS включают слово Elastic в свое название – оба эти сервиса могут масштабироваться в зависимости от требований вашего приложения. EFS масштабируется по запросу от нуля до петабайт без прерывания работы, автоматически увеличиваясь и уменьшаясь по мере добавления и удаления файлов. С ECS есть возможность или масштабировать кластер EC2 c помощью Cluster Auto Scaling, или использовать масштабирование Fargate, чтобы изменять доступную вам вычислительную мощность в зависимости от текущих требований. Для вас, наших клиентов, это означает, что вы платите только за те вычислительные ресурсы и объем хранения данных, которые вы на самом деле собираетесь использовать.

Итак, достаточно разговоров, давайте перейдем к интересной части и посмотрим, как мы можем запустить контейнеризованное приложение, работающее с Amazon Elastic File System (EFS).

Простой пример общей файловой системы

Для этого примера я развернул небольшую инфраструктуру, на которой я могу показать вам работу приложения до и после добавления EFS в кластер Fargate. Во-первых, я создал VPC, который охватывает две зоны доступности. Во-вторых, я создал кластер ECS. На ECS кластере я планирую запустить два контейнера с помощью Fargate, а это означает, что мне не нужно настраивать никакие EC2 инстансы, поскольку мои контейнеры будут работать на Fargate флоте, который управляется AWS.

Чтобы развернуть свое приложение, я создаю Task Definition, которое использует Docker образ opensource приложения под названием Cloud Commander – простой drag-and-drop файловый менеджер.

В консоли ECS я создаю Service c использованием Task Definition, которое я создал для развертывания своего приложения. Когда Service развернут и контейнеры доступны, я открываю URL-адрес балансировщика нагрузки (Application Load Balancer), который был запущен как часть моего Service, и вижу, что мое приложение работает. Я могу перетащить файл, чтобы загрузить его в приложение.

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

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

Далее я создаю новую файловую систему внутри EFS консоли. В мастере создания я выбираю тот же VPC, который использовал для кластера ECS, выбираю все зоны доступности, которые охватывает VPC, и прошу сервис создать точки монтирования (mount targets). Эти точки монтирования позволят контейнерам, находящимся в различных зонах доступности, подключаться к файловой системе.

Я выбираю значения по умолчанию для всех остальных опций мастера. На 3 шаге я нажимаю кнопку Add access point. Точка доступа (Access point) – это средство предоставления доступа к файловой системе определенному приложению. Это средство дает мне невероятно детальный контроль над тем, к каким именно данным разрешен доступ моему приложению. Вы можете добавить несколько точек доступа к файловой системе EFS и обеспечить разным приложениям разные уровни доступа к одной и той же файловой системе.

Мое приложение будет обрабатывать загрузки пользовательских файлов для моего веб сайта, поэтому я создам точку доступа EFS, которая предоставит этому приложению полный доступ исключительно к каталогу /uploads. Для этого я создам точку доступа с новым User ID (1000) и Group ID) (1000), а также укажу домашний каталог /uploads. Каталог будет создан с этим пользователем и группой в качестве владельца с полными правами, все остальные пользователи будут обладать правом только на чтение.

Безопасность – высший приоритет в AWS, и команда приложила все усилия, чтобы сделать возможной интеграцию ECS с EFS вместе с обеспечением многоуровневой безопасности для защиты файловых систем EFS от несанкционированного доступа, включая контроль доступа на основе ролей IAM, VPC security groups, а также шифрование данных при передаче.

После завершения работы мастера EFS создается моя файловая система, и я получаю ID файловой системы и ID точки доступа. Мне понадобятся эти идентификаторы для настройки Task Definitions в Fargate.

Я возвращаюсь к Task Definition внутри своего кластера ECS и создаю новую ревизию Task Definition. Я прокручиваю вниз к разделу томов в Task Definition и нажимаю Add volume.

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

Я выбрал опцию Enable Transit Encryption (Включить шифрование при передаче), но в данном примере я не включил EFS IAM авторизацию, которая была бы полезна в большом приложении, где разные клиенты требуют разного уровня доступа для разных частей файловой системы. Эта функция может упростить управление доступом с помощью авторизации через IAM. Если вам нужна более подробная информация про использование IAM с EFS, обратите внимание на пост в блоге, который мы написали, когда эта функция была запущена ранее в этом году.

После обновления Task Definition я могу обновить Service своего приложения в ECS, чтобы использовать новую ревизию Task Definition. Также необходимо убедиться, что выбрана версия платформы 1.4.0.

Service развертывает два моих новых контейнера и выводит из эксплуатации два старых. Новые контейнеры теперь будут использовать общую файловую систему EFS, и поэтому мое приложение теперь работает, как и ожидалось.

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

Взгляд в будущее

Мне нравятся инновации, которые в последнее время появляются у команд разработки контейнерных сервисов AWS. Судя по их roadmap, у них есть несколько действительно захватывающих идей и планов на будущее. Если у вас есть собственные идеи или пожелания, не забудьте добавить свой голос за конкретные функции и улучшения к многочисленным голосам клиентов, которые уже влияют на roadmap.

Новый функционал доступен во всех регионах, где доступны ECS и EFS, без дополнительной оплаты. Включите его в консоли AWS, используйте и дайте нам знать, что вы думаете.