Розгортання вашого веб-додатку на стадію тестування та в продакшн з використанням Elastic Beanstalk, AWS CDK, CloudFront та пайплайнів CircleCI

[

GitHub - muhammadqazi/aws-deploy: Демонстрація використання AWS CDK Pipelines та Elastic…

Демонстрація використання AWS CDK Pipelines та Elastic Beanstalk для розгортання веб-застосунку та прискорення процесу розробки та розгортання.

github.com

](https://github.com/muhammadqazi/aws-deploy?source=post_page-----c9a42bc98c10--------------------------------)

Демонстрація використання AWS CDK Pipelines та Elastic Beanstalk для розгортання веб-застосунку та прискорення процесу розробки та розгортання.

У другій частині посібника я покажу, як розгорнути застосунок на React/Next.js на s3 та Cloudfront.

В кінці ми створимо CI/CD пайплайни на CircleCI для автоматичного розгортання нашого застосунку на staging або production та налаштуємо моніторинг логів через Papertrail для нашого застосунку на Elastic Beanstalk.

pic

Архітектура AWS

AWS Elastic Beanstalk надає рішення для цього. Це зручний сервіс для розгортання та масштабування веб-застосунків та сервісів. Підтримуючи різні мови програмування та серверні конфігурації (Java, .NET, PHP, Node.js, Python, Ruby, Go, і Docker з такими серверами, як Apache, Nginx, Passenger, IIS), Elastic Beanstalk спрощує розгортання, приймаючи один ZIP або WAR файл. Система автоматизує такі завдання, як надання потужностей, балансування навантаження, авто-масштабування та моніторинг стану застосунку, при цьому надаючи нам контроль над основними ресурсами AWS.

У цьому посібнику ми навчимося:

  • Розгортати веб-застосунок, створюючи середовище Elastic Beanstalk та налаштовуючи його параметри.
  • Налаштовувати екземпляр RDS для розміщення реляційної бази даних вашого застосунку з бажаним движком та параметрами безпеки.
  • Керувати DNS записами вашого домену та хостинг-зонами на Route 53 для ефективного вирішення домену.
  • Прискорити доставку контенту та знизити латентність, створивши розподіл CloudFront, налаштувавши джерела та асоціюючи його з середовищем Elastic Beanstalk.
  • Ізолювати та контролювати вашу мережу, налаштовуючи Virtual Private Cloud з правильними підмережами, таблицями маршрутизації та інтернет-шлюзами.
  • Визначати групи безпеки для сервісів, таких як Elastic Beanstalk та RDS, для безпечного контролю вхідного та вихідного трафіку.
  • Захистити ваш домен за допомогою SSL/TLS сертифікатів від AWS Certificate Manager, асоціюючи їх з вашим розподілом CloudFront та середовищем Elastic Beanstalk.
  • Безпечно зберігати та керувати чутливою інформацією, такою як облікові дані бази даних, використовуючи AWS Secrets Manager та інтегруючи це з вашим середовищем Elastic Beanstalk.
  • Створювати та налаштовувати S3 бакети для зберігання статичних активів, резервних копій та інших необхідних файлів з належними контролями доступу.
  • Автоматизувати ваші процеси побудови та розгортання, налаштовуючи Circle CI з файлом .circleci/config.yml та інтегруючи його з вашою системою контролю версій.
  • Вказати ваш домен для AWS, оновивши DNS записи на Namecheap та асоціюючи домен з вашими ресурсами AWS.

Elastic Beanstalk

Платформа як послуга (PaaS), що надається AWS для спрощення розгортання та управління застосунками.
Він автоматично керує розгортанням інфраструктури, масштабуванням потужностей, балансуванням навантаження та моніторингом стану застосунку.

Ви можете вручну створити додаток Elastic Beanstalk, слідуючи посібнику AWS
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/GettingStarted.CreateApp.html

RDS

Керована служба баз даних, що спрощує налаштування, експлуатацію та масштабування реляційних баз даних, таких як MySQL, PostgreSQL та інші.

Ви можете вручну створити RDS, слідуючи посібнику AWS
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html

Зосередимося на створенні додатку Elastic Beanstalk, RDS та VPC за допомогою AWS CDK 🚀
Скопіюйте ідентифікатор облікового запису, перейдіть до налаштувань безпеки та створіть ключі доступу.

pic

Консоль AWS

Скопіюйте ваші ключі доступу та додайте їх до файлу ~/.aws/config

[aws-deploy]  
aws_access_key_id = YOUR_ACCESS_KEY_ID  
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

Будь ласка, встановіть конкретну версію CDK, щоб вона відповідала залежностям, які будуть встановлені пізніше.

Приклад:

yarn add [email protected]

Ініціалізуйте CDK додаток, який ми будемо використовувати для створення інфраструктури.

npx cdk init app --language typescript

Створення стеків ресурсів у CloudFormation

Ми збираємося видалити стандартний файл, створений CDK, і визначити наш код для всіх стеків ресурсів Elastic Beanstalk, RDS та VPC.

Додайте наступний код до /lib як elbtest-stack.ts, rds-infrastructure.ts та vpc-stack.ts відповідно.

1) ElbtestStack (Стек Elastic Beanstalk):

