Amazon VPC에서 Amazon SNS 메시지 게시 - Amazon Simple Notification Service

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

Amazon VPC에서 Amazon SNS 메시지 게시

이 섹션에서는 프라이빗 네트워크에서 메시지를 안전하게 유지하면서 Amazon SNS 주제에 게시하는 방법을 설명합니다. Amazon Virtual Private Cloud(Amazon VPC)에서 호스팅되는 Amazon EC2 인스턴스에서 메시지를 게시합니다. 이 메시지는 퍼블릭 인터넷으로 이동하지 않고 AWS 네트워크 내에 머물러 있습니다. VPC에서 메시지를 비공개로 게시하면 애플리케이션과 Amazon SNS 간 트래픽의 보안을 강화할 수 있습니다. 이 보안은 고객에 관한 개인 식별 정보(PII)를 게시할 때 또는 애플리케이션에 시장 규정이 적용될 때 중요합니다. 예를 들어 미국 건강 보험 이전 및 책임법(HIPAA)을 준수해야 하는 의료 서비스 시스템이나 지불 카드 산업 데이터 보안 표준(PCI DSS)을 준수해야 하는 금융 시스템을 보유한 경우 비공개로 게시하는 것이 도움이 됩니다.

일반적인 단계는 다음과 같습니다.

  • AWS CloudFormation 템플릿을 사용하여 AWS 계정에서 임시 프라이빗 네트워크를 자동으로 생성합니다.

  • VPC를 Amazon SNS와 연결하는 VPC 엔드포인트를 생성합니다.

  • Amazon EC2 인스턴스에 로그인하여 Amazon SNS 주제에 메시지를 비공개로 게시합니다.

  • 메시지가 성공적으로 전송되었는지 확인합니다.

  • 이 프로세스에서 생성한 리소스를 삭제하여 AWS 계정에 남아 있지 않게 합니다.

아래 다이어그램은 이 단계들을 완료하면 AWS 계정에 생성되는 프라이빗 네트워크를 나타낸 것입니다.

이 단계에서 생성하는 프라이빗 네트워크의 아키텍처.

이 네트워크는 Amazon EC2 인스턴스를 포함하는 VPC로 구성됩니다. 인스턴스는 인터페이스 VPC 엔드포인트를 통해 Amazon SNS에 연결합니다. 이러한 엔드포인트 유형은 AWS PrivateLink에서 제공하는 서비스에 연결됩니다. 이 연결이 설정되면 네트워크가 퍼블릭 인터넷에서 연결이 끊어져 있더라도 Amazon EC2 인스턴스에 로그인하여 Amazon SNS 주제에 메시지를 게시할 수 있습니다. 해당 주제는 수신한 메시지를 두 가지 구독 AWS Lambda 함수로 분산합니다. 이 두 함수는 수신한 메시지를 Amazon CloudWatch Logs에 로그합니다.

이 단계를 완료하는 데 약 20분 정도 소요됩니다.

시작하기 전에

시작하기 전에 Amazon Web Services(AWS) 계정에 로그인합니다. 가입하면 AWS에서 Amazon SNS 및 Amazon VPC를 포함한 모든 서비스에 계정이 자동으로 등록됩니다. 계정을 아직 만들지 않은 경우 https://aws.amazon.com/으로 이동한 다음 무료 계정 생성을 선택합니다.

1단계: Amazon EC2 키 페어 생성

키 페어는 Amazon EC2 인스턴스에 로그인하는 데 사용됩니다. 키 페어는 로그인 정보 암호화에 사용되는 퍼블릭 키와 로그인 정보 암호화 해제에 사용되는 프라이빗 키로 구성됩니다. 키 페어를 생성할 때 프라이빗 키의 사본을 다운로드합니다. 이후에 키 페어는 Amazon EC2 인스턴스에 로그인하는 데 사용됩니다. 로그인하려면 키 페어의 이름을 지정하고 프라이빗 키를 제공해야 합니다.

키 페어를 생성하려면
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 왼쪽의 탐색 메뉴에서 Network & Security 섹션을 찾습니다. 그다음에 키 페어를 선택합니다.

  3. 키 페어 생성(Create Key Pair)을 선택합니다.

  4. Create Key Pair(키 페어 생성) 창에서 Key pair name(키 페어 이름)VPCE-Tutorial-KeyPair를 입력합니다. 그다음에 생성을 선택합니다.

    키 페어 생성 창.
  5. 브라우저에서 프라이빗 키 파일이 자동으로 다운로드됩니다. 안전한 장소에 저장합니다. Amazon EC2는 파일에 .pem 확장자를 부여합니다.

  6. (선택 사항) Mac 또는 Linux 컴퓨터에서 SSH 클라이언트를 사용하여 인스턴스에 연결하는 경우 사용자만 프라이빗 키 파일을 읽을 수 있도록 다음과 같이 chmod 명령으로 프라이빗 키에 대한 권한을 설정합니다.

    1. 다음과 같이 터미널을 열고 프라이빗 키가 포함된 디렉터리로 이동합니다.

      $ cd /filepath_to_private_key/
    2. 다음 명령을 사용하여 권한을 설정합니다.

      $ chmod 400 VPCE-Tutorial-KeyPair.pem

