AWS Config를 사용하여 규정 미준수 Lambda 배포 및 구성 감지
선제적 평가 외에도 AWS Config에서는 거버넌스 정책을 준수하지 않는 리소스 배포 및 구성을 사후 대응적으로 감지할 수 있습니다. 이 기능은 조직이 새로운 모범 사례를 학습하고 구현함에 따라 거버넌스 정책도 발전하기 때문에 중요합니다.
Lambda 함수를 배포하거나 업데이트할 때 완전히 새로운 정책을 설정하는 시나리오를 고려합니다. 모든 Lambda 함수는 항상 승인된 특정 Lambda 계층 버전을 사용해야 합니다. 계층 구성을 위해 새 함수 또는 업데이트된 함수를 모니터링하도록 AWS Config를 구성할 수 있습니다. AWS Config에서 승인된 계층 버전을 사용하지 않는 함수를 탐지하면 해당 함수에 비준수 리소스로 플래그를 지정합니다. 선택적으로 AWS Systems Manager 자동화 문서를 사용하여 수정 조치를 지정함으로써 리소스를 자동으로 수정하도록 AWS Config를 구성할 수 있습니다. 예를 들어, AWS SDK for Python (Boto3)을 사용하여 Python에서 승인된 계층 버전을 가리키도록 규정 미준수 함수를 업데이트하는 자동화 문서를 작성할 수 있습니다. 이를 통해 AWS Config에서는 감지 및 수정 제어 기능을 모두 지원하며 규정 준수 관리를 자동화합니다.
이 프로세스를 세 가지 중요한 구현 단계로 나누어 보겠습니다.
1단계: 액세스 리소스 식별
먼저 여러 계정을 AWS Config를 활성화하고 AWS Lambda 함수를 기록하도록 구성합니다. 그러면 AWS Config에서 Lambda 함수가 생성되거나 업데이트되는 시점을 관찰할 수 있습니다. 그런 다음, 특정 정책 위반을 검사하도록 사용자 지정 정책 규칙을 구성합니다. 이때 AWS CloudFormation Guard 구문을 사용합니다. Guard 규칙은 다음과 같은 일반적인 양식을 사용합니다.
rule name when condition { assertion }
다음은 계층이 이전 계층 버전으로 설정되지 않았는지 확인하는 샘플 규칙입니다.
rule desiredlayer when configuration.layers !empty { some configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn }
규칙 구문과 구조를 살펴봅니다.
-
규칙 이름: 제공된 예제의 규칙 이름은
desiredlayer
입니다. -
조건: 이 절은 규칙을 확인해야 하는 조건을 지정합니다. 제공된 예제에서 조건은
configuration.layers !empty
입니다. 즉, 구성의layers
속성이 비어 있지 않은 경우에만 리소스를 평가해야 합니다. -
어설션:
when
절 뒤의 어설션은 규칙이 검사하는 대상을 결정합니다.some configuration.layers[*].arn != CONFIG_RULE_PARAMETERS.OldLayerArn
어설션은 Lambda 계층 ARN이OldLayerArn
값과 일치하지 않는지 확인합니다. 일치하지 않으면 어설션은 true이고 규칙은 통과됩니다. 그렇지 않으면 실패합니다.
CONFIG_RULE_PARAMETERS
는 AWS Config 규칙으로 구성된 특별한 파라미터 세트입니다. 이 경우 OldLayerArn
은 CONFIG_RULE_PARAMETERS
내부의 파라미터입니다. 이를 통해 사용자는 오래되었거나 더 이상 사용되지 않는 것으로 간주되는 특정 ARN 값을 제공할 수 있으며, 이후 이 규칙은 Lambda 함수가 이 오래된 ARN을 사용하고 있는지 확인합니다.
2단계: 시각화 및 설계
AWS Config에서는 구성 데이터를 수집하고 Amazon Simple Storage Service(Amazon S3) 버킷에 저장합니다. Amazon Athena
다음은 특정 계층 ARN을 사용하여 모든 Lambda 함수를 식별하기 위한 샘플 Athena 쿼리입니다.
WITH unnested AS ( SELECT item.awsaccountid AS account_id, item.awsregion AS region, item.configuration AS lambda_configuration, item.resourceid AS resourceid, item.resourcename AS resourcename, item.configuration AS configuration, json_parse(item.configuration) AS lambda_json FROM default.aws_config_configuration_snapshot, UNNEST(configurationitems) as t(item) WHERE "dt" = 'latest' AND item.resourcetype = 'AWS::Lambda::Function' ) SELECT DISTINCT region as Region, resourcename as FunctionName, json_extract_scalar(lambda_json, '$.memorySize') AS memory_size, json_extract_scalar(lambda_json, '$.timeout') AS timeout, json_extract_scalar(lambda_json, '$.version') AS version FROM unnested WHERE lambda_configuration LIKE '%arn:aws:lambda:us-east-1:111122223333:layer:AnyGovernanceLayer:24%'
쿼리 결과는 다음과 같습니다.
조직 전체에서 집계된 AWS Config 데이터를 사용하여 Amazon QuickSight
3단계: 구현 및 적용
이제 선택적으로 AWS SDK for Python (Boto3)에서 쓴 Python 스크립트로 작성한 Systems Manager 자동화 문서를 통해 1단계에서 생성한 계층 버전 규칙을 수정 조치와 페어링할 수 있습니다. 스크립트는 각 Lambda 함수에 대해 UpdateFunctionConfiguration API 작업을 직접 호출하여 새 계층 ARN으로 함수 구성을 업데이트합니다. 또는 스크립트가 코드 리포지토리에 풀 요청을 제출하여 계층 ARN을 업데이트하도록 할 수도 있습니다. 그러면 향후 코드 배포 시에도 올바른 계층 ARN으로 업데이트됩니다.