Amazon SNS에 대한 Snowpipe 오류 알림 활성화하기

이 항목에서는 Snowpipe 오류 알림을 Amazon Simple Notification Service (SNS)로 푸시하는 지침을 제공합니다. SNS는 게시/구독 메시징 서비스입니다.

이 기능은 다음 유형의 로드에 대한 오류 알림을 푸시할 수 있습니다.

  • Snowpipe 자동 수집.

  • Snowpipe insertFiles REST API 엔드포인트에 대한 호출.

  • Snowpipe 수집 방법만으로 Kafka용 Snowflake 커넥터를 사용한 Apache Kafka에서의 로드.

이 항목의 내용:

클라우드 플랫폼 지원

현재 이 기능은 AWS(Amazon Web Services)에 호스팅된 Snowflake 계정으로 제한됩니다. Snowpipe는 지원되는 모든 클라우드 저장소 서비스의 파일에서 데이터를 로딩할 수 있지만, SNS로의 푸시 알림은 AWS에 호스팅된 Snowflake 계정에서만 지원됩니다.

참고

  • 이 기능은 알림 통합 오브젝트를 사용하여 구현됩니다. 알림 통합은 Snowflake와 서드 파티 클라우드 메시지 큐 서비스 간의 인터페이스를 제공하는 Snowflake 오브젝트입니다. 단일 알림 통합은 여러 파이프를 지원할 수 있습니다.

  • Snowflake는 오류 알림의 메시지 전달을 한 번 이상 보장합니다(즉, 시도가 한 번 이상 성공하도록 보장하려고 메시지 전달 시도가 여러 번 이루어지므로 메시지가 중복될 수 있음).

오류 알림 활성화하기

1단계: Amazon SNS 항목 만들기

모든 오류 메시지를 처리하기 위해 AWS 계정에 SNS 항목을 만듭니다. SNS 항목의 ARN(Amazon Resource Name)을 기록합니다.

참고

표준 SNS 항목만 지원됩니다. 오류 알림에 사용할 SNS FIFO(first in, first out) 항목을 만들지 마십시오. 현재, FIFO 항목으로 전송된 오류 알림은 자동으로 실패합니다.

대기 시간을 줄이고 전체 리전 으로 알림을 보내기 위한 데이터 송신 요금이 발생하지 않도록 하려면 Snowflake 계정과 동일한 리전에 SNS 항목을 만드는 것이 좋습니다.

지침은 SNS 설명서에서 Amazon SNS 항목 만들기 를 참조하십시오.

2단계: IAM 정책 만들기

SNS 항목에 대한 게시 권한을 부여하는 AWS IAM(Identity and Access Management) 정책을 만듭니다. 이 정책은 다음 작업을 정의합니다.

  • sns:publish

    SNS 항목에 게시합니다.

  1. AWS 관리 콘솔에 로그인합니다.

  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.

  3. 왼쪽 탐색 창에서 Account settings 을 선택합니다.

  4. Security Token Service Regions 목록을 확장하고 계정이 위치한 리전 에 해당하는 AWS 리전을 찾아 상태가 Inactive 이면 Activate 을 선택합니다.

  5. 왼쪽 탐색 창에서 Policies 을 선택합니다.

  6. Create Policy 를 클릭합니다.

  7. JSON 탭을 클릭합니다.

  8. SNS 항목에 대해 취할 수 있는 조치 사항을 정의하는 정책 문서를 추가합니다.

    다음 텍스트를 복사하여 정책 편집기에 붙여넣습니다.

    {
        "Version": "2012-10-17",
        "Statement": [
          {
             "Effect": "Allow",
             "Action": [
                 "sns:Publish"
             ],
             "Resource": "<sns_topic_arn>"
          }
        ]
     }
    
    Copy

    sns_topic_arn 을 이 항목의 1단계: Amazon SNS 항목 만들기 에서 만든 SNS 항목의 ARN으로 바꿉니다.

  9. Review policy 를 클릭합니다.

  10. 정책 이름(예: snowflake_sns_topic)과 선택 사항으로 설명을 입력합니다. Create policy 를 클릭합니다.

3단계: AWS IAM 역할 만들기

SNS 항목에 대한 권한을 할당할 AWS IAM 역할을 만듭니다.

  1. AWS 관리 콘솔에 로그인합니다.

  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.

  3. 왼쪽 탐색 창에서 Roles 을 선택합니다.

  4. Create role 버튼을 클릭합니다.

  5. Another AWS account 을 신뢰할 수 있는 엔터티 타입으로 선택합니다.

  6. Account ID 필드에 본인의 AWS 계정 ID를 임시로 입력합니다.

  7. Require external ID 옵션을 선택합니다. 이 옵션을 사용하면 Amazon 계정 리소스(즉, SNS)에 대한 권한을 서드 파티(즉, Snowflake)에 부여할 수 있습니다.

    지금은 0000 과 같은 더미 ID를 입력하십시오. 나중에 신뢰 관계를 수정하고 더미 ID를 계정에 대해 생성된 Snowflake IAM 사용자의 외부 ID로 바꿉니다. Snowflake 사용자는 IAM 역할에 대한 신뢰 정책의 조건을 통해 나중에 만들 알림 통합 오브젝트를 사용하여 역할을 맡을 수 있습니다.

  8. Next 버튼을 클릭합니다.

  9. 이 항목의 2단계: IAM 정책 만들기 에서 만든 정책을 찾아 이 정책을 선택합니다.

  10. Next 버튼을 클릭합니다.

  11. 역할의 이름과 설명을 입력하고 Create role 버튼을 클릭합니다.

  12. 역할 요약 페이지에 있는 Role ARN 값을 기록합니다. 하나 이상의 이후 단계에서 이 값을 지정하게 됩니다.