Нижче наведений скрипт AWS CDK визначає стек AWS CloudFormation для середовища Elastic Beanstalk. Він включає створення S3-активу з вказаного каталогу, що містить код застосунку, додаток Elastic Beanstalk, версію застосунку, прив'язану до S3-активу, а також необхідні ролі IAM та профілі екземплярів. Також налаштовуються параметри, такі як налаштування групи авто-масштабування та властивості середовища.

import * as cdk from '@aws-cdk/core'  
import * as s3assets from '@aws-cdk/aws-s3-assets'  
import * as elasticbeanstalk from '@aws-cdk/aws-elasticbeanstalk'  
import * as iam from '@aws-cdk/aws-iam'  


export interface EBEnvProps extends cdk.StackProps {  
 // Налаштування групи авто-масштабування  
 minSize?: string;  
 maxSize?: string;  
 instanceTypes?: string;  
 envName?: string;  

}  

export class ElbtestStack extends cdk.Stack {  
 constructor(scope: cdk.Construct, id: string, props?: EBEnvProps) {  
 super(scope, id, props);  

 // Код, який визначає ваш стек тут  

 // Створення S3-активу Zip з каталогу.  
 const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {  
 path: `${__dirname}/YOUR_SRC_DIR`,  
 });  

 // Створення додатку ElasticBeanStalk.  

const appName = 'YOUR_DB';  
 const app = new elasticbeanstalk.CfnApplication(this, 'Application', {  
 applicationName: appName,  
 });  

 // Створіть версію додатку з раніше визначеного S3-активу  
 const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {  
 applicationName: appName,  
 sourceBundle: {  
 s3Bucket: webAppZipArchive.s3BucketName,  
 s3Key: webAppZipArchive.s3ObjectKey,  
 },  
 });  

 // Переконайтеся, що додаток Elastic Beanstalk існує перед створенням версії додатку  
 appVersionProps.addDependsOn(app);  

 // Створіть роль та профіль екземпляра  
 const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {  
 assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),  
 });  

 const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')  
 myRole.addManagedPolicy(managedPolicy);  

 const myProfileName = `${appName}-InstanceProfile`  

 const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {  
 instanceProfileName: myProfileName,  
 roles: [  
 myRole.roleName  
 ]  
 });  

 // Приклад деяких опцій, які можна налаштувати  
 const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [  
 {  
 namespace: 'aws:autoscaling:launchconfiguration',  
 optionName: 'IamInstanceProfile',  
 value: myProfileName,  
 },  
 {  
 namespace: 'aws:autoscaling:asg',  
 optionName: 'MinSize',  
 value: props?.maxSize ?? '1',  
 },  
 {  
 namespace: 'aws:autoscaling:asg',  
 optionName: 'MaxSize',  
 value: props?.maxSize ?? '1',  
 },  
 {  
 namespace: 'aws:ec2:instances',  
 optionName: 'InstanceTypes',  
 value: props?.instanceTypes ?? 't2.micro',  
 },  
 ];  


 // Створіть середовище Elastic Beanstalk для запуску додатку  
 const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {  
 environmentName: props?.envName ?? `${appName}-env`,  
 applicationName: app.applicationName || appName,  
 solutionStackName: '64bit Amazon Linux 2023 v6.0.4 running Node.js 18',  
 optionSettings: optionSettingProperties,  
 versionLabel: appVersionProps.ref,  
 });  
 }  
}

