여러 AWS 계정에서 공유 Amazon Machine Image 사용 모니터링 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

여러 AWS 계정에서 공유 Amazon Machine Image 사용 모니터링

작성자: Naveen Suthar(AWS) 및 Sandeep Gawande(AWS)

코드 리포지토리: cross-account-ami-auditing-terraform-samples

환경: PoC 또는 파일럿

기술: 관리 및 거버넌스, DevOps서버리스, 운영

AWS 서비스: Amazon DynamoDB , AWS Lambda, Amazon EventBridge

요약

Amazon Machine Images(AMIs)는 Amazon Web Services() AWS환경에서 Amazon Elastic Compute Cloud(AmazonEC2) 인스턴스를 생성하는 데 사용됩니다. 이 패턴AMIs의 생성자 AWS 계정이라고 하는 별도의 중앙 집중식 계정에서 를 생성할 수 있습니다. 그런 다음 동일한 AWS 리전에 있는 여러 AWS 계정 AMI 간에 를 공유할 수 있습니다. 이를 이 패턴의 소비자 계정이라고 합니다. 단일 계정AMIs에서 를 관리하면 확장성을 제공하고 거버넌스를 간소화할 수 있습니다. 소비자 계정에서 Amazon EC2 Auto Scaling 시작 템플릿 및 Amazon Elastic Kubernetes Service(AmazonEKS) 노드 그룹 AMI에서 공유된 를 참조할 수 있습니다.

공유AMI가 더 이상 사용되지 않거나, 등록 취소되거나, 공유되지 않은 경우 소비자 계정AMI의 를 참조하는 AWS 서비스는 이 를 사용하여 새 인스턴스AMI를 시작할 수 없습니다. 동일한 인스턴스의 모든 Auto Scaling 이벤트 또는 재시작이 실패합니다. 이로 인해 프로덕션 환경에서 애플리케이션 가동 중지나 성능 저하와 같은 문제가 발생할 수 있습니다. 여러 AWS 계정에서 AMI 공유 및 사용 이벤트가 발생하는 경우 이 활동을 모니터링하기 어려울 수 있습니다.

이 패턴은 동일한 리전의 계정 간에 공유 AMI 사용량 및 상태를 모니터링하는 데 도움이 됩니다. Amazon , Amazon DynamoDB EventBridge, AWS Lambda 및 Amazon Simple Email Service(Amazon )와 같은 서버리스 AWS 서비스를 사용합니다SES. HashiCorp Terraform을 사용하여 인프라를 코드(IaC )로 프로비저닝합니다. 이 솔루션은 소비자 계정의 서비스가 등록 취소되거나 공유되지 않은 를 참조할 때 알림을 제공합니다AMI.

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정 2개 이상: 생성자 계정 1개 및 소비자 계정 1개 이상

  • 생성자 계정에서 소비자 계정으로 공유AMIs되는 하나 이상의 .

  • Terraform CLI, 설치됨(Terraform 설명서)

  • Terraform AWS Provider, 구성됨(Terraform 설명서)

  • (선택 사항이지만 권장됨)Terraform 백엔드, 구성됨(Terraform 설명서)

  • Git, 설치됨

제한 사항

  • 이 패턴은 계정 ID를 사용하여 특정 계정과 공유된 AMIs 를 모니터링합니다. 이 패턴은 조직 ID를 사용하여 조직에 공유된 AMIs 를 모니터링하지 않습니다.

  • AMIs 는 동일한 AWS 리전 내에 있는 계정에만 공유할 수 있습니다. 이 패턴은 단일 대상 리전 AMIs 내에서 모니터링합니다. 여러 리전AMIs에서 의 사용을 모니터링하려면 각 리전에 이 솔루션을 배포합니다.

  • 이 패턴은 이 솔루션이 배포되기 전에 공유된 AMIs를 모니터링하지 않습니다. 이전에 공유된 를 모니터링하려면 를 공유 해제AMI한 다음 소비자 계정과 다시 공유할 AMIs수 있습니다.

제품 버전

  • Terraform 버전 1.2.0 이상

  • Terraform AWS Provider 버전 4.20 이상

아키텍처

대상 기술 스택

Terraform을 통해 IaC로 프로비저닝되는 리소스는 다음과 같습니다.

  • Amazon DynamoDB 테이블

  • Amazon EventBridge 규칙

  • AWS 자격 증명 및 액세스 관리(IAM) 역할

  • AWS Lambda 함수

  • Amazon SES

대상 아키텍처 

공유 AMI 사용을 모니터링하고 AMI가 공유되지 않거나 등록 취소된 경우 사용자에게 알리는 아키텍처

