제퍼넷 로고

Amazon MWAA의 공유 VPC 지원 소개 | 아마존 웹 서비스

시간

이 게시물에서는 배포 자동화를 시연합니다. Apache Airflow용 Amazon 관리형 워크플로 (Amazon MWAA) VPC에서 고객 관리 엔드포인트를 사용하여 공유 또는 제한된 VPC와의 호환성을 제공합니다.

데이터 과학자와 엔지니어가 만든 아파치 에어 플로우 활발한 오픈 소스 커뮤니티, DAG(방향성 비순환 그래프) 워크플로와 같은 친숙한 Python 개발, 사전 구축된 통합의 광범위한 라이브러리를 통해 데이터 파이프라인을 생성하는 선도적인 오픈 소스 도구입니다. Amazon MWAA는 기본 인프라를 관리해야 하는 운영 부담 없이 AWS에서 Airflow를 쉽게 실행할 수 있게 해주는 Airflow용 관리형 서비스입니다. 각 Airflow 환경에 대해 Amazon MWAA는 상태를 저장하는 메타데이터베이스와 사용자 인터페이스를 제공하는 웹 서버를 호스팅하는 단일 테넌트 서비스 VPC를 생성합니다. Amazon MWAA는 고객 리소스와 상호 작용하는 작업을 예약하고 실행하기 위해 고객이 소유하고 관리하는 VPC에서 Airflow 스케줄러와 작업자 인스턴스를 추가로 관리합니다. 고객 VPC의 Airflow 컨테이너는 다음을 통해 서비스 VPC의 리소스에 액세스합니다. VPC 엔드포인트.

많은 조직이 다음을 선택합니다. VPC를 중앙에서 관리 사용 AWS 조직, 소유자 계정의 VPC를 다른 참가자 계정의 리소스와 공유할 수 있습니다. 그러나 VPC 외부에서 새 경로를 생성하는 것은 권한 있는 작업으로 간주되므로 참가자 계정은 소유자 VPC에 엔드포인트를 생성할 수 없습니다. 또한 많은 고객은 Amazon MWAA 환경을 프로비저닝하는 모든 사용자에게 VPC 엔드포인트를 생성하는 데 필요한 보안 권한을 확장하고 싶어하지 않습니다. 고객은 VPC 엔드포인트 외에도 다음을 통해 데이터 송신을 제한하기를 원합니다. 아마존 단순 대기열 서비스 (Amazon SQS) 대기열이 있으며 Amazon SQS 액세스는 아마존 MWAA 아키텍처.

Amazon MWAA에 대한 공유 VPC 지원은 VPC 내에서 자체 엔드포인트를 관리할 수 있는 기능을 추가하여 공유 및 제한된 VPC에 대한 호환성을 추가합니다. 고객 관리형 엔드포인트를 지정하면 VPC 리소스 액세스를 Amazon MWAA 환경에 필요한 것만으로 명시적으로 제한하여 엄격한 보안 정책을 충족할 수 있는 기능도 제공됩니다. 이 게시물에서는 고객 관리형 엔드포인트가 Amazon MWAA와 어떻게 작동하는지 보여주고 해당 엔드포인트 프로비저닝을 자동화하는 방법에 대한 예를 제공합니다.

솔루션 개요

Amazon MWAA에 대한 공유 VPC 지원을 통해 여러 AWS 계정이 중앙에서 관리되는 공유 VPC로 Airflow 환경을 생성할 수 있습니다. VPC를 소유한 계정(소유자)은 Amazon MWAA에 필요한 프라이빗 서브넷 XNUMX개를 AWS Organizations의 동일한 조직에 속한 다른 계정(참가자)과 공유합니다. 서브넷이 공유되면 참가자는 공유된 서브넷에서 Amazon MWAA 환경을 보고, 생성하고, 수정하고, 삭제할 수 있습니다.