Переконайтеся, що замінили каталог з вихідним кодом додатку на правильний. Цей код також можна знайти у моєму репозиторії на GitHub

https://github.com/muhammadqazi/aws-deploy

2) RdsStack (Стек RDS для бази даних):

Нижче наведений скрипт створює екземпляр Amazon RDS (Relational Database Service) в рамках стека AWS CDK. Він приймає Virtual Private Cloud (VPC) та групу безпеки як вхідні параметри, генерує секрет для облікових даних бази даних за допомогою AWS Secrets Manager і створює екземпляр RDS, налаштований для MySQL.
Скрипт також створює параметр AWS Systems Manager (SSM), що містить ARN згенерованого секрету для облікових даних бази даних.

import * as cdk from '@aws-cdk/core'  
import * as ec2 from '@aws-cdk/aws-ec2'  
import * as rds from '@aws-cdk/aws-rds'  
import * as secretsmanager from '@aws-cdk/aws-secretsmanager';  
import * as ssm from '@aws-cdk/aws-ssm'  
import { ISecurityGroup, IVpc } from '@aws-cdk/aws-ec2';  
import { Secret } from '@aws-cdk/aws-secretsmanager';  

interface RdsStackProps extends cdk.StackProps {  
 myVpc: ec2.IVpc;  
 rdsSecurityGroup: ec2.ISecurityGroup;  
}  

export class RdsStack extends cdk.Stack {  
 readonly myRdsInstance: rds.DatabaseInstance;  
 readonly databaseCredentialsSecret: Secret;  

 constructor(scope: cdk.Construct, id: string, props?: RdsStackProps) {  
 super(scope, id, props);  

 const databaseUsername = process.env.DB_USERNAME;  

 const applicationName = 'APP_NAME';  
 this.databaseCredentialsSecret = new secretsmanager.Secret(this, 'DBCredentialsSecret', {  
 secretName: `${applicationName}-db-credentials`,  
 generateSecretString: {  
 secretStringTemplate: JSON.stringify({  
 username: databaseUsername  
 }),  
 excludePunctuation: true,  
 includeSpace: false,  
 generateStringKey: 'password',  
 }  
 });  

 new ssm.StringParameter(this, 'DBCredentialsArn', {  
 parameterName: `${applicationName}-db-credentials-arn`,  
 stringValue: this.databaseCredentialsSecret.secretArn,  
 });  

 this.myRdsInstance = new rds.DatabaseInstance(this, 'MyDatabaseInstance', {  
 publiclyAccessible: true,  
 engine: rds.DatabaseInstanceEngine.mysql({  
 version: rds.MysqlEngineVersion.VER_5_7,  
 }),  
 instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.SMALL),  
 vpc: props?.myVpc as IVpc,  
 securityGroups: [props?.rdsSecurityGroup as ISecurityGroup],  
 allocatedStorage: 20,  
 databaseName: 'DB_NAME_HERE',  
 storageEncrypted: true,  
 });  
 }  
}

Не забудьте замінити ім'я згідно з вашим додатком вище.

3) VpcStack (Стек Virtual Private Cloud):

Нижче наведений скрипт AWS CDK визначає стек VPC з кількома підмережами для вигаданого додатку з іменем "YOURAPPNAME". Він створює VPC з публічними, приватними та ізольованими підмережами, налаштовує шлюзовий кінцевий пункт для Amazon S3 в приватній підмережі та налаштовує групи безпеки для хоста Bastion, Elastic Load Balancer (ELB), Auto Scaling Group (ASG), екземпляра RDS і екземпляра ElastiCache.
Правила вхідного та вихідного трафіку між цими групами безпеки визначаються для контролю потоку трафіку всередині VPC.

