AWS Config를 사용하는 Lambda의 사전 예방적 제어 - AWS Lambda

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

AWS Config를 사용하는 Lambda의 사전 예방적 제어

가능하면 개발 프로세스 초기에 서버리스 애플리케이션의 규정 준수를 보장하는 것이 중요합니다. 이 주제에서는 AWS Config를 사용하여 사전 예방적 제어를 구현하는 방법을 다룹니다. 이를 통해 개발 프로세스 초기에 규정 준수 검사를 구현하고 CI/CD 파이프라인에서 동일한 제어를 구현할 수 있습니다. 또한 AWS 계정 전체에서 제어를 일관되게 적용할 수 있도록 중앙에서 관리되는 규칙 리포지토리에서 제어를 표준화합니다.

예를 들어 규정 준수 관리자가 모든 Lambda 함수에 AWS X-Ray 추적 기능을 포함하는 요구 사항을 정의한다고 가정합니다. AWS Config의 사전 예방 모드를 사용하면 배포 전에 Lambda 함수 리소스에서 규정 준수 검사를 실행하여 잘못 구성된 Lambda 함수를 배포할 위험을 줄이고 코드형 인프라 템플릿에서 피드백을 더 빠르게 제공하여 개발자의 시간을 절약할 수 있습니다. 다음은 AWS Config를 사용하는 사전 예방적 제어의 흐름을 시각화한 것입니다.


      AWS CloudFormation requests must pass AWS Config rules before provisioning.

모든 Lambda 함수에 추적 기능이 활성화되어 있어야 하는 요구 사항을 고려합니다. 이에 대한 응답으로 플랫폼 팀은 모든 계정에서 사전 예방적으로 특정 AWS Config 규칙을 실행해야 할 필요성을 식별합니다. 이 규칙은 구성된 X-Ray 트레이싱 구성이 없는 모든 Lambda 함수에 규정 미준수 리소스로 플래그를 지정합니다. 팀은 규칙을 개발하고, 이를 적합성 팩으로 패키징한 후, 조직의 모든 계정이 이러한 제어를 균일하게 적용하도록 모든 AWS 계정에 적합성 팩을 배포합니다. 다음 형식을 사용하는 AWS CloudFormation Guard 2.x.x 구문으로 규칙을 작성할 수 있습니다.

rule name when condition { assertion }

다음은 Lambda 함수에 트레이싱 기능이 활성화되어 있는지 확인하는 샘플 Guard 규칙입니다.

rule lambda_tracing_check { when configuration.tracingConfig exists { configuration.tracingConfig.mode == "Active" } }

플랫폼 팀은 모든 AWS CloudFormation 배포에서 사전 생성 또는 업데이트 후크를 간접 호출하도록 요구하여 추가 조치를 수행합니다. 이 후크를 개발하고 파이프라인을 구성하며 규정 준수 규칙의 중앙 집중식 제어를 강화하고 모든 배포에서 일관된 적용을 유지하는 일은 플랫폼 팀의 책임입니다. 후크를 개발, 패키징 및 등록하려면 CloudFormation 명령줄 인터페이스 (CFN-CLI) 설명서에서 AWS CloudFormation후크 개발을 참조하십시오. CloudFormation CLI를 사용하여 후크 프로젝트를 생성할 수 있습니다.

cfn init

이 명령은 후크 프로젝트에 대한 몇 가지 기본 정보를 요청하고 다음 파일이 포함된 프로젝트를 생성합니다.

README.md <hook-name>.json rpdk.log src/handler.py template.yml hook-role.yaml

후크 개발자인 경우 <hook-name>.json 구성 파일에 원하는 대상 리소스 유형을 추가해야 합니다. 아래 구성에서는 를 사용하여 Lambda 함수를 생성하기 전에 후크가 실행되도록 구성되어 있습니다. CloudFormation preUpdatepreDelete 작업에도 유사한 핸들러를 추가할 수 있습니다.

"handlers": { "preCreate": { "targetNames": [ "AWS::Lambda::Function" ], "permissions": [] } }

또한 CloudFormation 후크에 API를 호출할 수 있는 적절한 권한이 있는지 확인해야 합니다AWS Config. hook-role.yaml이라는 역할 정의 파일을 업데이트하여 이 작업을 수행할 수 있습니다. 역할 정의 파일에는 기본적으로 다음과 같은 신뢰 정책이 있으며, 이 정책을 통해 역할을 CloudFormation 수임할 수 있습니다.

AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - hooks.cloudformation.amazonaws.com - resources.cloudformation.amazonaws.com

이 후크가 구성 API를 직접 호출하도록 허용하려면 정책 명령에 다음 권한을 추가해야 합니다. 그런 다음 cfn submit 명령을 사용하여 후크 프로젝트를 제출하면 필요한 권한이 부여된 역할이 자동으로 CloudFormation 생성됩니다.

Policies: - PolicyName: HookTypePolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - "config:Describe*" - "config:Get*" - "config:List*" - "config:SelectResourceConfig" Resource: "*

다음으로 src/handler.py 파일에 Lambda 함수를 작성해야 합니다. 이 파일에는 프로젝트 시작 시 이름이 preCreate, preUpdate, preDelete인 메서드가 이미 생성되어 있습니다. AWS SDK for Python (Boto3)을 사용하여 사전 예방적 모드에서 AWS Config StartResourceEvaluation API를 직접 호출하는 재사용 가능한 공통 함수를 작성하는 것을 목표로 합니다. 이 API 직접 호출은 리소스 속성을 입력으로 사용하고 규칙 정의를 기준으로 리소스를 평가합니다.