4단계: 알림 통합 만들기

CREATE NOTIFICATION INTEGRATION 을 사용하여 알림 통합을 만듭니다. 통합은 만든 SNS 항목을 참조하는 Snowflake 오브젝트입니다.

단일 알림 통합은 여러 작업파이프 를 지원할 수 있습니다.

참고

계정 관리자(ACCOUNTADMIN 역할의 사용자) 또는 전역 CREATE INTEGRATION 권한이 있는 역할만 이 SQL 명령을 실행할 수 있습니다.

CREATE NOTIFICATION INTEGRATION <integration_name>
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AWS_SNS
  DIRECTION = OUTBOUND
  AWS_SNS_TOPIC_ARN = '<topic_arn>'
  AWS_SNS_ROLE_ARN = '<iam_role_arn>'
Copy

여기서

<통합_이름>

새 통합의 이름입니다.

DIRECTION = OUTBOUND

Snowflake에 관한 클라우드 메시징의 방향입니다. 오류 알림을 구성할 때만 필요합니다.

<항목_arn>

이 항목의 1단계: Amazon SNS 항목 만들기 에서 기록한 SNS 항목 ARN입니다.

<iam_역할_arn>

이 항목의 3단계: AWS IAM 역할 만들기 에서 기록한 IAM 역할 ARN입니다.

예:

CREATE NOTIFICATION INTEGRATION my_notification_int
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AWS_SNS
  DIRECTION = OUTBOUND
  AWS_SNS_TOPIC_ARN = 'arn:aws:sns:us-east-2:111122223333:sns_topic'
  AWS_SNS_ROLE_ARN = 'arn:aws:iam::111122223333:role/error_sns_role';
Copy

5단계: SNS 항목에 대한 Snowflake 액세스 권한 부여하기

IAM 사용자 ARN과 SNS 항목 외부 ID를 검색합니다.

  1. DESCRIBE INTEGRATION 실행:

    DESC NOTIFICATION INTEGRATION <integration_name>;
    
    Copy

    여기서

    • integration_name4단계: 알림 통합 만들기 에서 만든 알림 통합의 이름입니다.

    예:

    DESC NOTIFICATION INTEGRATION my_notification_int;
    
    +---------------------------+-------------------+------------------------------------------------------+----------------------+
    |   property                |   property_type   |   property_value                                     |   property_default   |
    +---------------------------+-------------------+------------------------------------------------------+----------------------+
    |   ENABLED                 |   Boolean         |   true                                               |   false              |
    |   NOTIFICATION_PROVIDER   |   String          |   AWS_SNS                                            |                      |
    |   DIRECTION               |   String          |   OUTBOUND                                           |   INBOUND            |
    |   AWS_SNS_TOPIC_ARN       |   String          |   arn:aws:sns:us-east-2:111122223333:myaccount       |                      |
    |   AWS_SNS_ROLE_ARN        |   String          |   arn:aws:iam::111122223333:role/myrole              |                      |
    |   SF_AWS_IAM_USER_ARN     |   String          |   arn:aws:iam::123456789001:user/c_myaccount         |                      |
    |   SF_AWS_EXTERNAL_ID      |   String          |   MYACCOUNT_SFCRole=2_a123456/s0aBCDEfGHIJklmNoPq=   |                      |
    +---------------------------+-------------------+------------------------------------------------------+----------------------+
    
    Copy
  2. 생성된 다음 값을 기록합니다.

    SF_AWS_IAM_USER_ARN:

    계정에 대해 생성된 Snowflake IAM 사용자의 ARN. Snowflake 계정의 사용자는 알림 통합을 사용하여 이 사용자의 외부 ID를 제출하여 3단계: AWS IAM 역할 만들기 에서 만든 IAM 역할을 맡게 됩니다.

    SF_AWS_EXTERNAL_ID:

    계정에 대해 생성된 Snowflake IAM 사용자의 외부 ID입니다.

    다음 단계에서는 이러한 값으로 IAM 역할의 신뢰 관계를 업데이트합니다.

Snowflake에 관한 클라우드 메시징의 방향을 나타내는 DIRECTION 속성에 유의하십시오.

