Я делаю оценку сервисов баз данных AWS, чтобы выбрать наиболее эффективный, цель - загружать данные из файла json из корзины S3 в Redshift каждые 5 минут.
В настоящее время я пытаюсьиспользуйте AWS Data Pipeline для автоматизации ETL.Я следовал этому учебному пособию AWS «Копирование данных в Amazon Redshift с помощью консоли конвейера данных AWS», все просто и понятно.
https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-copydata-redshift-create.html
Я установил кластер в Redshift и корзину на S3, создал все необходимые роли и политики со всеми необходимыми разрешениями.
Теперь, после создания конвейера и нажатия кнопки «Активировать», появляется предупреждение «1010 *
Ошибки / предупреждения:
Object:Ec2Instance
WARNING: Could not validate S3 Access for role. Please ensure role ('DataPipelineDefaultRole') has s3:Get*, s3:List*, s3:Put* and sts:AssumeRole permissions for DataPipeline.
Теперь я уверен, чтоу моей роли и роли ресурса есть s3:Get*
, s3:List*
, s3:Put*
и sts:AssumeRole
На самом деле у них обоих есть FullAccess
в основном для всех необходимых мне услуг.
Политика DataPipelineDefaultRole:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "iam:CreateServiceLinkedRole",
"Resource": "*",
"Condition": {
"StringLike": {
"iam:AWSServiceName": [
"elasticmapreduce.amazonaws.com",
"spot.amazonaws.com"
]
}
}
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"ec2:AuthorizeSecurityGroupIngress",
"sdb:Select*",
"sqs:ReceiveMessage",
"s3:Get*",
"sqs:GetQueue*",
"s3:CreateBucket",
"sns:Unsubscribe",
"s3:List*",
"datapipeline:EvaluateExpression",
"ec2:StartInstances",
"dynamodb:DescribeTable",
"sqs:Delete*",
"iam:ListAttachedRolePolicies",
"ec2:RevokeSecurityGroupEgress",
"dynamodb:GetItem",
"sns:Subscribe",
"iam:ListRolePolicies",
"s3:DeleteObject",
"sdb:BatchPutAttributes",
"iam:GetRole",
"dynamodb:BatchGetItem",
"redshift:DescribeClusterSecurityGroups",
"ec2:CreateTags",
"ec2:DeleteNetworkInterface",
"ec2:RunInstances",
"dynamodb:Scan",
"rds:DescribeDBSecurityGroups",
"ec2:StopInstances",
"ec2:CreateNetworkInterface",
"ec2:CancelSpotInstanceRequests",
"cloudwatch:*",
"sqs:PurgeQueue",
"iam:GetRolePolicy",
"dynamodb:UpdateTable",
"ec2:RequestSpotInstances",
"ec2:DeleteTags",
"sns:ListTopics",
"ec2:ModifyImageAttribute",
"iam:PassRole",
"sns:Publish",
"ec2:DescribeNetworkInterfaces",
"ec2:CreateSecurityGroup",
"rds:DescribeDBInstances",
"ec2:ModifyInstanceAttribute",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:DetachNetworkInterface",
"ec2:TerminateInstances",
"iam:GetInstanceProfile",
"sns:GetTopicAttributes",
"datapipeline:DescribeObjects",
"dynamodb:Query",
"iam:ListInstanceProfiles",
"ec2:Describe*",
"ec2:DeleteSecurityGroup",
"redshift:DescribeClusters",
"sqs:CreateQueue",
"elasticmapreduce:*",
"s3:Put*"
],
"Resource": "*"
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"iam:PassRole",
"s3:Get*",
"s3:List*",
"s3:Put*",
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::*:role/DataPipelineDefaultResourceRole",
"arn:aws:iam::*:role/DataPipelineDefaultRole",
"arn:aws:s3:::*/*"
]
},
{
"Sid": "VisualEditor3",
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Put*"
],
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "VisualEditor4",
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*",
"s3:Put*"
],
"Resource": "*"
}
]
}
Политика DataPipelineDefaultResourceRole:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudwatch:*",
"datapipeline:*",
"dynamodb:*",
"ec2:Describe*",
"elasticmapreduce:AddJobFlowSteps",
"elasticmapreduce:Describe*",
"elasticmapreduce:ListInstance*",
"rds:Describe*",
"redshift:DescribeClusters",
"redshift:DescribeClusterSecurityGroups",
"s3:*",
"sdb:*",
"sns:*",
"sqs:*"
],
"Resource": [
"*"
]
}
]
}
Я изучал проблему дляв течение недели опробовал все существующие решения, обновил доверительные отношения, воссоздал роли, сохранил роли по умолчанию, позволил Data Pipeline создавать новые и проверил группу безопасности, сохраняя ту же проблему.
После активации конвейера и проверки журнала Uri я нахожу 2 папки Ec2Instance
и RedshiftLoadActivity
, в файле журнала Redshift есть только 2 строки, в другой больше [INFO]
, описывающих загрузкуфайла jar и S3 для TaskRunner.
Среди журналов есть [INFO]
и эти [WARN]
:
Ec2Instance:
private.com.amazonaws.services.s3.internal.S3V4AuthErrorRetryStrategy: Attempting to re-send the request to mylogbucket.s3.eu-central-1.amazonaws.com with AWS V4 authentication. To avoid this warning in the future, please use region-specific endpoint to access buckets located in regions that require V4 signing.
RedshiftLoadДеятельность:
private.com.amazonaws.services.s3.internal.S3V4AuthErrorRetryStrategy: Attempting to re-send the request to mylogbucket.s3.eu-central-1.amazonaws.com with AWS V4 authentication. To avoid this warning in the future, please use region-specific endpoint to access buckets located in regions that require V4 signing.
Проблема должна заключаться в ролях и политиках, но я позаботился о том, чтобы Redshift и S3 bucket не были проблемой, так как я попытался использовать команду COPY
в редакторе запросов, и он загрузил данные какожидается.
В настоящее время я все еще застрял в этой ошибке и хотел бы получить несколько советов о том, как я мог бы решить эту проблему.
548 [ОШИБКА] (TaskRunnerService-resource: df-0539055_ @ Ec2Instance_2019-05-30T13: 38: 35-0) amazonaws.datapipeline.database.ConnectionFactory: невозможно установить соединение с jdbc: postgresql: //redshift-cluster-1.coykb9.eu-central-1.redshift.amazonaws.com: 5439 / db Соединение отказано.Убедитесь, что имя хоста и порт указаны правильно и что администратор почты принимает соединения TCP / IP