import * as cdk from '@aws-cdk/core';  
import * as ec2 from '@aws-cdk/aws-ec2';  
import { SecurityGroup, GatewayVpcEndpointAwsService } from '@aws-cdk/aws-ec2';  

export class VpcStack extends cdk.Stack {  
 readonly myVpc: ec2.IVpc;  
 readonly bastionHostSecurityGroup: SecurityGroup;  
 readonly elbSecurityGroup: SecurityGroup;  
 readonly asgSecurityGroup: SecurityGroup;  
 readonly rdsSecurityGroup: SecurityGroup;  
 readonly elastiCacheSecurityGroup: SecurityGroup;  

 constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {  
 super(scope, id, props);  
 const applicationName = 'APP_NAME_HERE';  
 this.myVpc = new ec2.Vpc(this, `${applicationName}-vpc`, {  
 cidr: process.env.VPC_CIDR,  
 maxAzs: 4,  
 natGateways: 1,  
 vpnGateway: true,  
 subnetConfiguration: [  
 {  
 subnetType: ec2.SubnetType.PUBLIC,  
 name: 'Public',  
 cidrMask: 20,  
 },  
 {  
 subnetType: ec2.SubnetType.PRIVATE,  
 name: 'Application',  
 cidrMask: 20,  
 },  
 {  
 subnetType: ec2.SubnetType.ISOLATED,  
 name: 'Database',  
 cidrMask: 24,  
 }  
 ]  
 });  

 this.myVpc.addGatewayEndpoint('s3-gateway', {  
 service: GatewayVpcEndpointAwsService.S3,  
 subnets: [{  
 subnetType: ec2.SubnetType.PRIVATE  
 }]  
 })  

 this.bastionHostSecurityGroup = new SecurityGroup(this, 'bastionHostSecurityGroup', {  
 allowAllOutbound: true,  
 securityGroupName: 'bastion-sg',  
 vpc: this.myVpc,  
 });  

 this.elbSecurityGroup = new SecurityGroup(this, 'elbSecurityGroup', {  
 allowAllOutbound: true,  
 securityGroupName: 'elb-sg',  
 vpc: this.myVpc,  
 });  

 this.elbSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(80));  
 this.elbSecurityGroup.addIngressRule(ec2.Peer.anyIpv6(), ec2.Port.tcp(80));  

 this.asgSecurityGroup = new SecurityGroup(this, 'asgSecurityGroup', {  
 allowAllOutbound: false,  
 securityGroupName: 'asg-sg',  
 vpc: this.myVpc,  
 });  

 this.asgSecurityGroup.connections.allowFrom(this.elbSecurityGroup, ec2.Port.tcp(80), 'Application Load Balancer Security Group');  
 this.asgSecurityGroup.connections.allowFrom(this.bastionHostSecurityGroup, ec2.Port.tcp(22), 'Allows connections from bastion hosts');  

 this.rdsSecurityGroup = new SecurityGroup(this, 'rdsSecurityGroup', {  
 allowAllOutbound: false,  
 securityGroupName: 'rds-sg',  
 vpc: this.myVpc,  
 })  

 this.rdsSecurityGroup.connections.allowFrom(this.asgSecurityGroup, ec2.Port.tcp(3306), 'Allow connections from eb Auto Scaling Group Security Group');  
 this.rdsSecurityGroup.connections.allowFrom(this.bastionHostSecurityGroup, ec2.Port.tcp(3306), 'Allow connections from bastion hosts');  

 this.elastiCacheSecurityGroup = new SecurityGroup(this, 'elastiCacheSecurityGroup', {  
 allowAllOutbound: false,  
 securityGroupName: 'elasti-sg',  
 vpc: this.myVpc,  
 });  

 this.elastiCacheSecurityGroup.connections.allowFrom(this.asgSecurityGroup, ec2.Port.tcp(6379), 'Allow connections from eb Auto Scaling Security Group');  
 }  
}

