AWS Config에서 required-tags를 활용하여 태그가 설정되지 않은 리소스를 추적하고 통지해 봤습니다.

AWS Config에서 required-tags를 활용하여 태그가 설정되지 않은 리소스를 추적하고 통지해 봤습니다.

AWS Config에서 required-tags를 활용하여 태그가 설정되지 않은 리소스를 추적하고 이메일로 통지해 봤습니다.
Clock Icon2025.06.17

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 AWS Config에서 required-tags를 활용하여 태그가 설정되지 않은 리소스를 추적하고 통지해 봤습니다.

required-tags?

AWS Config에서는 다양한 관리형 규칙을 제공하는데, 그 중에서 [태그 미설정 리소스 추적]을 하는 관리형 규칙이 바로 [required-tags]입니다. 이 관리형 규칙은 한 번에 최대 6개의 태그를 검사할 수 있습니다.

또 한, required-tags는 모든 리소스 유형에 대해 연결된 태그 기록을 지원하지 않습니다. 지원하고 있는 목록은 아래를 참고해 주세요.

리소스 유형: AWS::ACM::Certificate, AWS::AutoScaling::AutoScalingGroup, AWS::CloudFormation::Stack, AWS::CodeBuild::Project, AWS::DynamoDB::Table, AWS::EC2::CustomerGateway, AWS::EC2::Instance, AWS::EC2::InternetGateway, AWS::EC2::NetworkAcl, AWS::EC2::NetworkInterface, AWS::EC2::RouteTable, AWS::EC2::SecurityGroup, AWS::EC2::Subnet, AWS::EC2::Volume, AWS::EC2::VPC, AWS::EC2::VPNConnection, AWS::EC2::VPNGateway, AWS::ElasticLoadBalancing::LoadBalancer, AWS::ElasticLoadBalancingV2::LoadBalancer, AWS::RDS::DBInstance, AWS::RDS::DBSecurityGroup, AWS::RDS::DBSnapshot, AWS::RDS::DBSubnetGroup, AWS::RDS::EventSubscription, AWS::Redshift::Cluster, AWS::Redshift::ClusterParameterGroup, AWS::Redshift::ClusterSecurityGroup, AWS::Redshift::ClusterSnapshot, AWS::Redshift::ClusterSubnetGroup, AWS::S3::Bucket

보다 상세한 내용은 AWS 공식 문서에서 확인할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/config/latest/developerguide/required-tags.html

다양한 리소스 유형에 대해 태그 기록을 확인할 수 있는 만큼, 이번에는 간단하게 [AWS::EC2::VPC] 즉, Amazon VPC에 대한 미설정 태그 리소스를 추적해 보도록 하겠습니다.

AWS Config 규칙 생성

먼저 Config 규칙을 생성하기 위해 AWS Config 콘솔 화면에서 [규칙]으로 진입합니다.

이어서 [규칙 추가]를 클릭합니다.

jw-configtage-1

[AWS 관리형 규칙 추가]를 클릭하고, [required-tags] 규칙을 검색하여 선택합니다.

jw-configtage-2

규칙을 선택했다면, 규칙의 세부 설정을 진행합니다. 변경 범위는 [리소스]를 선택하고, 리소스 범주는 [AWS EC2 VPC]를 선택합니다. 처음에는 모든 리소스가 선택되어 있는데, [AWS EC2 VPC]만 남겨두고 나머지는 삭제합시다.

jw-configtage-3

마지막으로 검사할 태그를 지정합니다.

Key : Env, Value : Prd 라고 Amazon VPC의 리소스에 태그가 지정되어 있는지 검사합니다.

jw-configtage-4

규칙이 생성된 것을 확인할 수 있습니다.

jw-configtage-5

IAM 정책 및 역할 생성

먼저 Lambda 함수에 SNS, CloudWatch에 대한 권한을 할당하기 위해 아래 json 코드를 이용하여 IAM 정책과 역할을 생성합니다.

[arn:aws:sns:ap-northeast-2:xxxxxxxxxx]에는 SNS 토픽 Arn을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "arn:aws:sns:ap-northeast-2:xxxxxxxxxx"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}

Lambda 함수 코드 작성

Lambda 함수의 런타임은 [Python 3.13]을 지정합니다.

[arn:aws:sns:ap-northeast-2:xxxxxxxxxx]에는 SNS 토픽 Arn을 입력합니다.

import json
import boto3

sns = boto3.client('sns')
SNS_TOPIC_ARN = 'arn:aws:sns:ap-northeast-2:xxxxxxxxxx'

def lambda_handler(event, context):
    print("Received event:", json.dumps(event))

    detail = event.get('detail', {})
    resource_type = detail.get('resourceType')
    resource_id = detail.get('resourceId')
    compliance_type = detail.get('newEvaluationResult', {}).get('complianceType')

    if compliance_type == "NON_COMPLIANT":
        message = f"""
🚨 [태그 누락 감지]

아래 리소스에서 필수 태그가 누락되었습니다.

- 리소스 ID: {resource_id}
- 리소스 유형: {resource_type}
- 규칙: required-tags
- 상태: NON_COMPLIANT

AWS Config에서 리소스를 확인하고, 태그를 추가하세요.
"""
        sns.publish(
            TopicArn=SNS_TOPIC_ARN,
            Subject="🚨 태그 누락 리소스 감지됨 (AWS Config)",
            Message=message
        )

    return {
        'statusCode': 200,
        'body': 'Processed AWS Config event'
    }

EventBridge 규칙 생성

이제 마지막으로 EventBridge 규칙을 생성합니다. required-tags의 결과가 [NON_COMPLIANT]으로 나올 시 이벤트가 발생한다는 조건입니다. 이벤트가 발생했을 때 실행될 대상은 조금 전 생성한 Lambda 함수입니다.

{
  "source": ["aws.config"],
  "detail-type": ["Config Rules Compliance Change"],
  "detail": {
    "configRuleName": ["required-tags"],
    "newEvaluationResult": {
      "complianceType": ["NON_COMPLIANT"]
    }
  }
}

결과 확인

테스트를 위해 VPC를 생성합니다. 해당 VPC에는 Name 태그만이 설정되어 있습니다.

jw-configtage-6

AWS Config의 규칙을 확인해 보면, 미준수 리소스가 검출되었다는 결과를 확인할 수 있습니다.

jw-configtage-7

지정한 이메일로도 성공적으로 통지가 날아오는 것을 확인할 수 있습니다.

jw-configtage-8

이메일 내용대로 해당 리소스를 찾아 태그를 추가해 봅시다.

jw-configtage-10

다시 Config 콘솔 화면으로 돌아와 규칙을 확인해 보면, [탐지 규정 준수]가 [준수]로 변경된 것을 확인할 수 있습니다.

jw-configtage-11

문의 사항은 클래스메소드 코리아로!

클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트는 아래 페이지를 참고해주세요.

https://classmethod.kr/board/library

AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.