이 다이어그램은 다음 워크플로를 보여줍니다.

  1. 생성자 계정AMI의 는 동일한 AWS 리전의 소비자 계정과 공유됩니다.

  2. 이 공유되면 생성자 계정의 Amazon EventBridge 규칙AMI이 ModifyImageAttribute 이벤트를 캡처하고 생성자 계정에서 Lambda 함수를 시작합니다.

  3. Lambda 함수는 생성자 계정AMI의 DynamoDB 테이블에 와 관련된 데이터를 저장합니다.

  4. 소비자 계정의 AWS 서비스가 공유 를 사용하여 Amazon EC2 인스턴스를 AMI 시작하거나 공유가 시작 템플릿과 연결된 경우 소비자 계정의 EventBridge 규칙AMI은 공유 의 사용을 캡처합니다AMI.

  5. EventBridge 규칙은 소비자 계정에서 Lambda 함수를 시작합니다. Lambda 함수는 다음 작업을 수행합니다.

    1. Lambda 함수는 소비자 계정의 DynamoDB 테이블에서 AMI관련 데이터를 업데이트합니다.

    2. Lambda 함수는 생성자 계정의 IAM 역할을 맡아 생성자 계정의 DynamoDB 테이블을 업데이트합니다. Mapping 테이블에서 인스턴스 ID 또는 시작 템플릿 ID를 해당 AMI ID에 매핑하는 항목을 생성합니다.

  6. 생성자 계정에서 중앙에서 관리AMI되는 는 더 이상 사용되지 않거나 등록되지 않거나 공유되지 않습니다.

  7. 생성자 계정의 EventBridge 규칙은 remove 작업으로 ModifyImageAttribute 또는 DeregisterImage 이벤트를 캡처하고 Lambda 함수를 시작합니다.

  8. Lambda 함수는 DynamoDB 테이블을 확인하여 AMI가 소비자 계정에서 사용되는지 확인합니다. AMI Mapping 테이블에 와 IDs 연결된 인스턴스 IDs 또는 시작 템플릿이 없는 경우 프로세스가 완료됩니다.

  9. 인스턴스 IDs 또는 시작 템플릿IDs이 Mapping 테이블AMI의 와 연결된 경우 Lambda 함수는 AmazonSES을 사용하여 구성된 구독자에게 이메일 알림을 보냅니다.

도구

AWS 서비스

  • Amazon DynamoDB는 빠르고 예측 가능하며 확장 가능한 성능을 제공하는 완전 관리형 데이터베이스 없음SQL 서비스입니다.

  • Amazon EventBridge은 애플리케이션을 다양한 소스의 실시간 데이터와 연결하는 데 도움이 되는 서버리스 이벤트 버스 서비스입니다. 예를 들어 AWS Lambda 함수, API 대상HTTP을 사용하는 호출 엔드포인트 또는 다른 AWS 계정의 이벤트 버스 등이 있습니다.

  • AWS Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 인증하고 사용할 수 있는 권한을 부여받은 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • Amazon Simple Email Service(Amazon SES)를 사용하면 자체 이메일 주소와 도메인을 사용하여 이메일을 보내고 받을 수 있습니다.

기타 도구

  • HashiCorp Terraform은 코드를 사용하여 클라우드 인프라 및 리소스를 프로비저닝하고 관리하는 데 도움이 되는 코드형 오픈 소스 인프라(IaC) 도구입니다.

  • Python은 범용 컴퓨터 프로그래밍 언어입니다.

코드 리포지토리

이 패턴의 코드는 GitHub cross-account-ami-monitoring-terraform-samples 리포지토리에서 사용할 수 있습니다.

모범 사례

에픽

작업설명필요한 기술

이름이 AWS CLI 지정된 프로파일을 생성합니다.

생성자 계정과 각 소비자 계정에 대해 이름이 프로파일인 AWS 명령줄 인터페이스(AWS CLI)를 생성합니다. 지침은 AWS 시작하기 리소스 센터AWS의 설정을 CLI참조하세요.

DevOps 엔지니어

리포지토리를 복제합니다.

다음 명령을 입력합니다. 이렇게 하면 를 사용하여 의 cross-account-ami-monitoring-terraform-samples 리포지토리 GitHub 가 복제됩니다SSH.

git clone git@github.com:aws-samples/cross-account-ami-monitoring-terraform-samples.git
DevOps 엔지니어

