[
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.
Архітектура 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 🚀
Скопіюйте ідентифікатор облікового запису, перейдіть до налаштувань безпеки та створіть ключі доступу.
Консоль 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-адресу до таблиць маршрутизації. Переконайтеся, що база даних доступна для публічного доступу.
Панель управління RDS
Тепер натисніть на групу безпеки та виконайте наступні кроки.
Групи безпеки
Натисніть "Edit inbound rules"
Правила входу
І додайте вашу IP-адресу тут
Правила входу
Якщо база даних досі недоступна з вашої локальної машини, виконайте додаткові кроки для додавання IP-адреси до таблиці маршрутизації.
Натисніть на підмережу, показану на попередній фігурі, знайдіть таблицю маршрутизації, натисніть "Edit routes" і додайте вашу IP-адресу. Ви можете знайти свою IP-адресу за посиланням
https://whatismyipaddress.com/
Маршрути
Тепер ви можете отримати доступ до вашої бази даних з локальної машини.
Менеджер секретів
Ви можете знайти облікові дані екземпляра 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 і натисніть кнопку запиту. Вас попросять ввести ваш домен і налаштувати деякі параметри сертифіката.
Ви побачите сертифікат, який створено, але він буде в статусі очікування.
Сертифікат
Скопіюйте значення CNAME і CNAME, і додайте їх до записів вашого домену.
Тепер давайте увімкнемо HTTPS для автоматично згенерованого посилання Elastic Beanstalk, а потім використаємо користувацький домен для Elastic Beanstalk.
Відкрийте середовище Elastic Beanstalk, перейдіть до налаштувань трафіку і масштабування екземплярів, у меню конфігурації і додайте HTTPS прослуховувачі.
HTTPS прослуховувач
Заповніть форму вище і виберіть сертифікат, який ви щойно згенерували.
Щоб оновити політику безпеки за допомогою консолі:
- Відкрийте консоль Amazon EC2 за адресою https://console.aws.amazon.com/ec2/.
- У навігаційній панелі виберіть Load Balancers.
- Виберіть балансувальник навантаження, прокрутіть до самого низу, натисніть "Manage Listeners" і додайте наступне налаштування
Правило для Security Group балансувальника навантаження:
HTTPS 443 HTTP 80
Тепер ваш сайт має бути доступним через HTTPS.
Користувацьке ім’я домену за допомогою AWS Route 53
Знайдіть "Route 53" в консолі AWS, перейдіть до хостинг-зон через меню і натисніть "Create a hosted zone".
Хостинг-зона
Ви побачите список значень, до яких потрібно спрямувати трафік, скопіюйте всі 4 значення і додайте їх до списку DNS вашого домену.
Хостинг-зона
Панель Namecheap
Тепер створіть новий запис, додайте піддомен для вашого екземпляра Elastic Beanstalk, виберіть ваш додаток і натисніть кнопку "Submit". Залежно від вашого постачальника доменів це може зайняти деякий час, але після цього ви побачите, як трафік з Elastic Beanstalk буде направлений на цей піддомен, або, якщо ви не писали піддомен, він буде перенаправлений безпосередньо на корінь домену.
Створення запису
Вітаємо, ваші 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 тільки.
Розподілення CloudFront
Дотримуйтесь цих налаштувань в стандартній кеш-поведінці та натискайте "Create Distribution".
Стандартна кеш-поведінка
Згенерується доменне ім’я 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