2단계: AWS 리소스 생성

인프라를 설정하려면 AWS CloudFormation 템플릿을 사용하세요. 템플릿은 Amazon EC2 인스턴스 및 Amazon SNS 주제와 같은 AWS 리소스를 구축하기 위한 블루프린트 역할을 수행하는 파일입니다. 이 프로세스는 템플릿은 GitHub에서 다운로드할 수 있습니다.

사용자는 AWS CloudFormation에 템플릿을 제공하고 AWS CloudFormation에서는 AWS 계정에 스택으로 필요한 리소스를 프로비저닝합니다. 스택이란 사용자가 하나의 단위로 관리하는 리소스 모음입니다. 이 단계를 완료한 후 AWS CloudFormation을 사용하여 스택에 있는 모든 리소스를 한 번에 삭제할 수 있습니다. 이 리소스는 사용자가 원하지 않는 한 AWS 계정에 남아 있지 않습니다.

이 프로세스에서 사용할 스택으로 다음과 같은 리소스가 있습니다.

  • VPC 및 이에 연결된 네트워킹 리소스(예: 서브넷, 보안 그룹, 인터넷 게이트웨이, 라우팅 테이블)

  • VPC의 서브넷으로 시작되는 Amazon EC2 인스턴스.

  • Amazon SNS 주제.

  • 두 가지 AWS Lambda 함수. 이러한 함수는 Amazon SNS 주제에 게시되는 메시지를 수신하고 CloudWatch Logs에서 이벤트를 로그합니다.

  • Amazon CloudWatch 지표 및 로그.

  • Amazon EC2 인스턴스가 Amazon SNS를 사용하도록 허용하는 IAM 역할과 Lambda 함수가 CloudWatch 로그에 쓸 수 있도록 허용하는 IAM 역할.

AWS 리소스를 생성하려면
  1. GitHub 웹 사이트에서 템플릿 파일을 다운로드합니다.

  2. AWS CloudFormation 콘솔에 로그인합니다.

  3. 스택 생성을 선택합니다.

  4. 템플릿 선택 페이지에서 Amazon S3에 템플릿 업로드를 선택하고 파일을 선택한 후 다음을 선택합니다.

  5. 다음과 같이 세부 정보 지정 페이지에서 스택과 키 이름을 지정합니다.

    1. 스택 이름에는 VPCE-Tutorial-Stack을 입력합니다.

    2. KeyName에서 VPCE-Tutorial-KeyPair를 선택합니다.

    3. SSHLocation에서 기본값 0.0.0.0/0을 그대로 둡니다.

      세부 정보 지정 페이지.
    4. 다음을 선택합니다.

  6. 옵션 페이지에서 모든 기본값을 그대로 두고 다음을 선택합니다.

  7. 검토 페이지에서 스택 세부 정보를 확인합니다.

  8. 기능에서 AWS CloudFormation이 사용자 지정 이름으로 IAM 리소스를 생성할 수 있음을 인정합니다.

  9. Create를 선택합니다.

    AWS CloudFormation 콘솔에서 Stacks(스택) 페이지를 엽니다. VPCE-Tutorial-Stack은 CREATE_IN_PROGRESS 상태입니다. 몇 분 후 생성 프로세스가 완료되면 상태가 CREATE_COMPLETE으로 바뀝니다.

    CREATE_COMPLETE 상태의 AWS CloudFormation 스택.
    작은 정보

    Refresh(새로 고침) 버튼을 선택하여 최신 스택 상태를 확인합니다.

3단계: Amazon EC2 인스턴스에 인터넷 액세스 권한이 없는지 확인

이전 단계에서 VPC로 시작된 Amazon EC2 인스턴스에 인터넷 액세스 권한이 없습니다. 발신 트래픽을 허용하지 않고 Amazon SNS에 메시지를 게시할 수 없습니다. 인스턴스에 로그인하여 이를 확인합니다. 그런 다음 퍼블릭 엔드포인트에 연결을 시도하고 Amazon SNS에 메시지를 게시해 보세요.

이 시점에서는 게시 시도가 실패합니다. 나중 단계에서 Amazon SNS용 VPC 엔드포인트를 생성하고 나면 게시 시도가 성공합니다.

