AWS Lambda 및 AWS EventBridge를 사용한 AWS 인프라 유지 관리 [X일 후 EC2 인스턴스 ebs 스냅샷 정리] [2부]

내용물


  • Summary

  • Architecture diagram and high level overview of all the solutions
  • Architecture diagram
  • EC2 instance daily ebs volume snapshots
  • EC2 instance daily ebs snapshot cleanup after X days


  • AWS IAM permissions
  • Permissions
  • Trust relationship

  • AWS EventBridge and Lambda
  • EC2 instance ebs snapshot delete solution
  • Coming up next



  • 요약



    Lambda 및 EventBridge와 같은 AWS 서비스를 활용하여 일정에 따라 AWS 인프라에서 하우스키핑을 자동으로 수행하는 방법에 대한 4부작 자습서PART-2에 오신 것을 환영합니다. 지난 번에는 Python, AWS Lambda 및 AWS eventbridge를 사용하여 인스턴스의 EBS 스냅샷을 생성하는 방법에 대해 이야기했습니다. 이 게시물에서는 이전 EBS 스냅샷이 자동으로 정리되는 두 번째 부분을 빌드하는 방법에 대해 설명합니다. '이전'은 일 수(이 경우 7)로 정의됩니다.

  • [PART-1] 모든 리전에서 모든 AWS EC2 인스턴스의 EBS 볼륨 스냅샷을 생성하고 태그를 지정합니다. 게시물에 대한 링크를 찾을 수 있습니다.

  • [PART-2] X일보다 오래된 모든 리전에서 EBS 볼륨 스냅샷을 정리합니다.



  • 모든 솔루션의 아키텍처 다이어그램 및 높은 수준의 개요



    아키텍처 다이어그램





    EC2 인스턴스 일일 ebs 볼륨 스냅샷



    모든 리전의 모든 인스턴스와 관련 볼륨을 나열하고 여기에서 EBS 스냅샷을 생성하겠습니다. 또한 이 스냅샷에 사용자 정의 태그를 추가할 것입니다.

    X일 후 매일 EC2 인스턴스 ebs 스냅샷 정리



    우리 지역에서 소유하고 있는 모든 EBS 스냅샷을 나열한 다음 X일보다 오래된 스냅샷을 삭제하겠습니다.


    AWS IAM 권한



    Create an IAM role 다음 권한 및 신뢰 정책을 사용합니다.

    권한



    다음을 허용하는 권한 정책 템플릿을 역할에 연결합니다.
  • AWS cloudwatch 로그 스트림 생성 및 쓰기.
  • EC2 인스턴스, 볼륨, 스냅샷 및 AMI를 설명합니다.
  • EC2 스냅샷 생성 및 삭제.
  • EC2 볼륨 삭제.
  • EC2 AMI 등록 취소.

  • {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogStream",
                    "logs:CreateLogGroup",
                    "logs:PutLogEvents"
                ],
                "Resource": "arn:aws:logs:*:*:*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateSnapshot",
                    "ec2:CreateTags",
                    "ec2:DeleteSnapshot",
                    "ec2:Describe*",
                    "ec2:ModifySnapshotAttribute",
                    "ec2:ResetSnapshotAttribute",
                    "ec2:DeleteVolume",
                    "ec2:DeregisterImage"
                ],
                "Resource": "*"
            }
        ]
    }
    


    신뢰 관계



    IAM 역할에 대한 Lambda 서비스 액세스를 허용합니다.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    



    AWS EventBridge 및 람다



    AWS Lambda을 사용하여 인프라 유지 관리를 실행하기 위해 Python 코드를 실행할 것입니다.

    일정에 따라 람다를 통해 코드를 실행하기 위해 AWS EventBridge을 사용할 것입니다. cron 식을 사용하여 일정을 정의하여 매일 자정에 현지 시간대를 기준으로 트리거할 것입니다.
    AWS EventBridge 서비스 ➡️ 규칙 ➡️ 규칙 생성으로 이동하여 EventBridge 규칙을 생성할 수 있습니다. 우리가 사용할 cron 표현식은 cron(30 18 * * ? *)입니다. 저는 인도에 거주하고 있으며 이것은 자정 IST 시간대(GMT 18:30:00)로 변환됩니다.

    AWS Cloudwatch logs을 사용하여 람다 실행의 데이터를 기록하겠습니다.

    EC2 인스턴스 ebs 스냅샷 삭제 솔루션


    워크플로 및 코드


  • 사용할 작업 흐름은 다음과 같습니다.
    > 🕛 자정 ➡️ AWS EventBridge 규칙 트리거 ➡️ Lambda 코드 실행 ➡️ EBS 스냅샷 확인, 생성된 지 7일 이상 지난 경우 삭제 ➡️ Cloudwatch 로그에 기록

  • boto3 설치

    python3 -m pip install boto3
    




  • 람다 코드
  • boto3 초기화client

  • ec2_client = boto3.client('ec2')
    

  • 모든 지역 가져오기

  • def get_regions(ec2_client):
        return [region['RegionName'] for region in ec2_client.describe_regions()['Regions']]
    

  • 리전별 boto3 ec2 ​​초기화client

  • ec2_client = boto3.client('ec2',region_name=region)
    

  • describe_snapshots(OwnerIds=[account_id])을 사용하여 계정 ID에 대한 리전의 모든 스냅샷을 나열합니다.

  • def get_snapshots_from_a_region(ec2_client,account_id):
    return (ec2_client.describe_snapshots(OwnerIds=[account_id])['Snapshots'])
    

  • 스냅샷의 수명을 현재 날짜 및 시간과 비교하고 차이가 7일보다 크면 스냅샷을 삭제합니다. 클라이언트의 delete_snapshot() 메서드를 사용하여 이 활동을 수행합니다.

  • def get_age_of_snapshot(snap):
    return ((datetime.now() - snap['StartTime'].replace(tzinfo=None)).days)
    
    def delete_snapshot_from_a_region(ec2_client,snap):
    ec2_client.delete_snapshot(SnapshotId=snap['SnapshotId'])
    


  • 종합하기 - 전체 코드를 보려면 내 페이지GITHUB를 살펴보십시오.



  • Cloudwatch 로그






    다음으로



    X일 후 연결되지 않은 ebs 볼륨을 정리하는 방법에 대해 이야기할 이 튜토리얼의

    좋은 웹페이지 즐겨찾기