Terraform/AWS SNS를 사용한 Snowflake 작업 오류 알림

Snowflake 작업은 일정에 따라 SQL 쿼리를 자동으로 실행하는 좋은 방법입니다. 이 가이드에서는 작업 실행이 실패할 때 이메일 주소로 전송되는 알림 설정에 중점을 둘 것입니다. SnowflakesOfficial Documentation,에서와 같이 이를 위해 AWS SNS를 사용합니다.
  • Terraform Setup
  • Create SNS Topic and IAM Policy
  • Creating the Snowflake Notification Integration
  • Granting Snowflake Access to the SNS Topic
  • Enabling Error Notifications in Tasks
  • Receive Email Notifications

  • 테라폼 설정



    먼저 terraform 폴더 구조를 만들어야 합니다.

    mkdir terraform
    touch terraform/variables.tf
    touch terraform/providers.tf
    touch terraform/outputs.tf
    touch terraform/main.tf
    


    변수.tf




    variable "name" {
      description = "the name of your stack, e.g. \"demo\""
      default     = "snowflake-error-notifications"
    }
    
    variable "environment" {
      description = "the name of your environment, e.g. \"prod\""
      default     = "prod"
    }
    
    variable "region" {
      description = "the AWS region in which resources are created, you must set the availability_zones variable as well if you define this value to something other than the default"
      default     = "eu-central-1"
    }
    


    provider.tf




    provider "aws" {
      region = var.region
    }
    


    출력.tf




    output "sns_topic_arn" {
      value = "${aws_sns_topic.snowflake-error-notifications.arn}"
    }
    
    output "iam_role_arn" {
      value = "${aws_iam_role.snowflake-error-notifications-role.arn}"
    }
    


    SNS 주제 및 IAM 정책 생성



    main.tf




    resource "aws_sns_topic" "snowflake-error-notifications" {
      name = "sns-${var.name}-${var.environment}"
    
      tags = {
        Name = "${var.name}"
        Env = "${var.environment}"
      }
    }
    
    resource "aws_iam_policy" "snowflake-error-notifications-policy" {
      name        = "policy-${var.name}-${var.environment}"
      description = "Policy for Snowflake Tasks error notifications"
    
      policy = jsonencode({
        "Version": "2012-10-17",
        "Statement": [
          {
             "Effect": "Allow",
             "Action": [
                 "sns:Publish"
             ],
             "Resource": "${aws_sns_topic.snowflake-error-notifications.arn}"
          }
        ]
     })
    
      tags = {
        Name = "${var.name}"
        Env = "${var.environment}"
      }
    }
    
    resource "aws_iam_role" "snowflake-error-notifications-role" {
      name = "role-${var.name}-${var.environment}"
      assume_role_policy = jsonencode({
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "sns.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      })
    
      tags = {
        Name = "${var.name}"
        Env = "${var.environment}"
      }
    }
    
    resource "aws_iam_policy_attachment" "snowflake-error-notifications-policy-attachment" {
      name       = "policy-attachment-${var.name}-${var.environment}"
      roles      = ["${aws_iam_role.snowflake-error-notifications-role.name}"]
      policy_arn = "${aws_iam_policy.snowflake-error-notifications-policy.arn}"
    }
    


    이제 스택에 대한 terraform 구성을 생성할 수 있습니다.

    cd terraform
    terraform init
    terraform apply
    


    Snowflake 알림 통합 생성



    Snowflake에서 알림 통합을 생성합니다. 이것이 작동하려면 ACCOUNTADMIN이어야 합니다.
    Terraform 출력에서 ​​SNS 주제 및 IAM 역할 ARN을 가져와 다음에 추가합니다.

    create notification integration task_error_notifications
      enabled = true
      type = queue
      notification_provider = aws_sns
      direction = outbound
      aws_sns_topic_arn = 'arn:aws:sns:XXX:sns-snowflake-error-notifications-prod'
      aws_sns_role_arn = 'arn:aws:iam::XXX:role/role-snowflake-error-notifications-prod';
    


    SNS 주제에 Snowflake 액세스 권한 부여




    desc notification integration task_error_notifications;
    


    쿼리 출력에서 ​​SF_AWS_IAM_USER_ARNSF_AWS_EXTERNAL_ID가 필요합니다.
    다음으로 terraform 코드로 돌아가 다음 값을 aws_iam_role 리소스에 추가합니다.

    resource "aws_iam_role" "snowflake-error-notifications-role" {
      name = "role-${var.name}-${var.environment}"
      assume_role_policy = jsonencode({
      "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>"
            }
          }
        }
      ]
    })
    
      tags = {
        Name = "${var.name}"
        Env = "${var.environment}"
      }
    }
    


    이제 terrafom 구성을 업데이트합니다.

    terraform apply
    


    작업에서 오류 알림 활성화



    남은 것은 Snowflake 작업에서 방금 생성한 통합을 활성화하는 것입니다.

    새 작업의 경우:

    create task new_task
      schedule = '5 MINUTE'
      error_integration = task_error_notifications
      as
      insert into mytable(ts) values(current_timestamp);
    


    기존 작업의 경우:

    alter task old_task suspend;
    alter task old_task set error_integration = task_error_notifications;
    alter task old_task resume;
    


    작업이 실패하면 페이로드가 JSON 문자열로 SNS 주제에 전송됩니다.

    {\"version\":\"1.0\",\"messageId\":\"3ff1eff0-7ad7-493c-9552-c0307087e0c6\",\"messageType\":\"USER_TASK_FAILED\",\"timestamp\":\"2021-11-11T19:46:39.648Z\",\"accountName\":\"AWS_UTEN_DPO_ACC\",\"taskName\":\"AWS_UTEN_DPO_DB.AWS_UTEN_SC.UTEN_AWS_TK1\",\"taskId\":\"01a03962-2b57-889e-0000-000000000001\",\"rootTaskName\":\"AWS_UTEN_DPO_DB.AWS_UTEN_SC.UTEN_AWS_TK1\",\"rootTaskId\":\"01a03962-2b57-889e-0000-000000000001\",\"messages\":[{\"runId\":\"2021-11-11T19:46:23.826Z\",\"scheduledTime\":\"2021-11-11T19:46:23.826Z\",\"queryStartTime\":\"2021-11-11T19:46:24.879Z\",\"completedTime\":\"null\",\"queryId\":\"01a03962-0300-0002-0000-0000000034d8\",\"errorCode\":\"000630\",\"errorMessage\":\"Statement reached its statement or warehouse timeout of 10 second(s) and was canceled.\"}]}
    


    이메일 알림 받기



    작업이 실패할 때마다 이메일을 받으려면 main.tf에 다음을 추가할 수 있습니다.

    resource "aws_sns_topic_subscription" "snowflake-error-notifications-subscription" {
      topic_arn = "${aws_sns_topic.snowflake-error-notifications.arn}"
      protocol  = "email"
      endpoint  = "[email protected]"
    }
    


    변경 사항을 적용합니다.

    terraform apply
    


    구독을 확인해야 하는 AWS로부터 이메일을 받게 됩니다.

    좋은 웹페이지 즐겨찾기