Amazon EC2 인스턴스에 연결하려면
  1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

  2. 왼쪽의 탐색 메뉴에서 인스턴스 섹션을 찾습니다. 그런 다음 인스턴스를 선택합니다.

  3. 인스턴스 목록에서 VPCE-Tutorial-EC2Instance를 선택합니다.

  4. 퍼블릭 DNS(IPv4) 열에 있는 호스트 이름을 복사합니다.

    AWS CloudFormation에서 시작된 Amazon EC2 인스턴스에 대한 세부 정보.
  5. 터미널을 엽니다. 키 페어가 포함된 디렉터리에서 다음 명령을 사용하여 인스턴스에 연결합니다. 여기에서 instance-hostname은 Amazon EC2 콘솔에서 복사한 호스트 이름입니다.

    $ ssh -i VPCE-Tutorial-KeyPair.pem ec2-user@instance-hostname
인스턴스가 인터넷에 연결되어 있지 않음을 확인하려면
  • 다음과 같이 터미널에서 amazon.com과 같은 퍼블릭 엔드포인트에 연결을 시도합니다.

    $ ping amazon.com

    연결 시도가 실패하므로 언제든지 취소할 수 있습니다(Windows에서는 Ctrl + C, macOS에서는 Command + C).

인스턴스가 Amazon SNS에 연결되어 있지 않음을 확인하려면
  1. Amazon SNS 콘솔에 로그인합니다.

  2. 왼쪽의 탐색 메뉴에서 주제를 선택합니다.

  3. 주제 페이지에서 VPCE-Tutorial-Topic이라는 주제의 Amazon 리소스 이름(ARN)을 복사합니다.

  4. 다음과 같이 터미널에서 주제에 메시지를 게시해 보세요.

    $ aws sns publish --region aws-region --topic-arn sns-topic-arn --message "Hello"

    게시 시도가 실패하므로 언제든지 취소할 수 있습니다.

4단계: Amazon SNS용 Amazon VPC 엔드포인트 생성

VPC를 Amazon SNS에 연결하려면 인터페이스 VPC 엔드포인트를 정의하세요. 엔드포인트를 추가한 후에는 VPC의 Amazon EC2 인스턴스에 로그인할 수 있으며 이 인스턴스에서 Amazon SNS API를 사용할 수 있습니다. 주제에 메시지를 게시할 수 있습니다. 메시지는 비공개로 게시됩니다. 메시지는 AWS 네트워크 내에 머물러 있고 퍼블릭 인터넷으로 이동하지 않습니다.

참고

인스턴스에는 여전히 다른 AWS 서비스 및 인터넷 상의 엔드포인트에 액세스할 수 있는 권한이 없습니다.

엔드포인트를 생성하려면
  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. 왼쪽의 탐색 메뉴에서 엔드포인트를 선택합니다.

  3. 엔드포인트 생성을 선택합니다.

  4. 엔드포인트 생성 페이지의 서비스 범주에서 기본 선택인 AWS 서비스를 그대로 둡니다.

  5. 서비스 이름에서 Amazon SNS의 서비스 이름을 선택합니다.

    서비스 이름은 선택한 리전에 따라 달라집니다. 예를 들어 미국 동부(버지니아 북부)를 선택한 경우 서비스 이름은 com.amazonaws.us-east-1.sns입니다.

  6. VPC에서 이름이 VPCE-Tutorial-VPC인 VPC를 선택합니다.

    엔드포인트 생성 페이지의 VPC 메뉴
  7. 서브넷에서 서브넷 ID에 VPCE-Tutorial-Subnet이 있는 서브넷을 선택합니다.

    엔드포인트 생성 페이지의 서브넷
  8. 프라이빗 DNS 이름 활성화에서 이 엔드포인트에 대해 활성화를 선택합니다.

  9. 보안 그룹에서 Select security group(보안 그룹 선택)을 선택하고 VPCE-Tutorial-SecurityGroup을 선택합니다.

    엔드포인트 생성 페이지의 보안 그룹
  10. 엔드포인트 생성을 선택합니다. Amazon VPC 콘솔은 VPC 엔드포인트가 생성되었음을 확인합니다.

    엔드포인트를 생성한 후에 표시된 확인 메시지.
  11. 닫기를 선택합니다.

    Amazon VPC 콘솔에서 엔드포인트 페이지가 열립니다. 새 엔드포인트의 상태는 대기 중입니다. 몇 분 후 생성 프로세스가 완료되면 상태가 사용 가능으로 바뀝니다.

    사용 가능 상태인 VPC 엔드포인트.

5단계: Amazon SNS 주제에 메시지 게시