provider.tf 파일을 업데이트합니다.

  1. 다음 명령을 입력하여 복제된 리포지토리의 terraform 폴더로 이동합니다.

    cd cross-account-ami-monitoring/terraform
  2. provider.tf 파일을 엽니다.

  3. 다음과 같이 생성자 계정 및 소비자 계정에 대한 Terraform AWS Provider 구성을 업데이트합니다.

    • alias에 공급자 구성의 이름을 입력합니다.

    • 에 이 솔루션을 배포하려는 대상 AWS 리전을 region입력합니다.

    • 에 계정에 액세스하기 위한 AWSCLI명명된 프로필을 profile입력합니다.

  4. 두 개 이상의 소비자 계정을 구성하는 경우 각 추가 소비자 계정에 대한 프로파일을 생성하세요.

  5. provider.tf 파일을 저장하고 닫습니다.

공급자 구성에 대한 자세한 내용은 Terraform 설명서의 다중 공급자 구성을 참조하세요.

DevOps 엔지니어

terraform.tfvars 파일을 업데이트합니다.

  1. terraform.tfvars 파일을 엽니다.

  2. account_email_mapping 파라미터에서 다음과 같이 생성자 계정 및 소비자 계정에 대한 알림을 구성합니다.

    • account에 계정 ID를 입력합니다.

    • email에 알림을 보낼 이메일 주소를 입력합니다. 계정 당 하나의 이메일 주소만 입력할 수 있습니다.

  3. 두 개 이상의 소비자 계정을 구성하는 경우 각 추가 소비자 계정에 대한 계정 및 이메일 주소를 입력합니다.

  4. terraform.tfvars 파일을 저장하고 닫습니다.

DevOps 엔지니어

main.tf 파일을 업데이트합니다.

이 솔루션을 두 개 이상의 소비자 계정에 배포하는 경우에만 이 단계를 완료하세요. 이 솔루션을 한 소비자 계정에만 배포하는 경우 이 파일을 수정할 필요가 없습니다.

  1. main.tf 파일을 엽니다.

  2. 각 추가 소비자 계정에 대해 템플릿의 consumer_account_A 모듈을 기반으로 새 모듈을 생성하세요. 각 소비자 계정 provider의 값은 provider.tf 파일에 입력한 별칭과 일치해야 합니다.

  3. main.tf 파일을 저장하고 닫습니다.

DevOps 엔지니어
작업설명필요한 기술

솔루션을 배포합니다.

Terraform 에 다음 명령을 CLI입력하여 생성자 및 소비자 계정에 AWS 리소스를 배포합니다.

  1. 다음 명령을 입력하여 Terraform을 초기화합니다.

    terraform init
  2. Terraform 구성을 검증하려면 다음 명령을 입력합니다.

    terraform validate
  3. Terraform 실행 계획을 생성하려면 다음 명령을 입력합니다.

    terraform plan
  4. Terraform 계획의 구성 변경 사항을 검토하고 이러한 변경 사항을 구현할지 확인합니다.

  5. 다음 명령을 입력하여 리소스를 배포합니다.

    terraform apply
DevOps 엔지니어

이메일 주소 ID를 확인합니다.

Terraform 계획을 배포했을 때 Terraform은 Amazon 의 각 소비자 계정에 대한 이메일 주소 자격 증명을 생성했습니다SES. 해당 이메일 주소로 알림을 보내려면 먼저 이메일 주소를 확인해야 합니다. 지침은 Amazon SES 설명서의 이메일 주소 자격 증명 확인을 참조하세요.

일반 AWS
작업설명필요한 기술

생성자 계정에서 배포를 검증하세요.

  1. 작성자 계정에 로그인합니다.

  2. 탐색 모음에서 대상 리전이 표시되는지 확인합니다. 다른 리전에 있는 경우 현재 표시된 리전의 이름을 선택한 다음 대상 리전을 선택합니다.

  3. 에서 DynamoDB 콘솔을 엽니다https://console.aws.amazon.com/dynamodb/.

  4. 탐색 창에서 테이블을 선택합니다.

  5. 테이블 목록에서 AmiShare 테이블이 있는지 확인합니다.

  6. https://console.aws.amazon.com/lambda 에서 Lambda 콘솔을 엽니다.

  7. 탐색 창에서 함수를 선택합니다.

  8. 함수 목록에서 ami-share 함수가 존재하는지 확인합니다.

  9. 에서 IAM 콘솔을 엽니다https://console.aws.amazon.com/iamv2/.

  10. 탐색 창에서 역할을 선택합니다.

  11. 역할 목록에 external-ddb-role 역할이 있는지 확인합니다.

  12. 에서 EventBridge 콘솔을 엽니다https://console.aws.amazon.com/events/.

  13. 탐색 창에서 규칙을 선택합니다.

  14. 규칙 목록에서 modify_image_attribute_event 규칙이 있는지 확인합니다.

  15. 에서 Amazon SES 콘솔을 엽니다https:/console.aws.amazon.com/ses/.

  16. 왼쪽 탐색 창에서 확인된 ID를 선택합니다.

  17. ID 목록에서 각 소비자 계정에 대해 이메일 주소 자격 증명이 등록 및 확인되었는지 확인합니다.