사용자가 환경 생성 중에 공유 또는 정책 제한 VPC에 대한 필요성을 지정하면 Amazon MWAA는 먼저 서비스 VPC 리소스를 생성한 다음 최대 72시간 동안 보류 상태로 진입합니다. 아마존 이벤트 브리지 상태 변경에 대한 알림. 이를 통해 소유자는 Amazon MWAA 콘솔이나 API의 엔드포인트 서비스 정보를 기반으로 또는 프로그래밍 방식으로 참가자를 대신하여 필요한 엔드포인트를 생성할 수 있습니다. AWS 람다 이 게시물의 예와 같이 함수 및 EventBridge 규칙을 사용합니다.

소유자 계정에 엔드포인트가 생성되면 단일 테넌트 Amazon MWAA VPC의 엔드포인트 서비스가 엔드포인트 연결 이벤트를 감지하고 환경 생성을 재개합니다. 문제가 있는 경우 대기 중 상태에서 환경을 삭제하여 환경 생성을 취소할 수 있습니다.

이 기능을 사용하면 VPCE 권한 생성, 수정, 삭제 인사말 AWS 자격 증명 및 액세스 관리 공유 VPC를 사용하지 않는 경우에도 Amazon MWAA 환경을 생성하는 (IAM) 주체. 왜냐하면 해당 권한은 대신 엔드포인트를 생성하는 IAM 주체(이 예에서는 Lambda 함수)에 부여되기 때문입니다. 또한 Amazon MWAA 환경은 Airflow Celery Executor에서 작업 대기열(Celery Executor 대기열)에 사용하는 SQS 대기열 Amazon 리소스 이름(ARN)을 제공하므로 사용자는 해당 리소스를 명시적으로 제공할 필요 없이 네트워크 정책에 해당 리소스를 입력할 수 있습니다. 더욱 개방적이고 일반화된 허가.

이 예에서는 동일한 계정에 VPC 및 Amazon MWAA 환경을 생성합니다. 계정 간 공유 VPC의 경우 EventBridge 규칙과 Lambda 함수는 소유자 계정에 존재하고 Amazon MWAA 환경은 참가자 계정에 생성됩니다. 보다 AWS 계정 간 Amazon EventBridge 이벤트 전송 및 수신

사전 조건

다음과 같은 전제 조건이 있어야 합니다.

  • AWS 계정
  • VPC, VPC 엔드포인트 및 Amazon MWAA 환경을 생성할 권한이 있는 해당 계정의 AWS 사용자
  • An 아마존 단순 스토리지 서비스 (Amazon S3)라는 폴더가 있는 해당 계정의 버킷 dags

VPC 생성

먼저 다음을 사용하여 제한적인 VPC를 생성합니다. AWS 클라우드 포메이션 필요한 VPC 엔드포인트 생성 및 SQS 엔드포인트 정책 수정을 시뮬레이션하기 위한 템플릿입니다. 기존 VPC를 사용하려는 경우 다음 섹션으로 진행할 수 있습니다.

  1. AWS CloudFormation 콘솔에서 스택 생성 선택하고 새로운 리소스 사용(표준).
  2. $XNUMX Million 미만 템플릿을 지정하고, 선택 템플릿 파일을 업로드합니다.
  3. 이제 CloudFormation 템플릿을 편집하여 Amazon SQS에 대한 액세스를 제한합니다. ~ 안에 cfn-vpc-private-bjs.yml편집 SqsVpcEndoint 섹션이 다음과 같이 표시됩니다.
 SqsVpcEndoint: Type: AWS::EC2::VPCEndpoint Properties: ServiceName: !Sub "com.amazonaws.${AWS::Region}.sqs" VpcEndpointType: Interface VpcId: !Ref VPC PrivateDnsEnabled: true SubnetIds: - !Ref PrivateSubnet1 - !Ref PrivateSubnet2 SecurityGroupIds: - !Ref SecurityGroup PolicyDocument: Statement: - Effect: Allow Principal: '*' Action: '*' Resource: []

