Хостинг Приложение для одной страницы в S3 с Cloudfront один из Самый крутой Вещи, которые вы можете захотеть сделать в качестве разработчика полного стека, особенно рассматривая, сколько дешевле и стабильно Ваше приложение будет, требуя вас Нет обслуживания вообще и с неограниченной масштабируемостью. Спа — это действительно мощный способ подхода к современной разработке веб -приложений, и в сочетании с сервисами AWS, такими как S3 и Cloudfront, может очень быстро поднять вас в качестве успешного разработчика. Однако это может стать Действительно тяжело Чтобы доставить свой спа -салон в сценариях реального мира, где вам нужно обрабатывать переменные среды, CI/CD или вы просто хотите избежать настройки множества вещей вручную, чтобы привлечь ваше приложение в руках ваших клиентов.
Я видел действительно уродливые (и даже рискованные) взломы, когда дело доходит до доставки многоэтапных настройки спа-салонов, и в этом посте я покажу вам один из самых чистых способов, которые я смог найти до сих пор, чтобы доставить спа-салон через быстрый Трубопровод, который делает мою жизнь легкой и пользователями счастливыми.
В этом посте я сделаю вас шагом за шагом в Полностью автоматизированный процесс доставки в Azure DevOps для вашего спа -салона Анкет Я выбрал Vuejs Для примера тот же подход будет работать с любая другая технология , и я выбрал Лазурные DevOps Но вы можете перевести те же шаги на CI/CD Платформа вашего предпочтения Анкет
Хорошо, мой друг, давай на практике !!
Не могу начать без домена, верно? (Пропустите, если у вас есть домен и сертификат в ACM US-EAST-1)
Чтобы доставить ваше приложение в Интернет, Вам понадобится домен Чтобы использовать с ним, скажем, ваш домен eureka.com И вы купили его через AWS. Вам нужно Запросить сертификат для вашего сайта. Кончик: CloudFront работает только с сертификатами, размещенными в US-EAST-1 Поэтому, когда вы запросите сертификат, убедитесь, что вы делаете это для этой зоны. Если ваш домен не выдан AWS, не волнуйтесь, вы можете Импорт Ваш сертификат довольно легко.
Теперь, когда у вас есть домен, вам нужно приложение (пропустите, если у вас уже есть приложение).
Если вы средний разработчик, я пропущу этот шаг, чтобы вы должны знать довольно хорошо, как создать спа -салон с помощью терминала. В случае Vuejs, CLI документация объясняет это намного лучше, чем когда -либо, поэтому я не буду тратить ваше время на бесполезные кодовые блоки здесь.
Эй, наше приложение — это классическое приложение, которое подключается к API, поэтому нам нужно подключиться к API, помните? (Пропустите, если … нет, прочитайте это)
Конечно, способ подключения к бэкэнд очень важен, верно? Вот где эта вещь становится интересной … В нашем приложении мы иметь другой API за этап , поэтому URL будет отличаться между местным, разработчиком, постановкой, живой, что угодно. Я выбрал Dotenv , который является одним из самых простых и наиболее широко используемых способов хранения Env Vars в спа -салоне. Я создал 2 dotenv files: .env.local (локальный и незнашиваемый) и .env.cd (трубопровод)
Первый файл содержит мои локальные Env Vars. Второй — тот, который мы будем использовать в нашем трубопроводе и будут содержать токены вместо реальных переменных, следующим образом: while .env.local говорит: Vue_app_backend_url = https://mybackend-rocks.eureka.com
Наш .env.cd говорит: Vue_app_backend_url =#{backendurl}#
Магический шаблон облака.
Мы создадим файл с именем Serverless.template (Классическое название для шаблона облачной информации YAML/JSON), которое мы будем использовать в трубопроводе позже.
Шаблон начинается с 3 параметров, которые нам нужны: BucketName, HostedZone Route53 и сертификат I D Мы создали ранее.
Parameters: BucketName: Type: String Description: The name for the bucket that will be deployed HostedZone: Type: String Description: The DNS name of an existing Amazon Route 53 hosted zone AllowedPattern: (?!-)[a-zA-Z0-9-.]{1,63}(?
Сопоставление суффикс для веб -сайта S3
Mappings: RegionS3Suffix: eu-central-1: Suffix: .s3-website.eu-central-1.amazonaws.com
Обратите внимание, что мое ведро находится в ЕС-Централе-1. Вы можете выбрать область ваших предпочтений.
Ресурсы (фактическая инфра)
Resources: S3BucketForWebApp: Type: AWS::S3::Bucket Properties: AccessControl: PublicRead BucketName: !Ref BucketWebSiteName WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html AppCDNDistribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: Comment: CDN for S3-backed spa Aliases: - !Join ['', [!Ref 'AWS::StackName', ., !Ref 'HostedZone']] Enabled: 'true' DefaultCacheBehavior: ForwardedValues: QueryString: 'true' TargetOriginId: only-origin ViewerProtocolPolicy: allow-all DefaultRootObject: index.html Origins: - CustomOriginConfig: HTTPPort: '80' HTTPSPort: '443' OriginProtocolPolicy: http-only DomainName: !Join ['', [!Ref 'S3BucketForWebApp', !FindInMap [RegionS3Suffix, !Ref 'AWS::Region', Suffix]]] Id: only-origin ViewerCertificate: AcmCertificateArn: !Sub 'arn:aws:acm:us-east-1:[your-aws-account-id]:certificate/${CertificateId}' MinimumProtocolVersion: 'TLSv1' SslSupportMethod: 'sni-only' WebsiteDNSRecord: Type: AWS::Route53::RecordSet Properties: HostedZoneName: !Join ['', [!Ref 'HostedZone', .]] Comment: CNAME redirect custom name to CloudFront distribution Name: !Join ['', [!Ref 'AWS::StackName', ., !Ref 'HostedZone']] Type: CNAME TTL: '180' ResourceRecords: - !GetAtt [AppCDNDistribution, DomainName]
Выходы стека
Outputs: WebsiteURL: Value: !Join ['', ['http://', !Ref 'WebsiteDNSName']] Description: The URL of the newly created website BucketName: Value: !Ref 'S3BucketForWebsiteContent' Description: Name of S3 bucket to hold website content CloudFrontDistributionID: Description: 'CloudFront distribution ID' Value: !Ref WebsiteCDN
Полную версию шаблона можно найти в Это GitHub Repo
ОК, коммит, толкай и …?
Пришло время надеть шляпу DevOps и настроить трубопровод.
Строить трубопровод
В Azure DevOps мы создадим конвейер сборки, который в основном копирует содержание папки нашего приложения в артефакт Drop. Задача копии следующим образом:
И публикация артефакта, как обычно,: Путь к публикации: $ (Build. Artifactstagingdirectory) Имя артефакта: Drop
Выпустить трубопровод
Наш конвейер выпуска позаботится о следующих задачах:
1. Создать/обновить стек: Эта задача выполнит шаблон и создаст вашу инфра в AWS.
2. Замените токены в нашем env.cd Файл Эта задача заменит наши значения # {backendurl} # на значения, которые мы установили в переменных трубопровода.
3. Переименовать .env.cd к .env .env.cd станет .env Таким образом, приложение создается с правильными значениями.
4. NPM/пряжа установка Нечего сказать.
5. NPM/пряжа Run Build Такой же.
6. Очистите ведро Чтобы избежать ненужных дополнительных затрат на хранение неиспользованных файлов.
7. Загрузите новую скомпилированную версию в ведро Это в основном копирует скомпилированную папку «dist» на ведро S3
8. Допустить кеш Cloudfront Кэш CloudFront поддерживает 24 HS, поэтому в случае, если вы обновляете свое приложение, а файлы больше не существуют, он попытается обслужить их. Вы аннулируете кэш, поэтому CloudFront правильно получает вновь обновленные файлы.
Подводя итог, так будет выглядеть ваш трубопровод:
Пример YAML для каждой задачи можно найти здесь
Хорошо, как только вы создали задачи, вы можете создать группу задач, чтобы повторно использовать свои задачи на каждый этап. После создания этапов выпуска трубопровод будет выглядеть так:
Я надеюсь, что это было полезным, ребята, спасибо за чтение и наслаждайтесь вашим путешествием по кодированию!
Оригинал: «https://dev.to/augusto_chirico/create-and-deploy-a-vue-spa-to-s3-cloudfront-using-a-multi-stage-pipeline-in-azure-devops-and-aws-cloudformation-1jed»