Не забудьте замінити ім’я відповідно до вашого додатку вище.

Останнім кроком, додайте наступний код до /bin як aws-deploy.ts

#!/usr/bin/env node  
import * as dotenv from 'dotenv';  
import 'source-map-support/register';  
import * as cdk from '@aws-cdk/core';  
import { ElbtestStack } from '../lib/elbtest-stack';  
import { RdsStack } from '../lib/rds-infrastructure';  
import { VpcStack } from '../lib/vpc-stack';  

dotenv.config()  
const app = new cdk.App();  

const env = {  
 account: process.env.AWS_ACCOUNT_ID,  
 region: process.env.AWS_REGION,  
}  

const vpcStack = new VpcStack(app, 'VpcStack', { env: env });  
const rdsStack = new RdsStack(app, 'RdsStack', { env: env , myVpc: vpcStack.myVpc, rdsSecurityGroup: vpcStack.rdsSecurityGroup });  
const ebStack = new ElbtestStack(app, 'ElbtestStack', { env: env });  

rdsStack.addDependency(vpcStack);  

ebStack.addDependency(rdsStack);  

app.synth();

Вищезазначений скрипт служить точкою входу для розгортання стеків AWS CloudFormation за допомогою AWS Cloud Development Kit (CDK).
Він починається з налаштування середовища з необхідними модулями, завантаження змінних середовища та ініціалізації додатка CDK. Далі визначаються три стекі, які представляють VPC, базу даних RDS та Elastic Beanstalk, між якими встановлюються зв'язки та залежності для забезпечення правильного порядку розгортання. Скрипт завершується синтезом шаблонів CloudFormation для розгортання. Загалом, він оркеструє розгортання комплексної інфраструктури AWS, включаючи мережу, реляційну базу даних та масштабоване середовище додатка.

Вам потрібно буде встановити кілька додаткових залежностей, додайте їх за допомогою наступної команди

$ yarn add @aws-cdk/aws-elasticbeanstalk @aws-cdk/aws-s3-assets dotenv

Також потрібно буде підготувати CloudFormation, якщо це ваш перший запуск

cdk bootstrap --profile aws-deploy

Далі для побудови та створення шаблону CloudFormation:

yarn build && cdk synth --all --profile aws-deploy

Вищезазначений профіль — це ім'я, яке ви додаєте у файл ~/.aws/config.

Нарешті, давайте розгорнемо стек,

yarn build && cdk deploy --all --profile aws-deploy

Це може зайняти деякий час, тож будьте терплячі.

Доступ до RDS з локальної машини

Вам потрібно буде внести деякі зміни в групи безпеки для доступу до бази даних RDS з вашої локальної машини через Beekeeper або SQL workbench.

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

Вам потрібно буде додати IP-адресу вашої машини до груп безпеки, а іноді також додати IP-адресу до таблиць маршрутизації. Переконайтеся, що база даних доступна для публічного доступу.

pic

Панель управління RDS

Тепер натисніть на групу безпеки та виконайте наступні кроки.

pic

Групи безпеки

Натисніть "Edit inbound rules"

pic

Правила входу

І додайте вашу IP-адресу тут

pic

Правила входу

Якщо база даних досі недоступна з вашої локальної машини, виконайте додаткові кроки для додавання IP-адреси до таблиці маршрутизації.

Натисніть на підмережу, показану на попередній фігурі, знайдіть таблицю маршрутизації, натисніть "Edit routes" і додайте вашу IP-адресу. Ви можете знайти свою IP-адресу за посиланням

https://whatismyipaddress.com/

pic

Маршрути

Тепер ви можете отримати доступ до вашої бази даних з локальної машини.

pic

Менеджер секретів

Ви можете знайти облікові дані екземпляра RDS в AWS Secrets Manager.

Користувацький домен Elastic Beanstalk за допомогою Route 53

Для цього кроку вам потрібно буде створити сертифікат SSL/TLS для вашого домену за допомогою AWS Certificate Manager і додати DNS Route 53 в панелі вашого постачальника домену.
Я використовую namecheap для керування своїм доменом і зараз покажу, як це зробити.