이 추가 정책 문서 항목은 Amazon SQS가 명시적으로 나열되지 않은 리소스로 송신되는 것을 방지합니다.

이제 CloudFormation 스택을 생성할 수 있습니다.

  1. AWS CloudFormation 콘솔에서 스택 생성.
  2. 선택 템플릿 파일 업로드.
  3. 왼쪽 메뉴에서 파일 선택.
  4. 수정한 파일을 찾습니다.
  5. 왼쪽 메뉴에서 다음 보기.
  6. 럭셔리 스택 이름, 입력 MWAA-Environment-VPC.
  7. 왼쪽 메뉴에서 다음 보기 리뷰 페이지에 도달할 때까지
  8. 왼쪽 메뉴에서 문의하기.

Lambda 함수 생성

엔드포인트를 자체 관리하는 데는 수동과 자동이라는 두 가지 옵션이 있습니다. 이 예에서는 Amazon MWAA EventBridge 알림에 응답하는 Lambda 함수를 생성합니다. EventBridge 알림을 사용하여 다음을 보낼 수도 있습니다. 아마존 단순 알림 서비스 (Amazon SNS) 메시지(예: 이메일)를 VPC 엔드포인트를 수동으로 생성할 권한이 있는 사람에게 전송합니다.

먼저 Amazon MWAA에서 발생하는 EventBridge 이벤트에 응답하는 Lambda 함수를 생성합니다.

  1. Lambda 콘솔에서 기능 만들기.
  2. 럭셔리 성함, 입력 mwaa-create-lambda.
  3. 럭셔리 런타임선택한다. 파이썬 3.11.
  4. 왼쪽 메뉴에서 기능 만들기.
  5. 럭셔리 암호,에 소스 코드 섹션 lambda_function다음 코드를 입력하십시오.
    import boto3
    import json
    import logging logger = logging.getLogger()
    logger.setLevel(logging.INFO) def lambda_handler(event, context): if event['detail']['status']=="PENDING": detail=event['detail'] name=detail['name'] celeryExecutorQueue=detail['celeryExecutorQueue'] subnetIds=detail['networkConfiguration']['subnetIds'] securityGroupIds=detail['networkConfiguration']['securityGroupIds'] databaseVpcEndpointService=detail['databaseVpcEndpointService'] # MWAA does not need to store the VPC ID, but we can get it from the subnets client = boto3.client('ec2') response = client.describe_subnets(SubnetIds=subnetIds) logger.info(response['Subnets'][0]['VpcId']) vpcId=response['Subnets'][0]['VpcId'] logger.info("vpcId: " + vpcId) webserverVpcEndpointService=None if detail['webserverAccessMode']=="PRIVATE_ONLY": webserverVpcEndpointService=event['detail']['webserverVpcEndpointService'] response = client.describe_vpc_endpoints( VpcEndpointIds=[], Filters=[ {"Name": "vpc-id", "Values": [vpcId]}, {"Name": "service-name", "Values": ["*.sqs"]}, ], MaxResults=1000 ) sqsVpcEndpoint=None for r in response['VpcEndpoints']: if subnetIds[0] in r['SubnetIds'] or subnetIds[0] in r['SubnetIds']: # We are filtering describe by service name, so this must be SQS sqsVpcEndpoint=r break if sqsVpcEndpoint: logger.info("Found SQS endpoint: " + sqsVpcEndpoint['VpcEndpointId']) logger.info(sqsVpcEndpoint) pd = json.loads(sqsVpcEndpoint['PolicyDocument']) for s in pd['Statement']: if s['Effect']=='Allow': resource = s['Resource'] logger.info(resource) if '*' in resource: logger.info("'*' already allowed") elif celeryExecutorQueue in resource: logger.info("'"+celeryExecutorQueue+"' already allowed") else: s['Resource'].append(celeryExecutorQueue) logger.info("Updating SQS policy to " + str(pd)) client.modify_vpc_endpoint( VpcEndpointId=sqsVpcEndpoint['VpcEndpointId'], PolicyDocument=json.dumps(pd) ) break # create MWAA database endpoint logger.info("creating endpoint to " + databaseVpcEndpointService) endpointName=name+"-database" response = client.create_vpc_endpoint( VpcEndpointType='Interface', VpcId=vpcId, ServiceName=databaseVpcEndpointService, SubnetIds=subnetIds, SecurityGroupIds=securityGroupIds, TagSpecifications=[ { "ResourceType": "vpc-endpoint", "Tags": [ { "Key": "Name", "Value": endpointName }, ] }, ], ) logger.info("created VPCE: " + response['VpcEndpoint']['VpcEndpointId']) # create MWAA web server endpoint (if private) if webserverVpcEndpointService: endpointName=name+"-webserver" logger.info("creating endpoint to " + webserverVpcEndpointService) response = client.create_vpc_endpoint( VpcEndpointType='Interface', VpcId=vpcId, ServiceName=webserverVpcEndpointService, SubnetIds=subnetIds, SecurityGroupIds=securityGroupIds, TagSpecifications=[ { "ResourceType": "vpc-endpoint", "Tags": [ { "Key": "Name", "Value": endpointName }, ] }, ], ) logger.info("created VPCE: " + response['VpcEndpoint']['VpcEndpointId']) return { 'statusCode': 200, 'body': json.dumps(event['detail']['status']) }

  6. 왼쪽 메뉴에서 배포.
  7. 구성 Lambda 함수 탭의 일반 구성 섹션 선택 편집.
  8. 럭셔리 시간 초과, 5분 0초로 증가합니다.
  9. 왼쪽 메뉴에서 찜하기.
  10. . 권한 섹션 아래 실행 역할에서 역할 이름을 선택하여 이 기능의 권한을 편집합니다.
  11. 럭셔리 권한 정책, 아래 링크를 선택하세요 정책 이름.
  12. 왼쪽 메뉴에서 편집 쉼표와 다음 명령문을 추가합니다.
    { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ec2:DescribeVpcEndpoints", "ec2:CreateVpcEndpoint", "ec2:ModifyVpcEndpoint", "ec2:DescribeSubnets", "ec2:CreateTags" ], "Resource": [ "*" ]
    }