def validate_lambda_tracing_config(resource_type, function_properties: MutableMapping[str, Any]) -> ProgressEvent: LOG.info("Fetching proactive data") config_client = boto3.client('config') resource_specs = { 'ResourceId': 'MyFunction', 'ResourceType': resource_type, 'ResourceConfiguration': json.dumps(function_properties), 'ResourceConfigurationSchemaType': 'CFN_RESOURCE_SCHEMA' } LOG.info("Resource Specifications:", resource_specs) eval_response = config_client.start_resource_evaluation(EvaluationMode='PROACTIVE', ResourceDetails=resource_specs, EvaluationTimeout=60) ResourceEvaluationId = eval_response.ResourceEvaluationId compliance_response = config_client.get_compliance_details_by_resource(ResourceEvaluationId=ResourceEvaluationId) LOG.info("Compliance Verification:", compliance_response.EvaluationResults[0].ComplianceType) if "NON_COMPLIANT" == compliance_response.EvaluationResults[0].ComplianceType: return ProgressEvent(status=OperationStatus.FAILED, message="Lambda function found with no tracing enabled : FAILED", errorCode=HandlerErrorCode.NonCompliant) else: return ProgressEvent(status=OperationStatus.SUCCESS, message="Lambda function found with tracing enabled : PASS.")

이제 사전 생성 후크의 핸들러에서 공통 함수를 직접 호출할 수 있습니다. 다음은 핸들러 예제입니다.

@hook.handler(HookInvocationPoint.CREATE_PRE_PROVISION) def pre_create_handler( session: Optional[SessionProxy], request: HookHandlerRequest, callback_context: MutableMapping[str, Any], type_configuration: TypeConfigurationModel ) -> ProgressEvent: LOG.info("Starting execution of the hook") target_name = request.hookContext.targetName LOG.info("Target Name:", target_name) if "AWS::Lambda::Function" == target_name: return validate_lambda_tracing_config(target_name, request.hookContext.targetModel.get("resourceProperties") ) else: raise exceptions.InvalidRequest(f"Unknown target type: {target_name}")

이 단계 이후에 후크를 등록하고 모든 AWS Lambda 함수 생성 이벤트를 수신하도록 구성할 수 있습니다.

개발자가 Lambda를 사용하여 서버리스 마이크로서비스를 위한 코드형 인프라(IaC) 템플릿을 준비합니다. 이 준비 작업에는 내부 표준을 준수한 후 템플릿을 로컬에서 테스트하고 리포지토리에 커밋하는 작업이 포함됩니다. 다음은 예제 IaC 템플릿입니다.

MyLambdaFunction: Type: 'AWS::Lambda::Function' Properties: Handler: index.handler Role: !GetAtt LambdaExecutionRole.Arn FunctionName: MyLambdaFunction Code: ZipFile: | import json def handler(event, context): return { 'statusCode': 200, 'body': json.dumps('Hello World!') } Runtime: python3.8 TracingConfig: Mode: PassThrough MemorySize: 256 Timeout: 10

CI/CD 프로세스의 일부로, CloudFormation 템플릿이 배포되면 CloudFormation 서비스는 리소스 유형을 프로비저닝하기 바로 전에 사전 생성/업데이트 후크를 호출합니다. AWS::Lambda::Function 후크는 사전 예방적 모드에서 실행되는 AWS Config 규칙을 활용하여 Lambda 함수 구성에 필수 트레이싱 구성이 포함되어 있는지 확인합니다. 후크의 응답에 따라 다음 단계가 결정됩니다. 규정을 준수하는 경우 후크는 성공 신호를 보내고 리소스 프로비저닝을 진행합니다. CloudFormation 그렇지 않으면 CloudFormation 스택 배포가 실패하고 파이프라인은 즉시 중단되며 시스템은 후속 검토를 위해 세부 정보를 기록합니다. 규정 준수 알림이 관련 이해관계자에게 전송됩니다.

콘솔에서 후크 성공/실패 정보를 찾을 수 있습니다. CloudFormation


      Hook success/fail information in the AWS CloudFormation console

후크에 로그가 활성화되어 있는 경우 CloudFormation 후크 평가 결과를 캡처할 수 있습니다. 다음은 실패 상태의 후크에 대한 샘플 로그로, Lambda 함수에서 X-Ray가 활성화되지 않았음을 나타냅니다.


      Sample log for a hook with a failed status

개발자가 IaC를 변경하여 TracingConfig Mode 값을 Active로 업데이트하고 다시 배포하도록 선택하면 후크가 성공적으로 실행되고 스택에서 Lambda 리소스 생성을 진행합니다.


      AWS CloudFormation console shows successful resource deployment

이렇게 하면 AWS 계정에서 서버리스 리소스를 개발하고 배포할 때 AWS Config에서 사전 예방적 모드로 예방 제어를 구현할 수 있습니다. AWS Config 규칙을 CI/CD 파이프라인에 통합하면 활성 트레이싱 구성이 없는 Lambda 함수와 같이 규정 미준수 리소스 배포를 식별하고 선택적으로 차단할 수 있습니다. 이렇게 하면 최신 거버넌스 정책을 준수하는 리소스만 AWS 환경에 배포할 수 있습니다.