AWS рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рд░реНрд╡рд░ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдирд╛

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ AWS рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рд░реНрд╡рд░ рд╣реИ рдФрд░ рдмреИрдХрдЕрдк рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдХрд╛рд░реНрдп рд╣реИред рдЖрдк рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдбреЗрдЯрд╛ рдЕрдЦрдВрдбрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред рдореИрдВ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдФрд░ рдорд╛рд╕рд┐рдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рднреА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╕реНрдиреИрдкрд╢реЙрдЯ рдореЗрдВ рдЬреАрд╡рдирдЪрдХреНрд░ рдЗрд╕рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдирдИ AWS рдмреИрдХрдЕрдк рд╕реЗрд╡рд╛ рдХреЛ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдкреВрд░рд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдореБрдЭреЗ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдЦреИрд░, рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдм рдореЗрд░реА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗ, рдХрд╛рдо рдХрд░реЗред

рд╣рдореЗрдВ рдЬрд┐рд╕ рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

  1. Windows Server 2008 R2 рдпрд╛ рдмрд╛рдж рдореЗрдВ AWS рдЪрд▓ рд░рд╣рд╛ рд╣реИ
  2. рдПрд╕рдПрд╕рдПрдо рдПрдЬреЗрдВрдЯ рд╕рдВрд╕реНрдХрд░рдг 2.2.58.0 рдпрд╛ рдмрд╛рдж рдореЗрдВ
  3. Windows PowerShell 3.3.48.0 рдпрд╛ рдмрд╛рдж рдХреЗ рд▓рд┐рдП AWS рдЯреВрд▓
  4. AWS рд╕рд┐рд╕реНрдЯрдо рдореИрдиреЗрдЬрд░
  5. IAM
  6. рдПрд╕рдПрдирдПрд╕
  7. рд▓реИрдореНрдмреНрдбрд╛

рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рднреВрдорд┐рдХрд╛ рдЪрд╛рд╣рд┐рдПред рднреВрдорд┐рдХрд╛ рдХреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдПрд╕рдПрд╕рдПрдо рдФрд░ рдИрдмреАрдПрд╕ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

IAM тЖТ рдиреАрддрд┐рдпрд╛рдБ тЖТ рдиреАрддрд┐ рдмрдирд╛рдПрдБ рдкрд░ рдЬрд╛рдПрдБред
JSON рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдбрд╛рд▓реЗрдВ

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*::snapshot/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:CreateSnapshot" ], "Resource": "*" } ] } 

рд╣рдо рдирд╛рдо рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдиреАрддрд┐ рджрдмрд╛рддреЗ рд╣реИрдВ рд╣рдо VssSnapshotPolicy рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд╕рд╣реЗрдЬреЗрдВ

рдЕрдм рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдВред
IAM тЖТ рднреВрдорд┐рдХрд╛рдПрдБ тЖТ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдБ

AWS рд╕реЗрд╡рд╛ тЖТ EC2 рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрдорддрд┐рдпрд╛рдВ рдкрд░ рдЬрд╛рдПрдВред

рдпрд╣рд╛рдВ рд╣рдо SMSS рдФрд░ рд╣рдорд╛рд░реА рдиреАрддрд┐ рдХреЗ рд▓рд┐рдП AmazonSSMManagedInstanceCore рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ VssSnapshotPolicy рдмрдирд╛рдпрд╛ рдерд╛ред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ, рддреЛ рд╣рдорд╛рд░реА рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреИрдЧ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирд╛рдо рджреЗрдВ, VssSnapshotRoleред

рддрдм рд╣рдо рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ рд╕реМрдВрдкрддреЗ рд╣реИрдВред

рд╕рдм рдХреБрдЫ ssm рдЕрдм рдЗрди рд╕рд░реНрд╡рд░реЛрдВ рдХреЛ "рдкреНрд░рдмрдВрдзрд┐рдд" рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ AWSVssCompords рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рди рдХрдорд╛рдВрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рд░рди рдХрдорд╛рдВрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, AWS-ConfigureAWSPackage рджреЗрдЦреЗрдВред

рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдореЗрдВ, рдЗрдВрд╕реНрдЯрд╛рд▓, рдирд╛рдо - AwsVssCompords, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред
рд▓рдХреНрд╖реНрдп рдореЗрдВ, рд╣рдо рдЙрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдмреИрдХрдЕрдк рдХрд░реЗрдВрдЧреЗред

RUN рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо SSM рдХрдВрд╕реЛрд▓ рд╕реЗ рдмреИрдХрдЕрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд░рди рдХрдорд╛рдВрдб рдЪреБрдиреЗрдВ, AWSEC2-CreateVssSnapshot рджреЗрдЦреЗрдВред рд╣рдо рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЯрд╛рд░рдЧреЗрдЯ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдмрд╣рд┐рд╖реНрдХреГрдд рдмреВрдЯ рд╡реЙрд▓реНрдпреВрдо, рдХреЙрдкреА рдУрдирд▓реА рдФрд░ рдиреЛ рд░рд╛рдЗрдЯрд░реНрд╕ рдЬреИрд╕реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

RUN рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╣рдореЗрдВ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдирд╛ рд╣реИред

рдмреИрдХрдЕрдк рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрд╕рдПрдирдПрд╕ рд╡рд┐рд╖рдп рдмрдирд╛рдПрдВред рдФрд░ рдЗрд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВред рдореИрдВ рдИрдореЗрд▓ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╣рдо рдПрдХ рдиреАрддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рдмрд╛рд░реА рдореЗрдВ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sns:Publish", "Resource": "arn:aws:sns:ap-northeast-1:Account ID:Topic Name" } ] } 