Якщо ви хочете увімкнути HTTPS для вашого автоматично згенерованого посилання Elastic Beanstalk, ви можете виконати кілька додаткових кроків нижче.

Генерація SSL/TLS сертифікату за допомогою AWS Certificate Manager

Знайдіть "Certificate Manager" в консолі AWS і натисніть кнопку запиту. Вас попросять ввести ваш домен і налаштувати деякі параметри сертифіката.

Ви побачите сертифікат, який створено, але він буде в статусі очікування.

pic

Сертифікат

Скопіюйте значення CNAME і CNAME, і додайте їх до записів вашого домену.

Тепер давайте увімкнемо HTTPS для автоматично згенерованого посилання Elastic Beanstalk, а потім використаємо користувацький домен для Elastic Beanstalk.

Відкрийте середовище Elastic Beanstalk, перейдіть до налаштувань трафіку і масштабування екземплярів, у меню конфігурації і додайте HTTPS прослуховувачі.

pic

HTTPS прослуховувач

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

Щоб оновити політику безпеки за допомогою консолі:

  1. Відкрийте консоль Amazon EC2 за адресою https://console.aws.amazon.com/ec2/.
  2. У навігаційній панелі виберіть Load Balancers.
  3. Виберіть балансувальник навантаження, прокрутіть до самого низу, натисніть "Manage Listeners" і додайте наступне налаштування

Правило для Security Group балансувальника навантаження:

HTTPS 443 HTTP 80

Тепер ваш сайт має бути доступним через HTTPS.

Користувацьке ім’я домену за допомогою AWS Route 53

Знайдіть "Route 53" в консолі AWS, перейдіть до хостинг-зон через меню і натисніть "Create a hosted zone".

pic

Хостинг-зона

Ви побачите список значень, до яких потрібно спрямувати трафік, скопіюйте всі 4 значення і додайте їх до списку DNS вашого домену.

pic

Хостинг-зона

pic

Панель Namecheap

Тепер створіть новий запис, додайте піддомен для вашого екземпляра Elastic Beanstalk, виберіть ваш додаток і натисніть кнопку "Submit". Залежно від вашого постачальника доменів це може зайняти деякий час, але після цього ви побачите, як трафік з Elastic Beanstalk буде направлений на цей піддомен, або, якщо ви не писали піддомен, він буде перенаправлений безпосередньо на корінь домену.

pic

Створення запису

Вітаємо, ваші API успішно налаштовані та спрямовані. 🚀

Хостинг додатків Next.JS/React.JS за допомогою S3 та CloudFront

Для хостингу додатків Next.js/React.js за допомогою S3 та CloudFront, спершу розгорніть додаток Next.js за допомогою команди next build, щоб створити продакшн-готову збірку.

Далі створіть бакет Amazon S3 та завантажте вміст вихідних файлів збірки в цей бакет. Переконайтеся, що бакет має публічний доступ. Після того, як ви завантажите вміст додатка в бакет S3, перейдіть на вкладку "Properties", прокрутіть донизу, і ви побачите опцію зробити додаток статичним. Виберіть цю опцію та додайте index.js як корінь походження.
Після завершення цього кроку буде згенеровано посилання для доступу до вашого додатку.

Тепер нам потрібно додати політики бакету. Ви повинні побачити це на вкладці "Permissions", натисніть "Edit" і додайте наступні політики:

{  
 "Version": "2008-10-17",  
 "Statement": [  
 {  
 "Sid": "PublicReadGetObject",  
 "Effect": "Allow",  
 "Principal": "*",  
 "Action": "s3:GetObject",  
 "Resource": "arn:aws:s3:::BUCKET_NAME_HERE/*"  
 },  
 {  
 "Sid": "2",  
 "Effect": "Allow",  
 "Principal": {  
 "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity YOUR_IDENTITY"  
 },  
 "Action": "s3:GetObject",  
 "Resource": "arn:aws:s3:::BUCKET_NAME_HERE/*"  
 }  
 ]  
}

