AWS Data Pipeline 无法验证 S3 访问 [权限警告]
Posted
技术标签:
【中文标题】AWS Data Pipeline 无法验证 S3 访问 [权限警告]【英文标题】:AWS Data Pipeline can't validate S3 Access [permission warning] 【发布时间】:2019-05-29 08:19:31 【问题描述】:我正在评估 AWS 数据库服务以选择最有效的服务,目标是每 5 分钟将 S3 存储桶中的 json 文件中的数据加载到 Redshift。
我目前正在尝试使用 AWS Data Pipeline 来实现 ETL 的自动化。我一直在关注这个 AWS 教程“使用 AWS Data Pipeline 控制台将数据复制到 Amazon Redshift”,一切都简单明了。
https://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-copydata-redshift-create.html
我在 Redshift 上设置了一个集群,在 S3 上设置了一个存储桶,创建了所需的所有角色和策略以及所需的所有权限。
现在在创建管道后,按下激活会出现警告说
错误/警告:
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和 TaskRunner 的 S3 文件。
在日志中有[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.
RedshiftLoadActivity:
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 存储桶不是问题,因为我尝试在查询编辑器上使用 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 连接被拒绝。检查主机名和端口是否正确 postmaster 正在接受 TCP/IP 连接
【问题讨论】:
请附上您的政策声明。 那里,我添加了两个策略。 您似乎缺少 EC2 的承担角色。 我必须在 DataPipelineDefaultRole 的操作中添加“sts:AssumeRole”,对吗?我这样做并再次尝试,但仍然收到相同的警告。 不,我不这么认为。如果我没记错的话,我认为您需要将它添加到 EC2 节点的实例配置文件中。问题是我对DataPipepline服务不太熟悉,但一般来说EC2实例配置文件有sts:AssumeRole。 【参考方案1】:数据管道使用 EMR 生成 EC2 实例并完成提交的任务。
检查由数据管道生成的 EMR 的 EC2 实例配置文件和 EMR 角色。 将 S3 访问策略附加到 EMR 的 EC2 实例配置文件角色。
默认情况下 EC2 实例配置文件是 DataPipelineDefaultResourceRole
用于修复
错误无法建立连接到 jdbc:postgresql://redshift-cluster-1.coykb9.eu-central-1.redshift.amazonaws.com:5439/db 连接被拒绝
更新您的 redshift 安全组入站规则以允许从 0.0.0.0/0 进行连接。这意味着互联网上的任何机器都可以使用凭据进行连接。
【讨论】:
我在 EC2 中没有任何实例,在 EMR 中也没有集群,不需要创建任何实例。但是我确实为这两个角色添加了 S3 和 Data Pipeline FullAccess,以防它以某种方式被使用,再次尝试并仍然收到相同的警告。当我检查管道的执行时,S3InputDataNode 的状态为FINISHED
,而 Ec2Instance 的状态为RUNNING
,它进行了 3 次尝试,并且每次都失败。完成后,整个管道的状态变为FAILED
。
您可以检查 stderr.log 以了解失败的确切原因。
我做到了,我得到的唯一错误是 548 [ERROR] (TaskRunnerService-resource:df-0539055_@Ec2Instance_2019-05-30T13:38:35-0) amazonaws.datapipeline.database.ConnectionFactory: Unable to establish connection to jdbc:postgresql://redshift-cluster-1.coykb9.eu-central-1.redshift.amazonaws.com:5439/db Connection refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
我的安全组有作为出站目的地 0.0.0.0/0 并接受所有流量。
更新您的红移安全组入站规则以允许从 0.0.0.0/0 连接
谢谢,这实际上解决了 jdbc 连接问题,现在一切正常,我实际上可以将数据从 S3 加载到 Redshift,但由于某种原因,角色警告仍在显示。以上是关于AWS Data Pipeline 无法验证 S3 访问 [权限警告]的主要内容,如果未能解决你的问题,请参考以下文章
AWS Data Pipeline DynamoDB 到 S3 到 Redshift,包括 JsonPaths
使用 Data Pipeline 在 AWS 中进行批处理文件
对所有 AWS Data Pipeline 活动使用相同的 EC2 实例
AWS Data Pipeline RedshiftCopy 活动 没有合适的驱动程序
在没有 AWS Pipeline 的情况下,将数据(csv 文件)从 s3 自动传输到 Redshift 的最佳方式是啥?