IAM 역할의 신뢰 관계 수정하기

  1. AWS 관리 콘솔에 로그인합니다.

  2. 홈 대시보드에서 Identity & Access Management (IAM)를 선택합니다.

  3. 왼쪽 탐색 창에서 Roles 을 선택합니다.

  4. 이 항목의 3단계: AWSIAM 역할 만들기 에서 만든 역할을 클릭합니다.

  5. Trust relationships 탭을 클릭합니다.

  6. Edit trust relationship 버튼을 클릭합니다.

  7. 이 항목의 IAM 사용자 ARN 및 SNS 항목 외부 ID 검색하기 에서 기록한 DESC NOTIFICATION INTEGRATION 출력값으로 정책 문서를 수정합니다.

    IAM 역할에 대한 정책 문서

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<sf_aws_iam_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<sf_aws_external_id>"
            }
          }
        }
      ]
    }
    
    Copy

    여기서

    • sf_aws_iam_user_arn 은 사용자가 기록한 SF_AWS_IAM_USER_ARN 값입니다.

    • sf_aws_external_id 는 사용자가 기록한 SF_AWS_EXTERNAL_ID 값입니다.

  8. Update Trust Policy 버튼을 클릭합니다. 변경 사항이 저장됩니다.

6단계: 파이프에서 오류 알림 활성화하기

여러 파이프에서 단일 알림 통합을 공유할 수 있습니다. 오류 메시지 본문을 통해서는 다른 세부 정보 중에서도 파이프, 외부 스테이지 및 경로, 오류가 발생한 파일을 파악할 수 있습니다.

파이프에 대한 오류 알림을 활성화하려면 ERROR_INTEGRATION 매개 변수 값을 지정하십시오.

참고

알림 통합을 참조하는 파이프를 만들거나 수정하려면 알림 통합에 대한 USAGE 권한이 있는 역할이 필요합니다. 또한, 역할에는 각각 스키마에 대한 CREATE PIPE 권한이나 파이프에 대한 OWNERSHIP 권한도 있어야 합니다.

스키마의 모든 오브젝트에 대해 작업하려면 상위 데이터베이스 및 스키마에 대한 USAGE 권한도 필요합니다.

지정된 권한 세트로 사용자 지정 역할을 만드는 방법에 대한 지침은 사용자 지정 역할 만들기 섹션을 참조하십시오.

보안 오브젝트 에 대해 SQL 작업을 수행하기 위한 역할과 권한 부여에 대한 일반적인 정보는 액세스 제어의 개요 섹션을 참조하십시오.

새 파이프

CREATE PIPE 를 사용하여 새 파이프를 만듭니다. 자동화된 데이터 로딩(즉, Snowpipe 자동 수집)을 구성하려면 추가적인 파이프 매개 변수가 필요합니다. 자세한 지침은 클라우드 메시징을 사용한 연속 데이터 로딩 자동화하기 섹션을 참조하십시오.

CREATE PIPE <name>
  [ AUTO_INGEST = TRUE | FALSE  ]
  ERROR_INTEGRATION = <integration_name>
  AS <copy_statement>
Copy

여기서

ERROR_INTEGRATION = <통합_이름>

이 항목의 4단계: 알림 통합 만들기 에서 만든 알림 통합의 이름입니다.

다음 예에서는 오류 알림과 자동화된 데이터 로딩을 모두 지원하는 CREATE PIPE 문을 보여줍니다.

CREATE PIPE mypipe
  AUTO_INGEST = TRUE
  ERROR_INTEGRATION = my_notification_int
  AS
  COPY INTO mydb.public.mytable
  FROM @mydb.public.mystage;
Copy

기존 파이프

ALTER PIPE 를 사용하여 기존 파이프를 수정합니다.

ALTER PIPE <name> SET ERROR_INTEGRATION = <integration_name>;
Copy

여기서 <통합_이름>4단계: 알림 통합 만들기 에서 만든 알림 통합의 이름입니다.

예:

ALTER PIPE mypipe SET ERROR_INTEGRATION = my_notification_int;
Copy

오류 알림 메시지 페이로드

오류 메시지의 본문에서 파이프와 로딩 중에 발생한 오류를 파악할 수 있습니다.

다음은 Snowpipe 오류를 설명하는 샘플 메시지 페이로드입니다. 페이로드는 하나 이상의 오류 메시지를 포함할 수 있습니다.

{\"version\":\"1.0\",\"messageId\":\"a62e34bc-6141-4e95-92d8-f04fe43b43f5\",\"messageType\":\"INGEST_FAILED_FILE\",\"timestamp\":\"2021-10-22T19:15:29.471Z\",\"accountName\":\"MYACCOUNT\",\"pipeName\":\"MYDB.MYSCHEMA.MYPIPE\",\"tableName\":\"MYDB.MYSCHEMA.MYTABLE\",\"stageLocation\":\"s3://mybucket/mypath\",\"messages\":[{\"fileName\":\"/file1.csv_0_0_0.csv.gz\",\"firstError\":\"Numeric value 'abc' is not recognized\"}]}
Copy

페이로드의 값을 처리하려면 문자열을 JSON 오브젝트로 구문 분석해야 합니다.