рдФрд░ рдЗрд╕ рдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдБред

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо SSM рд░рдЦрд░рдЦрд╛рд╡ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд░рдЦрд░рдЦрд╛рд╡ рд╡рд┐рдВрдбреЛ рдмрдирд╛рдПрдБ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдирд╛рдо рднрд░реЗрдВ, рдЬреЛ рднреА рдкрд╕рдВрдж рд╣реЛ рдЙрд╕реЗ рдЕрдиреБрд╕реВрдЪреА рдореЗрдВ рднрд░реЗрдВред

рд╣рдо рдмрдирд╛рдП рдЧрдП рд░рдЦрд░рдЦрд╛рд╡ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рд░рди рдХрдорд╛рдВрдб рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рднрд░реЗрдВред рдЯреИрдЧ рдореЗрдВ рдореИрдВ рдмреИрдХрдЕрдк рдХрд╛ рдкреНрд░рдХрд╛рд░ (TAG Key = SnapshotType, Value =) рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рддреАрди рд╕рдВрднрд╛рд╡рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ: рджрд┐рди, рд╕рдкреНрддрд╛рд╣, рдорд╣реАрдирд╛ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рддреАрди рд░рдЦрд░рдЦрд╛рд╡ рд╡рд┐рдВрдбреЛред рд╕реЗрдЯ рдХрд░реЗрдВ рдПрд╕рдПрдирдПрд╕ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рдПрд╕рдПрдирдПрд╕ рдФрд░ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рднреВрдорд┐рдХрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред

рд╕рднреА рд╕реНрдиреИрдкрд╢реЙрдЯ рдЕрдм рдПрдХ рд╢реЗрдбреНрдпреВрд▓ рдкрд░ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗред

рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╣реЛрдВрдЧреЗ - рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдл рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдФрд░ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рд▓реИрдореНрдмреНрдбрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдкрдврд╝ рдФрд░ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо IAM рдореЗрдВ рдПрдХ рдиреАрддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ

 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "logs:DeleteSubscriptionFilter", "ec2:DeleteSnapshot", "ec2:DescribeSnapshots", "logs:DeleteLogStream", "logs:CreateExportTask", "logs:DeleteResourcePolicy", "logs:CreateLogStream", "logs:DeleteMetricFilter", "logs:TagLogGroup", "logs:CancelExportTask", "ec2:DescribeVolumes", "logs:DeleteRetentionPolicy", "logs:DeleteLogDelivery", "logs:AssociateKmsKey", "logs:PutDestination", "logs:DisassociateKmsKey", "logs:UntagLogGroup", "logs:DeleteLogGroup", "logs:PutDestinationPolicy", "ec2:DescribeSnapshotAttribute", "logs:DeleteDestination", "logs:PutLogEvents", "logs:CreateLogGroup", "logs:PutMetricFilter", "logs:CreateLogDelivery", "logs:PutResourcePolicy", "logs:UpdateLogDelivery", "logs:PutSubscriptionFilter", "logs:PutRetentionPolicy" ], "Resource": "*" } ] } 

рдФрд░ рд╣рдо рдЗрд╕ рдиреАрддрд┐ рдХреЛ рдПрдХ рдирдИ рднреВрдорд┐рдХрд╛ рдкрд░ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВред

рд▓реИрдореНрдмреНрдбрд╛ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдПрдХ рдирдпрд╛ рдЕрдЬрдЧрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВред

 import datetime import sys import boto3 def get_volume_snapshots(client, volume_id, SnapshotType): args = { "Filters": [ { "Name": "volume-id", "Values": [volume_id] }, { "Name": "status", "Values": ["completed"] }, { "Name": "tag-key", "Values": ["SnapshotType"]}, { "Name": "tag-value", "Values": [SnapshotType]}, ], "OwnerIds": ["self"] } snapshots = [] while True: resp = client.describe_snapshots(**args) snapshots += resp.get("Snapshots", []) if "NextToken" in resp: args["NextToken"] = resp["NextToken"] else: break return snapshots def delete_snapshot(client, snapshot_id): wait_period = 5 retries = 5 while True: try: client.delete_snapshot(SnapshotId=snapshot_id) return True except Exception as ex: # As the list of snapshot is eventually consistent old snapshots might appear in listed snapshots if getattr(ex, "response", {}).get("Error", {}).get("Code", "") == "'InvalidSnapshot.NotFound": return False # Throttling might occur when deleting snapshots too fast if "throttling" in ex.message.lower(): retries -= 1 if retries == 0: raise ex time.sleep(wait_period) wait_period = min(wait_period + 10 , 30) continue raise ex def lambda_handler(event, context): retentions = {"Day": 5, "Week": 3, "Month": 2} client = boto3.client("ec2") vols = client.describe_volumes() snapshots_deleted = [] for vol in vols['Volumes']: vol_id = vol['VolumeId'] for SnapshotType, retention_count in retentions.items(): snapshots_for_volume = sorted(get_volume_snapshots(client, vol_id, SnapshotType), key=lambda s: s["StartTime"], reverse=True) snapshots_to_delete = [] if retention_count > 0: snapshots_to_delete = [b["SnapshotId"] for b in snapshots_for_volume[retention_count:]] for snapshot_id in snapshots_to_delete: if delete_snapshot(client, snapshot_id): snapshots_deleted.append(snapshot_id) return { "DeletedSnapshots": snapshots_deleted } 

рд╣рдо рдКрдкрд░ рдмрдирд╛рдИ рдЧрдИ рднреВрдорд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо CloudWatch рдЗрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЯрд╛рдЗрдк рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЕрд╡рдзрд╛рд░рдг рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдВрддрд┐рдо 5 рджреИрдирд┐рдХ, 3 рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдФрд░ 2 рдорд╛рд╕рд┐рдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╣реИрдВред

Source: https://habr.com/ru/post/hi462601/


All Articles