我正在尝试使用粘合作业刷新物化视图,使用 boto3 通过数据库用户名进行身份验证连接到 Redshift 集群。 CloudWatch 中的执行超时没有错误。我确定问题出在连接内,但我找不到我做错了什么。此外,我在 AWS Glue 中配置了与数据库的连接,我成功地将其与其他 Visual ETL 作业以及本作业一起使用。
我知道我可以使用代码编辑器 v2 查询调度程序安排刷新,但我在配置安全性时遇到了太多问题,没有成功,计划执行,但我在历史记录中看到没有运行,但这将是另一篇文章.
这是我到目前为止的脚本:
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue.utils import getResolvedOptions
import boto3
# Initialize Glue context
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
# Redshift connection details
redshift_cluster_id = 'my-warehouse'
db_name = 'my-db'
db_user = 'my-user'
# SQL to refresh materialized views
refresh_sql_1 = "REFRESH MATERIALIZED VIEW mv_name1"
refresh_sql_2 = "REFRESH MATERIALIZED VIEW mv_name2"
def refresh_materialized_view(sql):
client = boto3.client('redshift-data')
response = client.execute_statement(
ClusterIdentifier=redshift_cluster_id,
Database=db_name,
DbUser=db_user,
Sql=sql,
WithEvent=True
)
return response
# Refresh the materialized views and commit
refresh_materialized_view(refresh_sql_1)
refresh_materialized_view(refresh_sql_2)
job.commit()
在执行期间,作业循环运行这些命令,直到超时(15 分钟):
我使用查询编辑器 v2 调度程序完成此操作,并仔细遵循文档:https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2-schedule-query.html
就我而言,关键是使用临时凭证进行身份验证,允许 IAM 角色访问特定 dbuser 的数据库凭证:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "UseTemporaryCredentialsForAllDbUsers",
"Effect": "Allow",
"Action": "redshift:GetClusterCredentials",
"Resource": [
"arn:aws:redshift:*:*:dbuser:*/awsuser",
"arn:aws:redshift:*:*:dbuser:*/myuser"
]
}
]
}