Тепер вам потрібна ідентичність CloudFront, перейдіть до консолі AWS і знайдіть CloudFront.

Перейдіть на вкладку безпеки, потім до доступу з боку походження (origin access), там ви зможете побачити свої ідентичності CloudFront. Скопіюйте ID і додайте його до вищезгаданої політики.

Після завершення цього кроку створіть нове розподілення для CloudFront.

Тут у домені походження потрібно додати це статичне посилання вебсайту без http:// або https://, яке було згенеровано на попередньому кроці, і вибрати HTTP тільки.

pic

Розподілення CloudFront

Дотримуйтесь цих налаштувань в стандартній кеш-поведінці та натискайте "Create Distribution".

pic

Стандартна кеш-поведінка

Згенерується доменне ім’я CloudFront, яке ви можете використовувати для доступу до вашого веб-додатку.
Щоб спрямувати трафік з користувацького домену, виконайте ті самі кроки, що і для Route 53, вибравши як походження цього разу CloudFront.

Розгортання Elastic Beanstalk на staging та production

Зараз за допомогою git ми розгорнемо наш додаток на staging та production, використовуючи CircleCI.

Спочатку додайте наступні змінні середовища до вашого додатку CircleCI.

AWS_ACCESS_KEY_ID  
AWS_SECRET_ACCESS_KEY

Створіть файл .circleci/config.yml у корені вашого проєкту і додайте наступний код. Цей код дозволить вам деплоїти додаток Elastic Beanstalk на staging або production в залежності від гілки GitHub, в яку ви пушите код.

version: 2  
jobs:  
 deploy:  
 working_directory: ~/app  
 docker:  
 - image: circleci/ruby:2.4.3  
 steps:  
 - checkout  

 - run:  
 name: Встановлення залежностей для деплою  
 working_directory: /  
 command: |  
 sudo apt-get -y -qq update  
 sudo apt-get install python3-pip python3-dev build-essential  
 sudo pip3 install awsebcli  

 - run:  
 name: Деплой  
 command: eb deploy my-app-$CIRCLE_BRANCH  

workflows:  
 version: 2  
 build:  
 jobs:  
 - deploy:  
 filters:  
 branches:  
 only:  
 - staging  
 - production

Тепер створіть файл .elasticbeanstalk/config.yml у кореневій директорії вашого проєкту і додайте наступний код. Переконайтесь, що ви змінили ім’я додатку, регіон та платформу в залежності від того, що ви розгортаєте.

branch-defaults:  
 production:  
 environment: my-app-production  
 staging:  
 environment: my-app-staging  
global:  
 application_name: my-app  
 default_platform: 64bit Amazon Linux 2 v5.8.3 running Node.js 18  
 default_region: YOUR_AWS_REGION  
 sc: git

Після першого деплою за допомогою CDK цей пайплайн буде запущений через GitHub, що автоматично збудує і розгорне додатки на Elastic Beanstalk.

Розгортання NextJS/ReactJS на staging та production

Додайте файл у директорію вашого проєкту в .circleci/config.yml, переконайтесь, що ви замінили YOURDISTRIBUTIONID на ваш власний.

version: 2.1  
jobs:  
 build:  
 working_directory: ~/repo  
 docker:  
 - image: cimg/node:21.6.0  
 steps:  
 - checkout  
 - restore_cache:  
 keys:  
 - v1-dependencies-{{ checksum "package-lock.json" }}  
 - v1-dependencies-  
 - run:  
 name: Встановлення залежностей  
 command: npm install  
 - save_cache:  
 key: v1-dependencies-{{ checksum "package-lock.json" }}  
 paths:  
 - node_modules  
 - run:  
 name: Збірка  
 command: |  
 npm run build  
 - run:  
 name: Експорт  
 no_output_timeout: 10m  
 command: npm run export  
 - run:  
 name: Деплой  
 command: |  
 if [$CIRCLE_BRANCH = 'staging']; then  
 aws s3 sync build s3://my-app-staging  
 aws cloudfront create-invalidation --distribution-id YOUR_DISTRIBUTION_ID --paths "/*"  

 fi  
 if [$CIRCLE_BRANCH = 'production']; then  
 aws s3 sync build s3://my-app-production  
 aws cloudfront create-invalidation --distribution-id YOUR_DISTRIBUTION_ID --paths "/*"  
 fi  