전체 정책은 다음과 유사해야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-east-1:112233445566:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-east-1:112233445566:log-group:/aws/lambda/mwaa-create-lambda:*" ] }, { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ec2:DescribeVpcEndpoints", "ec2:CreateVpcEndpoint", "ec2:ModifyVpcEndpoint", "ec2:DescribeSubnets", "ec2:CreateTags" ], "Resource": [ "*" ] } ]
}

  1. 왼쪽 메뉴에서 다음 보기 리뷰 페이지에 도달할 때까지
  2. 왼쪽 메뉴에서 변경 사항을 저장합니다.

EventBridge 규칙 생성

다음으로 Amazon MWAA 알림을 Lambda 함수로 보내도록 EventBridge를 구성합니다.

  1. EventBridge 콘솔에서 다음을 선택합니다. 규칙 만들기.
  2. 럭셔리 성함, mwaa-create를 입력하세요.
  3. 선택 이벤트 패턴이 있는 규칙.
  4. 왼쪽 메뉴에서 다음 보기.
  5. 럭셔리 생성 방법선택한다. 사용자 패턴 형태.
  6. 왼쪽 메뉴에서 패턴 수정.
  7. 럭셔리 이벤트 패턴, 다음을 입력:
    { "source": ["aws.airflow"], "detail-type": ["MWAA Environment Status Change"]
    }

  8. 왼쪽 메뉴에서 다음 보기.
  9. 럭셔리 타겟을 선택하세요선택한다. 람다 함수.

환경 상태가 변경될 때 메시지를 받기 위해 SNS 알림을 지정할 수도 있습니다.s.

  1. 럭셔리 함수선택한다. mwaa-create-lambda.
  2. 왼쪽 메뉴에서 다음 보기 마지막 섹션에 도달할 때까지 다음을 선택하세요. 규칙 만들기.

