fix
This commit is contained in:
parent
5bedea67f1
commit
671ec841a7
180
main.py
180
main.py
@ -1,6 +1,8 @@
|
|||||||
import boto3
|
import boto3
|
||||||
import argparse
|
import argparse
|
||||||
import time
|
import time
|
||||||
|
import base64
|
||||||
|
from botocore.exceptions import ClientError
|
||||||
from user_data import user_data
|
from user_data import user_data
|
||||||
|
|
||||||
# Stałe
|
# Stałe
|
||||||
@ -13,6 +15,76 @@ MAX_INSTANCES = 5
|
|||||||
LOAD_BALANCER_PORT = 80
|
LOAD_BALANCER_PORT = 80
|
||||||
TARGET_PORT = 8080
|
TARGET_PORT = 8080
|
||||||
|
|
||||||
|
def clean_resources(ec2, prefix, default_vpc):
|
||||||
|
# Usuń security group
|
||||||
|
try:
|
||||||
|
security_groups = ec2.meta.client.describe_security_groups(
|
||||||
|
Filters=[{'Name': 'group-name', 'Values': [f'{prefix}-group']}]
|
||||||
|
)['SecurityGroups']
|
||||||
|
for sg in security_groups:
|
||||||
|
print(f"Usuwam Security Group: {sg['GroupId']}")
|
||||||
|
ec2.meta.client.delete_security_group(GroupId=sg['GroupId'])
|
||||||
|
except ClientError as e:
|
||||||
|
if e.response['Error']['Code'] != 'InvalidGroup.NotFound':
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Usuń key pair
|
||||||
|
try:
|
||||||
|
print(f"Usuwam Key Pair: {prefix}-key")
|
||||||
|
ec2.meta.client.delete_key_pair(KeyName=f'{prefix}-key')
|
||||||
|
except ClientError as e:
|
||||||
|
if e.response['Error']['Code'] != 'InvalidKeyPair.NotFound':
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Usuń Launch Template
|
||||||
|
try:
|
||||||
|
launch_templates = ec2.meta.client.describe_launch_templates(
|
||||||
|
Filters=[{'Name': 'launch-template-name', 'Values': [f'{prefix}-LaunchTemplate']}]
|
||||||
|
)['LaunchTemplates']
|
||||||
|
for lt in launch_templates:
|
||||||
|
print(f"Usuwam Launch Template: {lt['LaunchTemplateId']}")
|
||||||
|
ec2.meta.client.delete_launch_template(LaunchTemplateId=lt['LaunchTemplateId'])
|
||||||
|
except ClientError as e:
|
||||||
|
if e.response['Error']['Code'] != 'InvalidLaunchTemplateName.NotFound':
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Usuń Auto Scaling Group
|
||||||
|
autoscaling = boto3.client('autoscaling', region_name=REGION)
|
||||||
|
try:
|
||||||
|
autoscaling.delete_auto_scaling_group(
|
||||||
|
AutoScalingGroupName=f'{prefix}-AutoScalingGroup',
|
||||||
|
ForceDelete=True
|
||||||
|
)
|
||||||
|
print(f"Usuwam Auto Scaling Group: {prefix}-AutoScalingGroup")
|
||||||
|
except ClientError as e:
|
||||||
|
if e.response['Error']['Code'] != 'ValidationError':
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Usuń Load Balancer i Target Group
|
||||||
|
elbv2 = boto3.client('elbv2', region_name=REGION)
|
||||||
|
try:
|
||||||
|
target_groups = elbv2.describe_target_groups(
|
||||||
|
Names=[f'{prefix}-TargetGroup']
|
||||||
|
)['TargetGroups']
|
||||||
|
for tg in target_groups:
|
||||||
|
print(f"Usuwam Target Group: {tg['TargetGroupArn']}")
|
||||||
|
elbv2.delete_target_group(TargetGroupArn=tg['TargetGroupArn'])
|
||||||
|
except ClientError as e:
|
||||||
|
if e.response['Error']['Code'] != 'TargetGroupNotFound':
|
||||||
|
raise
|
||||||
|
|
||||||
|
try:
|
||||||
|
load_balancers = elbv2.describe_load_balancers(
|
||||||
|
Names=[f'{prefix}-LoadBalancer']
|
||||||
|
)['LoadBalancers']
|
||||||
|
for lb in load_balancers:
|
||||||
|
print(f"Usuwam Load Balancer: {lb['LoadBalancerArn']}")
|
||||||
|
elbv2.delete_load_balancer(LoadBalancerArn=lb['LoadBalancerArn'])
|
||||||
|
except ClientError as e:
|
||||||
|
if e.response['Error']['Code'] != 'LoadBalancerNotFound':
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
def main(aws_access_key_id, aws_secret_access_key, aws_session_token, default_vpc):
|
def main(aws_access_key_id, aws_secret_access_key, aws_session_token, default_vpc):
|
||||||
ec2 = boto3.resource(
|
ec2 = boto3.resource(
|
||||||
'ec2',
|
'ec2',
|
||||||
@ -22,6 +94,10 @@ def main(aws_access_key_id, aws_secret_access_key, aws_session_token, default_vp
|
|||||||
aws_session_token=aws_session_token,
|
aws_session_token=aws_session_token,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
print("Czyszczenie istniejących zasobów...")
|
||||||
|
clean_resources(ec2, PREFIX, default_vpc)
|
||||||
|
|
||||||
|
print("Tworzenie zasobów...")
|
||||||
# Tworzenie key pair
|
# Tworzenie key pair
|
||||||
key_pair = ec2.create_key_pair(
|
key_pair = ec2.create_key_pair(
|
||||||
KeyName=PREFIX + '-key',
|
KeyName=PREFIX + '-key',
|
||||||
@ -56,13 +132,111 @@ def main(aws_access_key_id, aws_secret_access_key, aws_session_token, default_vp
|
|||||||
'ImageId': AMI_ID,
|
'ImageId': AMI_ID,
|
||||||
'InstanceType': INSTANCE_TYPE,
|
'InstanceType': INSTANCE_TYPE,
|
||||||
'KeyName': key_pair.name,
|
'KeyName': key_pair.name,
|
||||||
'UserData': user_data,
|
'UserData': base64.b64encode(user_data.encode('utf-8')).decode('utf-8'),
|
||||||
'SecurityGroupIds': [security_group.group_id],
|
'SecurityGroupIds': [security_group.group_id],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Reszta kodu (bez zmian)
|
elbv2 = boto3.client('elbv2', region_name=REGION)
|
||||||
# ...
|
target_group = elbv2.create_target_group(
|
||||||
|
Name=PREFIX + '-TargetGroup',
|
||||||
|
Protocol='HTTP',
|
||||||
|
Port=TARGET_PORT,
|
||||||
|
VpcId=default_vpc,
|
||||||
|
TargetType='instance',
|
||||||
|
HealthCheckProtocol='HTTP',
|
||||||
|
HealthCheckPort=str(TARGET_PORT),
|
||||||
|
HealthCheckPath='/factors/2',
|
||||||
|
)
|
||||||
|
target_group_arn = target_group['TargetGroups'][0]['TargetGroupArn']
|
||||||
|
|
||||||
|
# Tworzenie Load Balancer
|
||||||
|
load_balancer = elbv2.create_load_balancer(
|
||||||
|
Name=PREFIX + '-LoadBalancer',
|
||||||
|
Subnets=[default_vpc], # Użyj odpowiednich subnetów
|
||||||
|
Scheme='internet-facing',
|
||||||
|
Type='application',
|
||||||
|
IpAddressType='ipv4',
|
||||||
|
)
|
||||||
|
load_balancer_arn = load_balancer['LoadBalancers'][0]['LoadBalancerArn']
|
||||||
|
|
||||||
|
elbv2.create_listener(
|
||||||
|
LoadBalancerArn=load_balancer_arn,
|
||||||
|
Protocol='HTTP',
|
||||||
|
Port=LOAD_BALANCER_PORT,
|
||||||
|
DefaultActions=[
|
||||||
|
{
|
||||||
|
'Type': 'forward',
|
||||||
|
'TargetGroupArn': target_group_arn,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Tworzenie Auto Scaling Group
|
||||||
|
autoscaling = boto3.client('autoscaling', region_name=REGION)
|
||||||
|
autoscaling.create_auto_scaling_group(
|
||||||
|
AutoScalingGroupName=PREFIX + '-AutoScalingGroup',
|
||||||
|
LaunchTemplate={
|
||||||
|
'LaunchTemplateId': launch_template['LaunchTemplate']['LaunchTemplateId'],
|
||||||
|
'Version': '$Latest',
|
||||||
|
},
|
||||||
|
MinSize=MIN_INSTANCES,
|
||||||
|
MaxSize=MAX_INSTANCES,
|
||||||
|
DesiredCapacity=MIN_INSTANCES,
|
||||||
|
VPCZoneIdentifier=default_vpc, # Użyj odpowiednich subnetów
|
||||||
|
TargetGroupARNs=[target_group_arn],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Tworzenie reguł skalowania
|
||||||
|
cloudwatch = boto3.client('cloudwatch', region_name=REGION)
|
||||||
|
|
||||||
|
# Alarm skalowania w górę
|
||||||
|
cloudwatch.put_metric_alarm(
|
||||||
|
AlarmName=PREFIX + '-ScaleUp',
|
||||||
|
MetricName='RequestCountPerTarget',
|
||||||
|
Namespace='AWS/ApplicationELB',
|
||||||
|
Statistic='Sum',
|
||||||
|
Period=60,
|
||||||
|
Threshold=100,
|
||||||
|
ComparisonOperator='GreaterThanThreshold',
|
||||||
|
EvaluationPeriods=2,
|
||||||
|
AlarmActions=[
|
||||||
|
autoscaling.put_scaling_policy(
|
||||||
|
AutoScalingGroupName=PREFIX + '-AutoScalingGroup',
|
||||||
|
PolicyName=PREFIX + '-ScaleUpPolicy',
|
||||||
|
ScalingAdjustment=1,
|
||||||
|
AdjustmentType='ChangeInCapacity',
|
||||||
|
)['PolicyARN']
|
||||||
|
],
|
||||||
|
Dimensions=[
|
||||||
|
{'Name': 'TargetGroup', 'Value': target_group_arn},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
# Alarm skalowania w dół
|
||||||
|
cloudwatch.put_metric_alarm(
|
||||||
|
AlarmName=PREFIX + '-ScaleDown',
|
||||||
|
MetricName='RequestCountPerTarget',
|
||||||
|
Namespace='AWS/ApplicationELB',
|
||||||
|
Statistic='Sum',
|
||||||
|
Period=60,
|
||||||
|
Threshold=10,
|
||||||
|
ComparisonOperator='LessThanThreshold',
|
||||||
|
EvaluationPeriods=2,
|
||||||
|
AlarmActions=[
|
||||||
|
autoscaling.put_scaling_policy(
|
||||||
|
AutoScalingGroupName=PREFIX + '-AutoScalingGroup',
|
||||||
|
PolicyName=PREFIX + '-ScaleDownPolicy',
|
||||||
|
ScalingAdjustment=-1,
|
||||||
|
AdjustmentType='ChangeInCapacity',
|
||||||
|
)['PolicyARN']
|
||||||
|
],
|
||||||
|
Dimensions=[
|
||||||
|
{'Name': 'TargetGroup', 'Value': target_group_arn},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f'Load Balancer URL: {load_balancer["LoadBalancers"][0]["DNSName"]}')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
parser = argparse.ArgumentParser(description="Create AWS infrastructure")
|
parser = argparse.ArgumentParser(description="Create AWS infrastructure")
|
||||||
|
Loading…
Reference in New Issue
Block a user