DevOps 엔지니어

소비자 계정에서 배포를 검증하세요.

  1. 소비자 계정에 로그인합니다.

  2. 탐색 모음에서 대상 리전이 표시되는지 확인합니다. 다른 리전에 있는 경우 현재 표시된 리전의 이름을 선택한 다음 대상 리전을 선택합니다.

  3. 에서 DynamoDB 콘솔을 엽니다https://console.aws.amazon.com/dynamodb/.

  4. 탐색 창에서 테이블을 선택합니다.

  5. 테이블 목록에서 Mapping 테이블이 있는지 확인합니다.

  6. https://console.aws.amazon.com/lambda 에서 Lambda 콘솔을 엽니다.

  7. 탐색 창에서 함수를 선택합니다.

  8. 함수 목록에 ami-usage-functionami-deregister-function 함수가 있는지 확인합니다.

  9. 에서 EventBridge 콘솔을 엽니다https://console.aws.amazon.com/events/.

  10. 탐색 창에서 규칙을 선택합니다.

  11. 규칙 목록에 ami_usage_eventsami_deregister_events 규칙이 있는지 확인합니다.

DevOps 엔지니어
작업설명필요한 기술

생성자 계정AMI에서 를 생성합니다.

  1. 생성자 계정에서 프라이빗 을 생성합니다AMI. 지침은 Amazon 인스턴스AMI에서 생성 EC2을 참조하세요.

  2. 새 를 소비자 계정 중 하나AMI와 공유합니다. 지침은 특정 AWS 계정AMI과 공유를 참조하세요.

DevOps 엔지니어

소비자 계정AMI에서 를 사용합니다.

소비자 계정에서 공유 를 사용하여 EC2 인스턴스를 AMI 생성하거나 템플릿을 시작합니다. 지침은 사용자 지정( re:Post Knowledge Center)에서 EC2 인스턴스를 시작하는 방법 AMI 또는 시작 템플릿 생성 방법(Amazon EC2 Auto Scaling 설명서)을 참조하세요.AWS

DevOps 엔지니어

모니터링 및 경고를 검증합니다.

  1. 작성자 계정에 로그인합니다.

  2. 에서 Amazon EC2 콘솔을 엽니다https://console.aws.amazon.com/ec2/.

  3. 탐색 창에서 를 선택합니다AMIs.

  4. 목록에서 AMI 를 선택한 다음 작업 , AMI 권한 편집 을 선택합니다.

  5. 공유 계정 섹션에서 소비자 계정을 선택한 다음 선택한 항목 제거를 선택합니다.

  6. Save changes(변경 사항 저장)를 선택합니다.

  7. 소비자 계정에 대해 정의한 대상 이메일 주소가 에 대한 공유가 취소되었다는 알림을 수신하는지 확인합니다AMI.

DevOps 엔지니어
작업설명필요한 기술

리소스를 삭제합니다.

  1. 다음 명령을 입력하여 이 패턴으로 배포된 리소스를 제거하고 공유된 의 모니터링을 중지합니다AMIs.

    terraform destroy
  2. yes를 입력하여 destroy 명령을 확인합니다.

DevOps 엔지니어

문제 해결

문제Solution

이메일 알림을 받지 못했습니다.

Amazon SES 이메일이 전송되지 않은 여러 가지 이유가 있을 수 있습니다. 다음을 확인하세요.

  1. 에픽 섹션에서 리소스 배포 검증 에픽을 사용하여 인프라가 모든 AWS 계정에 제대로 프로비저닝되었는지 확인합니다.

  2. Amazon CloudWatch Logs에서 Lambda 함수 이벤트를 검증합니다. 지침은 Lambda 설명서의 CloudWatch 콘솔 사용을 참조하세요. ID 기반 또는 리소스 기반 정책에 포함된 명시적 거부와 같은 권한 문제가 없는지 확인하세요. 자세한 내용은 IAM 설명서의 정책 평가 로직을 참조하세요.

  3. Amazon 에서 이메일 주소 자격 증명의 상태가 Verified 인지 SES확인합니다. 자세한 내용은 이메일 주소 ID 확인을 참조하세요.

관련 리소스

AWS 설명서

Terraform 설명서