Compare commits
2 Commits
dd99d32191
...
229b2d9ddc
Author | SHA1 | Date | |
---|---|---|---|
|
229b2d9ddc | ||
|
ebcdad41fc |
3
.env.example
Normal file
3
.env.example
Normal file
@ -0,0 +1,3 @@
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_SESSION_TOKEN=
|
39
README.md
Normal file
39
README.md
Normal file
@ -0,0 +1,39 @@
|
||||
# Chmury aws
|
||||
|
||||
W repozytorium znajdują się rozwiązania do zadań 4.1, 4.2, 4.3 z przedmiotu Praktyczne Zastosowania Chmury Obliczeniowej.
|
||||
|
||||
## Instrukcja uruchomienia
|
||||
|
||||
1. Należy sklonować repozytorium.
|
||||
|
||||
```bash
|
||||
git clone https://git.wmi.amu.edu.pl/s464979/chmury-aws.git
|
||||
```
|
||||
|
||||
2. Stwórz plik `.env` na podstawie pliku .env.example.
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
a następnie uzupełnij dane dostępowe do AWS w nowo powstałym pliku.
|
||||
|
||||
|
||||
3. Nadaj uprawnienia do uruchomienia skryptu `deploy.sh`.
|
||||
|
||||
```bash
|
||||
chmod +x deploy.sh
|
||||
```
|
||||
|
||||
2. Uruchom skrypt `deploy.sh`.
|
||||
|
||||
```bash
|
||||
./deploy.sh
|
||||
```
|
||||
|
||||
Program wypisze na ekranie adres load balancer w postaci:
|
||||
|
||||
```
|
||||
Load Balancer DNS: {unikalny url}.elb.us-east-1.amazonaws.com
|
||||
```
|
||||
|
||||
Po pomyślnym zakończeniu skryptu, aplikacja będzie dostępna pod adresem `http://{adres_ip}:8080/factors/{int}` (uruchomienie i automatyczna konfiguracja serwerów zajmuje kilka minut, należy odczekać wskazany czas przed przejściem na wskazany adres).
|
198
aws_4.py
Normal file
198
aws_4.py
Normal file
@ -0,0 +1,198 @@
|
||||
import boto3
|
||||
import base64
|
||||
from dotenv import load_dotenv
|
||||
import os
|
||||
|
||||
load_dotenv()
|
||||
|
||||
PREFIX = "464979"
|
||||
REGION = "us-east-1"
|
||||
AMI_ID = "ami-0b5eea76982371e91"
|
||||
REPO_URL = "https://git.wmi.amu.edu.pl/s464979/chmury-aws.git"
|
||||
INSTANCE_TYPE = "t2.micro"
|
||||
|
||||
aws_access_key_id = os.getenv("AWS_ACCESS_KEY_ID")
|
||||
aws_secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")
|
||||
aws_session_token = os.getenv("AWS_SESSION_TOKEN")
|
||||
|
||||
user_data_script = f"""#!/bin/bash
|
||||
sudo yum update -y
|
||||
sudo yum install -y git
|
||||
cd /home/ec2-user
|
||||
git clone {REPO_URL}
|
||||
cd chmury-aws
|
||||
chmod +x webservice
|
||||
./webservice
|
||||
"""
|
||||
|
||||
ec2_client = boto3.client(
|
||||
'ec2',
|
||||
region_name=REGION,
|
||||
aws_access_key_id=aws_access_key_id,
|
||||
aws_secret_access_key=aws_secret_access_key,
|
||||
aws_session_token=aws_session_token,
|
||||
)
|
||||
|
||||
elbv2 = boto3.client(
|
||||
'elbv2',
|
||||
region_name=REGION,
|
||||
aws_access_key_id=aws_access_key_id,
|
||||
aws_secret_access_key=aws_secret_access_key,
|
||||
aws_session_token=aws_session_token,
|
||||
)
|
||||
|
||||
autoscaling = boto3.client(
|
||||
'autoscaling',
|
||||
region_name=REGION,
|
||||
aws_access_key_id=aws_access_key_id,
|
||||
aws_secret_access_key=aws_secret_access_key,
|
||||
aws_session_token=aws_session_token,
|
||||
)
|
||||
|
||||
cloudwatch = boto3.client(
|
||||
'cloudwatch',
|
||||
region_name=REGION,
|
||||
aws_access_key_id=aws_access_key_id,
|
||||
aws_secret_access_key=aws_secret_access_key,
|
||||
aws_session_token=aws_session_token,
|
||||
)
|
||||
|
||||
vpc_cidr = '10.0.0.0/16'
|
||||
vpc_response = ec2_client.create_vpc(CidrBlock=vpc_cidr)
|
||||
vpc_id = vpc_response['Vpc']['VpcId']
|
||||
ec2_client.modify_vpc_attribute(VpcId=vpc_id, EnableDnsSupport={'Value': True})
|
||||
ec2_client.modify_vpc_attribute(VpcId=vpc_id, EnableDnsHostnames={'Value': True})
|
||||
ec2_client.create_tags(Resources=[vpc_id], Tags=[{'Key': 'Name', 'Value': PREFIX + '-vpc'}])
|
||||
|
||||
ig_response = ec2_client.create_internet_gateway()
|
||||
ig_id = ig_response['InternetGateway']['InternetGatewayId']
|
||||
ec2_client.attach_internet_gateway(InternetGatewayId=ig_id, VpcId=vpc_id)
|
||||
|
||||
subnet_cidr = '10.0.1.0/24'
|
||||
subnet_response = ec2_client.create_subnet(CidrBlock=subnet_cidr, VpcId=vpc_id)
|
||||
subnet_id = subnet_response['Subnet']['SubnetId']
|
||||
ec2_client.modify_subnet_attribute(SubnetId=subnet_id, MapPublicIpOnLaunch={'Value': True})
|
||||
ec2_client.create_tags(Resources=[subnet_id], Tags=[{'Key': 'Name', 'Value': PREFIX + '-subnet'}])
|
||||
|
||||
rt_response = ec2_client.create_route_table(VpcId=vpc_id)
|
||||
rt_id = rt_response['RouteTable']['RouteTableId']
|
||||
ec2_client.create_route(RouteTableId=rt_id, DestinationCidrBlock='0.0.0.0/0', GatewayId=ig_id)
|
||||
ec2_client.associate_route_table(RouteTableId=rt_id, SubnetId=subnet_id)
|
||||
|
||||
key_pair = ec2_client.create_key_pair(KeyName=PREFIX + '-key', KeyType='ed25519')
|
||||
|
||||
sg_response = ec2_client.create_security_group(
|
||||
Description=PREFIX + '-sg',
|
||||
GroupName=PREFIX + '-sg',
|
||||
VpcId=vpc_id
|
||||
)
|
||||
sg_id = sg_response['GroupId']
|
||||
|
||||
ec2_client.authorize_security_group_ingress(
|
||||
GroupId=sg_id,
|
||||
IpPermissions=[{
|
||||
'IpProtocol': 'tcp',
|
||||
'FromPort': 8080,
|
||||
'ToPort': 8080,
|
||||
'IpRanges': [{'CidrIp': '0.0.0.0/0'}]
|
||||
}]
|
||||
)
|
||||
|
||||
tg_response = elbv2.create_target_group(
|
||||
Name=PREFIX + '-TargetGroup',
|
||||
Protocol='TCP',
|
||||
Port=8080,
|
||||
VpcId=vpc_id,
|
||||
TargetType='instance',
|
||||
IpAddressType='ipv4',
|
||||
)
|
||||
tg_arn = tg_response['TargetGroups'][0]['TargetGroupArn']
|
||||
|
||||
alloc_response = ec2_client.allocate_address(Domain='vpc')
|
||||
allocation_id = alloc_response['AllocationId']
|
||||
|
||||
nlb_response = elbv2.create_load_balancer(
|
||||
Name=PREFIX + '-LoadBalancer',
|
||||
SubnetMappings=[{'SubnetId': subnet_id, 'AllocationId': allocation_id}],
|
||||
Scheme='internet-facing',
|
||||
Type='network',
|
||||
IpAddressType='ipv4',
|
||||
)
|
||||
lb_arn = nlb_response['LoadBalancers'][0]['LoadBalancerArn']
|
||||
lb_dns = nlb_response['LoadBalancers'][0]['DNSName']
|
||||
|
||||
elbv2.create_listener(
|
||||
LoadBalancerArn=lb_arn,
|
||||
Protocol='TCP',
|
||||
Port=8080,
|
||||
DefaultActions=[{
|
||||
'Type': 'forward',
|
||||
'TargetGroupArn': tg_arn,
|
||||
}],
|
||||
)
|
||||
|
||||
lt_response = ec2_client.create_launch_template(
|
||||
LaunchTemplateName=PREFIX + '-LT',
|
||||
LaunchTemplateData={
|
||||
'ImageId': AMI_ID,
|
||||
'InstanceType': INSTANCE_TYPE,
|
||||
'KeyName': PREFIX + '-key',
|
||||
'SecurityGroupIds': [sg_id],
|
||||
'UserData': base64.b64encode(user_data_script.encode('utf-8')).decode('utf-8'),
|
||||
}
|
||||
)
|
||||
|
||||
asg_name = PREFIX + '-ASG'
|
||||
autoscaling.create_auto_scaling_group(
|
||||
AutoScalingGroupName=asg_name,
|
||||
LaunchTemplate={
|
||||
'LaunchTemplateId': lt_response['LaunchTemplate']['LaunchTemplateId'],
|
||||
'Version': '$Latest'
|
||||
},
|
||||
MinSize=2,
|
||||
MaxSize=5,
|
||||
DesiredCapacity=2,
|
||||
VPCZoneIdentifier=subnet_id,
|
||||
TargetGroupARNs=[tg_arn],
|
||||
HealthCheckType='EC2',
|
||||
HealthCheckGracePeriod=90,
|
||||
Tags=[
|
||||
{
|
||||
'Key': 'Name',
|
||||
'Value': PREFIX + '-instance',
|
||||
'PropagateAtLaunch': True
|
||||
}
|
||||
]
|
||||
)
|
||||
|
||||
scale_out_response = autoscaling.put_scaling_policy(
|
||||
AutoScalingGroupName=asg_name,
|
||||
PolicyName= PREFIX + '-ScaleOutPolicy',
|
||||
PolicyType='SimpleScaling',
|
||||
AdjustmentType='ChangeInCapacity',
|
||||
ScalingAdjustment=1,
|
||||
Cooldown=180
|
||||
)
|
||||
scale_out_policy_arn = scale_out_response['PolicyARN']
|
||||
|
||||
cloudwatch.put_metric_alarm(
|
||||
AlarmName= PREFIX + '-HighCPU-Alarm',
|
||||
ComparisonOperator='GreaterThanThreshold',
|
||||
EvaluationPeriods=2,
|
||||
MetricName='CPUUtilization',
|
||||
Namespace='AWS/EC2',
|
||||
Period=60,
|
||||
Statistic='Average',
|
||||
Threshold=30.0, # Zmienić jeśli potrzeba późniejszego skalowania
|
||||
ActionsEnabled=True,
|
||||
AlarmActions=[scale_out_policy_arn],
|
||||
Dimensions=[
|
||||
{
|
||||
'Name': 'AutoScalingGroupName',
|
||||
'Value': asg_name
|
||||
},
|
||||
],
|
||||
Unit='Percent'
|
||||
)
|
||||
|
||||
print(f"Load Balancer DNS: {lb_dns}")
|
7
deploy.sh
Normal file
7
deploy.sh
Normal file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
chmod +x aws_4.py.py
|
||||
|
||||
pip install boto3 os load_dotenv base64
|
||||
|
||||
python3 aws_4.py.py
|
1215
tester.ipynb
Normal file
1215
tester.ipynb
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user