Amazon MWAA 환경 생성

마지막으로 고객 관리형 엔드포인트를 갖춘 Amazon MWAA 환경을 생성합니다.

  1. Amazon MWAA 콘솔에서 다음을 선택합니다. 환경 조성.
  2. 럭셔리 성함에서 환경에 대한 고유한 이름을 입력합니다.
  3. 럭셔리 기류 버전, 최신 Airflow 버전을 선택하세요.
  4. 럭셔리 S3 버킷선택한다. S3 찾아보기 S3 버킷을 선택하거나 Amazon S3 URI를 입력하세요.
  5. 럭셔리 DAG 폴더선택한다. S3 찾아보기 선택하고 dags/ 폴더를 S3 버킷에 추가하거나 Amazon S3 URI를 입력합니다.
  6. 왼쪽 메뉴에서 다음 보기.
  7. 럭셔리 가상 프라이빗 클라우드에서 이전에 생성한 VPC를 선택합니다.
  8. 럭셔리 웹 서버 액세스선택한다. 공용 네트워크(인터넷 접속 가능).
  9. 럭셔리 보안 그룹, 선택 취소 새 보안 그룹 생성.
  10. CloudFormation 템플릿으로 생성된 공유 VPC 보안 그룹을 선택합니다.

왜냐하면 보안 그룹은 AWS 프라이빗링크 이전 단계의 엔드포인트는 자체 참조이므로 Amazon MWAA 환경에 대해 동일한 보안 그룹을 선택해야 합니다.

  1. 럭셔리 엔드포인트 관리선택한다. 고객 관리 엔드포인트.
  2. 나머지 설정을 기본값으로 유지하고 다음을 선택합니다. 다음 보기.
  3. 왼쪽 메뉴에서 환경 조성.

환경을 사용할 수 있으면 다음을 통해 액세스할 수 있습니다. Airflow UI 열기 Amazon MWAA 콘솔의 링크입니다.

정리

적극적으로 사용되지 않는 리소스를 정리하면 비용이 절감되므로 모범 사례입니다. 리소스를 삭제하지 않으면 추가 요금이 발생할 수 있습니다. 리소스를 정리하려면 다음 단계를 완료하세요.

  1. 당신을 삭제하십시오 아마존 MWAA 환경, EventBridge 규칙람다 함수.
  2. 삭제 VPC 엔드 포인트 Lambda 함수에 의해 생성됩니다.
  3. 삭제 보안 그룹 해당되는 경우 생성됩니다.
  4. 위 리소스 삭제가 완료된 후, CloudFormation 스택 나머지 리소스를 모두 제거했는지 확인하세요.

요약

이 게시물에서는 Amazon MWAA에서 공유 VPC 지원을 통해 환경 생성을 자동화하는 방법을 설명했습니다. 이를 통해 VPC 내에서 자체 엔드포인트를 관리하고 공유 또는 제한된 VPC에 호환성을 추가할 수 있는 기능을 제공합니다. 고객 관리 엔드포인트를 지정하면 VPC 리소스 액세스를 Amazon MWAA 환경에 필요한 것만으로 명시적으로 제한하여 엄격한 보안 정책을 충족할 수 있는 기능도 제공됩니다. Amazon MWAA에 대해 자세히 알아보려면 다음을 참조하세요. Amazon MWAA 사용 설명서. Amazon MWAA에 대한 더 많은 게시물을 보려면 다음을 방문하세요. Amazon MWAA 리소스 페이지.


저자,

존 잭슨 스타트업과 대기업에서 개발자, 시스템 아키텍트, 제품 관리자로 25년 이상의 소프트웨어 경험을 보유하고 있으며 Amazon MWAA를 담당하는 AWS 수석 제품 관리자입니다.

spot_img

최신 인텔리전스

spot_img