workflows:  
 version: 2  
 build:  
 jobs:  
 - deploy:  
 filters:  
 branches:  
 only:  
 - staging  
 - production

Після вашого першого деплою цей пайплайн буде запущений через GitHub, що автоматично збере та розгорне ваш додаток на S3 та оновить CloudFront.

Papertrail - моніторинг системи та журнали

Papertrail — це хмарна служба керування журналами та агрегації журналів, що дозволяє користувачам збирати, моніторити та аналізувати журнальні дані з різних джерел.
Це спрощує процес централізації журналів, що робить його зручнішим для розробників, системних адміністраторів та ІТ-команд для усунення проблем, моніторингу продуктивності системи та отримання інформації про поведінку їхніх додатків та інфраструктури.

[

SolarWinds Cloud

Опис змінено

papertrailapp.com

](https://papertrailapp.com/dashboard?source=post_page-----c9a42bc98c10--------------------------------)

Щоб додати Papertrail до вашого додатку на Elastic Beanstalk, спершу потрібно створити пару ключів для EC2, на який вказує ваш додаток Elastic Beanstalk.

Шукайте EC2 в консолі AWS і перейдіть до "Key Pairs" у меню "Network and Security", натисніть "Create", дайте йому ім’я, і це згенерує файл .pem для вашого екземпляра EC2.

Перейдіть до налаштувань середовища Elastic Beanstalk, відредагуйте доступ до сервісів і виберіть створену пару ключів.

ssh -i ~/Downloads/your-key.pem ec2-user@YOUR_EC2_domain

Підключіться через SSH і виконайте скрипт інсталяції Papertrail.

[

GitHub - muhammadqazi/aws-deploy: A demonstration of how to use AWS CDK Pipelines and Elastic…

A demonstration of how to use AWS CDK Pipelines and Elastic Beanstalk to deploy a web application and speed up the…

github.com

](https://github.com/muhammadqazi/aws-deploy?source=post_page-----c9a42bc98c10--------------------------------)

Успішного розгортання 🚀

Корисні посилання:

[

HTTPS не працює (на сайті на основі AWS Elastic Beanstalk)

Сайт працює добре через HTTP, але не працює через HTTPS. Я слідував усім крокам на цій сторінці, щоб…

stackoverflow.com

](https://stackoverflow.com/questions/24589413/https-not-working-on-aws-elastic-beanstalk-based-site?source=post_page-----c9a42bc98c10--------------------------------)

[

Оновлення HTTPS слухача для вашого Application Load Balancer

Дізнайтеся, як оновити налаштування безпеки для HTTPS слухача.

docs.aws.amazon.com

](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-update-certificates.html?source=post_page-----c9a42bc98c10--------------------------------)

[

DNS пошук

Інструмент для пошуку DNS знаходить IP-адресу будь-якого домену, повертаючи IP-адреси в DNS записах, отриманих від…

www.whatismyip.com

](https://www.whatismyip.com/dns-lookup/?source=post_page-----c9a42bc98c10--------------------------------)

[

Домен Namecheap не працює на AWS EC2

Я новачок в AWS і стикаюся з цією проблемою останні кілька днів. Буду вдячний за будь-яку допомогу 🙂 Я створив AWS…

stackoverflow.com

](https://stackoverflow.com/questions/62984568/namecheap-domain-not-working-on-aws-ec2-instance?source=post_page-----c9a42bc98c10--------------------------------)

https://toolbox.googleapps.com/apps/dig/#

Перекладено з: Deploy Your Web Application to staging and production with Elastic Beanstalk, AWS CDK, CloudFront, and Circleci pipelines

Leave a Reply

Your email address will not be published. Required fields are marked *