Terraform/AWS SNS를 사용한 Snowflake 작업 오류 알림
테라폼 설정
먼저 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_ARN
및 SF_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로부터 이메일을 받게 됩니다.
Reference
이 문제에 관하여(Terraform/AWS SNS를 사용한 Snowflake 작업 오류 알림), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/codiefz/snowflake-task-error-notifications-with-terraform-aws-sns-1ol4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)