Задача — добавить ресурсы AWS Elastic File System в существующий CloudFormation стек.
В CloudFormation для этого имеется ресурс AWS::EFS::FileSystem, который и используем.
Шаблон для CloudFormation уже создан, и в примерах ниже будут отсылки к его ресурсам.
Содержание
Опции EFS
Перед тем, как создавать EFS — немного рассмотрим доступные опции.
EFS имеет два основных доступных параметра — Performance mode («тип производительности»), и Throughput mode («пропускной режим»).
Performance mode
Performance mode не влияет на стоимость и не может быть изменён после создания EFS.
В свою очередь Performance mode имеет два типа — General Purpose Performance Mode и Max I/O Performance Mode.
При использовании General Purpose Performance Mode вы получаете стабильные время ответа от файловой системы и скорость передачи данных, но ограничены 7000 операциями в секунду для всех подключенных к EFS клиентов.
Использование типа Max I/O — вы получите больше I/O в секунду и пропускную способность, но время операций чтения/записи может быть незначительно выше.
Основной совет при выборе типа производительности — создать EFS с типом General Purpose, нагрузить её до планируемой в Production нагрузки, и проверить значения PercentIOLimit в CloudWatch: если значение достигает 100% — то стоит попробовать Max I/O.
Throughput Modes
Кроме Performance mode, который отвечает за кол-во операций в секунду и время выполнения этих операций — имеет значение и пропускная возможность EFS, которая ограничивает скорость передачи от хостов EFS к клиентам.
В Bursting типе скорость передачи растёт пропорциональность размеру EFS, а в Provisioned задаётся фиксированным значением при создании EFS (и может быть изменена после создания).
При использовании Bursting типа сразу после создания EFS, пока используемый размер менее 10 GB — вы получаете 0.5 мб/с постоянной скорости передачи данных, и возможность временно увеличить скорость до 100 мб/с на 72 минуты в день (!):
File System Size (GiB)
Baseline Aggregate Throughput (MiB/s)
Burst Aggregate Throughput (MiB/s)
Maximum Burst Duration (Min/Day)
% of Time File System Can Burst (Per Day)
10
0.5
100
7.2
0.5%
256
12.5
100
180
12.5%
512
25.0
100
360
25.0%
1024
50.0
100
720
50.0%
1536
75.0
150
720
50.0%
2048
100.0
200
720
50.0%
3072
150.0
300
720
50.0%
4096
200.0
400
720
50.0%
Т.е., чем больше будет размер EFS — тем выше будет постоянная скорость доступа и дольше возможность её увеличения.
Для мониторинга доступной скорости используются Bust Credits — BurstCreditBalance в CloudWatch.
При использовании Provisioned Mode — вы можете задать скорость доступа независимо от кол-ва данных в EFS, но при этом будете оплачивать как за GB в EFS, так и за пропускной канал.
Приложение состоит из трёх ЕС2 — два для самого приложения, которые обслуживают клиентов и доступны через Application Load Balancer, это App1 и App2, и третий инстанс — Console, на котором работают cron-задачи, RabbitMQ, Redis и т.д.
При монтировании «шары» на каждом EC2 будет использоваться общий URL для EFS, который будет резолвиться в IP Mount Target-а в Availability зоне каждого инстанса.
Добавляем два файла переменных: в roles/efs/vars/main.yml будут общие переменные, такие как имя каталога для точки монтирования, а в roles/efs/vars/{{ env }}_vars.yml — DNS имя EFS.
Для каждого окружения в инвентори-файле задаётся переменная {{ env }}, используя которую можно переопределить файл с параметрами для каждого окружения:
cat hosts.ini | grep -w env
env=test
env=dev
env=production
Файл roles/efs/vars/main.yml:
efs_mount_path: "/storage"
И файл roles/efs/vars/test_vars.yml — тут задаём ReceiptsFileSystemDNS из Outputs стека + :/ в конце: