Введение в «Инфраструктуру как код»
Это краткое руководство по настройке безопасного статического веб-сайта в AWS с помощью Terraform (видео). Ранее я рассказал о нескольких сервисах AWS (базовая настройка S3 и сервисы AWS CI/CD), чтобы изучить, как это сделать на видео. Полный текст статьи, в которой я рассказал о пошаговом процессе, можно также найти здесь.
На этом предыдущем занятии вы узнаете, как настроить полный статический веб-сайт (React.js boilerplate) в архитектуре S3 и добавить конвейер для непрерывного развертывания кода вашего сайта в ведро S3.
В продолжение этого, в этой статье я сосредоточился на создании «инфраструктуры как кода» для непрерывного развертывания архитектуры в различных средах или для любого случая использования, когда требуется повторяющееся развертывание инфраструктуры.
Определение компании Hashicorp
Инструменты «инфраструктура как код» (IaC) позволяют управлять инфраструктурой с помощью конфигурационных файлов, а не графического интерфейса пользователя. IaC позволяет создавать, изменять и управлять инфраструктурой безопасным, последовательным и повторяемым способом, определяя конфигурации ресурсов, которые можно редактировать, повторно использовать и совместно использовать.
Архитектура
Архитектура AWS для настройки этой системы проста.
- S3 — это основной компонент всех служб AWS, который представляет собой службу хранения данных, обеспечивающую возможность размещения статических файлов, необходимых для веб-сайта, безопасность доступа к этим файлам, настройку обработки ошибок и конечную точку для целевой страницы.
- Cloudfront — это сеть доставки контента с низкой задержкой, которая может обеспечить кэширование файлов, к которым обращаются клиенты в разных местах.
- Route 53 — это служба системы доменных имен (DNS) AWS, которая также может предоставлять политики маршрутизации по мере необходимости.
- Для обеспечения безопасности веб-сайта можно настроить пользователя IAM, чтобы ограничить доступ на запись к ведру.
Необходимые условия
- Terraform установлен
- Установлен AWS CLI
- Учетная запись AWS и учетные данные, имеющие доступ к созданию ресурсов AWS
Установка
Terraform Для установки Terraform на Windows я загрузил двоичный пакет, предоставленный здесь. Затем я разархивировал пакет и скопировал исполняемый файл в папку C:/Program Files (x86)/Terraform. После этого мне нужно было добавить эту папку в переменную $PATH, которую можно найти в Панель управления > Система > Дополнительные системные настройки > Вкладка > Переменные среды. Я обновил переменную $PATH, затем сделал сброс, чтобы она отразилась. В командной строке я выполнил следующую команду, чтобы убедиться, что она теперь распознается.
echo $PATH
Затем выполните следующую команду, чтобы проверить, успешно ли установлен Terraform. Она должна отобразить версию исполняемого файла.
terraform --version
Terraform v1.2.5
on windows_386
AWS CLI можно установить, загрузив и запустив пакет msi, который можно найти здесь. После установки проверьте установку, проверив версию.
aws --version
aws-cli/2.4.18 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
Учетная запись AWS и учетные данные Вам необходимо создать пользователя IAM, который будет иметь необходимый доступ для создания ресурсов, определенных в архитектуре. Для этого войдите в консоль управления AWS и перейдите к службе IAM. Для простоты вы можете создать пользователя IAM с доступом администратора, но в идеале вам нужен пользователь с правами наименьшей привилегии. Я также рассказывал о шагах для этого в этом видео.
После настройки пользователя и сохранения идентификатора ключа доступа AWS и секретного ключа доступа AWS вы можете настроить свою среду, выполнив следующую команду
aws configure
AWS Access Key ID [**********ABCD]: <Input here>
AWS Secret Access Key [**********abcd]: <Input here>
Default region name [ap-southeast-1]: <Input here>
Default output format [None]:
Затем проверьте возможность подключения, выполнив следующую команду
aws sts get-caller-identity
{
"UserId": "<UserID>",
"Account": "<Account>",
"Arn": "arn:aws:iam::<Account>:user/aws-cli"
}
Код Terraform
Вы можете проверить код из этого репозитория GitHub. Чтобы следовать шагам в этом разделе, я бы рекомендовал просмотреть это руководство от Hashicorp по основам Terraform для AWS.
- Из кода перейдите в папку static website, в которой находится файл main.tf.
cd terraformstuffstaticwebsite
- Инициализируйте terraform, запустив
terraform init
. От Hashicorp
Команда terraform init используется для инициализации рабочего каталога, содержащего файлы конфигурации Terraform. Это первая команда, которую следует выполнить после записи новой конфигурации Terraform или клонирования существующей из системы управления версиями.
PS C:UsersKayeworkspaceterraformstuffstaticwebsite> terraform init
Initializing modules...
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Using previously-installed hashicorp/aws v4.23.0
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
- Теперь, когда Terraform инициализирован, вы можете попробовать запустить план, чтобы первоначально просмотреть список создаваемых ресурсов.
От Hashicorp
Команда terraform plan оценивает конфигурацию Terraform для определения желаемого состояния всех объявленных в ней ресурсов, затем сравнивает это желаемое состояние с реальными объектами инфраструктуры, которыми управляют с помощью текущего рабочего каталога и рабочего пространства.
- План также можно просмотреть при выполнении команды
terraform apply
, которая также дает возможность построить инфраструктуру в AWS с подтверждением «да».
Plan: 4 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
- После выполнения кода вы должны иметь возможность просматривать созданные ресурсы в консоли управления AWS.
Примечание: На момент написания этой статьи созданный мной код terraform создал только ресурсы Cloudfront и S3, а ресурсы Route 53/ACM я создал вручную. Шаги для этого также можно посмотреть в предыдущем видео, которым я поделился выше.
Загрузите статический веб-сайт в S3!
Я вручную загрузил файл index.html
в S3, чтобы проверить, все ли работает.
Разработайте конвейер вашего сайта
В GitHub Actions Marketplace есть образец рабочего процесса, который позволяет легко настроить CI/CD конвейер для вашего статического сайта. Вы можете ознакомиться с шагами по его настройке здесь: https://github.com/marketplace/actions/configure-aws-credentials-action-for-github-actions.
Вот скриншот настройки вашего IAM с Identity Provider.
В роли IAM настройте следующее в разделе Доверительные отношения
{
"Effect": "Allow",
"Principal": {
"Federated": "<ARN of the OIDC>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
}
}
}
Это должно решить проблему подключения/доступа. Попробуйте это, развернув пример кода, проверьте в S3, был ли файл обновлен. Вы также можете обновить рабочий процесс, чтобы добавить аннулирование в cloudfront, чтобы убедиться, что все в кэше аннулируется во время развертывания.
aws cloudfront create-invalidation --distribution-id --paths {{ secrets.CLOUD_DIST }} "/*"
Ссылка на мой проект рабочего процесса на GitHub здесь, если вы хотите клонировать и создать свой собственный проект!