이제 VPC에 Amazon SNS용 엔드포인트가 포함되므로 Amazon EC2 인스턴스에 로그인하여 주제에 메시지를 게시할 수 있습니다.

메시지를 게시하려면
  1. 터미널이 Amazon EC2 인스턴스에 연결되어 있지 않으면 다음과 같이 다시 연결합니다.

    $ ssh -i VPCE-Tutorial-KeyPair.pem ec2-user@instance-hostname
  2. Amazon SNS 주제에 메시지를 게시하기 위해 앞서 사용한 명령을 실행합니다. 이번에는 다음과 같이 게시 시도가 성공하고 Amazon SNS는 메시지 ID를 반환합니다.

    $ aws sns publish --region aws-region --topic-arn sns-topic-arn --message "Hello" { "MessageId": "5b111270-d169-5be6-9042-410dfc9e86de" }

6단계: 메시지 전송 확인

Amazon SNS 주제는 메시지를 수신하면 두 가지 구독 Lambda 함수로 전송하여 메시지를 분산합니다. 이 함수는 메시지를 받으면 이 이벤트를 CloudWatch 로그에 로그합니다. 메시지 전송이 성공했는지 확인하려면 함수가 호출되었는지 확인한 후 CloudWatch 로그가 업데이트되었는지 확인합니다.

Lambda 함수가 호출되었는지 확인하려면
  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 함수 페이지에서 VPCE-Tutorial-Lambda-1을 선택합니다.

  3. 모니터링을 선택합니다.

  4. 호출 횟수 그래프를 확인합니다. 이 그래프에서는 Lambda 함수가 실행된 횟수를 보여줍니다.

    호출 횟수는 메시지를 주제에 게시한 횟수와 일치합니다.

    Lambda 콘솔의 호출 횟수 그래프.
CloudWatch 로그가 업데이트되었는지 확인하려면
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 왼쪽 탐색 메뉴에서 로그를 선택합니다.

  3. 다음 방법으로 Lambda 함수가 쓴 로그를 확인합니다.

    1. /aws/lambda/VPCE-Tutorial-Lambda-1/ 로그 그룹을 선택합니다.

    2. 로그 스트림을 선택합니다.

    3. 로그에 From SNS: Hello 항목이 포함되어 있는지 확인합니다.

      CloudWatch 로그에 "From SNS: Hello" 항목이 포함되어 있는지 확인합니다.
    4. 콘솔 상단의 로그 그룹을 선택하여 로그 그룹페이지를 표시합니다. 그런 다음 /aws/lambda/VPCE-Tutorial-Lambda-2/ 로그 그룹에 대해 앞서 수행한 단계를 반복합니다.

축하합니다! Amazon SNS용 엔드포인트를 VPC에 추가하는 방식으로 VPC에서 관리하는 네트워크에서 주제에 메시지를 게시할 수 있었습니다. 메시지는 비공개로 게시되어 퍼블릭 인터넷에 노출되지 않았습니다.

7단계: 정리

생성한 리소스를 보관하고 싶지 않으면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

먼저 Amazon VPC 콘솔을 사용하여 VPC 엔드포인트를 삭제합니다. 그 다음에 AWS CloudFormation 콘솔에서 스택을 삭제하여 이미 생성한 다른 리소스를 삭제합니다. 스택을 삭제할 때 AWS CloudFormation은 AWS 계정에서 스택의 리소스를 제거합니다.

VPC 엔드포인트를 삭제하려면
  1. https://console.aws.amazon.com/vpc/에서 Amazon VPC 콘솔을 엽니다.

  2. 왼쪽의 탐색 메뉴에서 엔드포인트를 선택합니다.

  3. 생성한 엔드포인트를 선택합니다.

  4. 작업을 선택한 다음 엔드포인트 삭제를 선택합니다.

  5. 엔드포인트 삭제 창에서 예, 삭제를 선택합니다.

    그러면 엔드포인트 상태가 삭제 중으로 변경됩니다. 삭제가 완료되면 페이지에서 해당 엔드포인트가 제거됩니다.

AWS CloudFormation 스택을 삭제하려면
  1. https://console.aws.amazon.com/cloudformation에서 AWS CloudFormation 콘솔을 엽니다.

  2. VPCE-Tutorial-Stack 스택을 선택합니다.

  3. [Actions]를 선택한 다음 [Delete Stack]을 선택합니다.

  4. 스택 삭제 창에서 예, 삭제를 선택합니다.

    그러면 스택 상태가 DELETE_IN_PROGRESS로 변경됩니다. 삭제가 완료되면 페이지에서 해당 스택이 페이지에서 제거됩니다.

자세한 정보는 다음 리소스를 참조하세요.