我使用redshift集群和masteruser:testuser
创建了一个cloudformation堆栈"RedshiftCluster" : {
"IamRoles" : [
{
"Fn::GetAtt": [
"IAMInstanceRole",
"Arn"
]
}
]
... other configurations
它使用以下IAM角色(IAMInstanceRole),该角色处于同步状态,并且redshift群集已启动并正在运行:
"IAMInstanceRole": {
"Properties": {
"RoleName": "test-iam-role",
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Effect": "Allow",
"Principal": {
"Service": [
"ec2.amazonaws.com",
"redshift.amazonaws.com",
"s3.amazonaws.com"
]
}
}
]
},
"Path": "/",
"Policies": [
{
"PolicyName": "root",
"PolicyDocument": {
"Version" : "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
}
]
}
我正在尝试使用copy命令和iam_role作为凭据将c3v文件从s3加载到redshift。 iam_role具有IAMInstanceRole的arn(在上面声明)。 每当我执行以下命令时:
copy test_table from 's3://test-bucket/test.csv' CREDENTIALS 'aws_iam_role=arn:aws:iam::<account-id>:role/test-iam-role' MAXERROR 100000 removequotes TRIMBLANKS emptyasnull blanksasnull delimiter '|';
我收到错误:
ERROR: User arn:aws:redshift:us-west-2:189675173661:dbuser:automated-data-sanity-redshiftcluster-fbp9fgls6lri/sanityuser is not authorized to assume IAM Role arn:aws:iam::189675173661:role/sanity-test-iam-instance-role
DETAIL:
-----------------------------------------------
error: User arn:aws:redshift:us-west-2:<account-id>:dbuser:test-redshiftcluster-fbp9fgls6lri/testuser is not authorized to assume IAM Role arn:aws:iam::<account-id>:role/test-iam-role
code: 8001
context: IAM Role=arn:aws:iam::<account-id>:role/test-iam-role
query: 1139
location: xen_aws_credentials_mgr.cpp:236
process: padbmaster [pid=29280]
-----------------------------------------------
请提出一些解决方案。
答案 0 :(得分:5)
我遇到了同样的问题,但是经过一小时的故障排除,我意识到在创建集群时未能将Redshift角色添加到集群中。如果您从Redshift中选择集群,请在“操作”上选择下拉菜单,然后从中选择“ Manage IAM Roles”,您将可以附加为该集群创建的Redshift角色。
那反正为我解决了这个问题。 希望这会有所帮助。
答案 1 :(得分:1)
这是一个可行的模板:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"RedshiftRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"RoleName": "Redshift-Role",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"redshift.amazonaws.com"
]
},
"Action": [
"sts:AssumeRole"
]
}
]
},
"Path": "/",
"Policies": [
{
"PolicyName": "root",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
}
]
}
},
"RedshiftSG": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupName": "Redshift Security Group",
"GroupDescription": "Enable access to redshift",
"VpcId": "vpc-11223344",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": 5439,
"ToPort": 5439,
"CidrIp": "0.0.0.0/0"
}
],
"Tags": [
{
"Key": "Name",
"Value": "Redshift Security Group"
}
]
}
},
"RedshiftCluster": {
"Type": "AWS::Redshift::Cluster",
"Properties": {
"ClusterType": "single-node",
"NodeType": "dc2.large",
"MasterUsername": "master",
"MasterUserPassword": "YourPassword",
"IamRoles": [
{
"Fn::GetAtt": [
"RedshiftRole",
"Arn"
]
}
],
"VpcSecurityGroupIds": [
{
"Ref": "RedshiftSG"
}
],
"PubliclyAccessible": true,
"Port": 5439,
"DBName": "foo"
}
}
}
}
请务必在安全组中插入您自己的VpcId
。
Redshift可以承担角色并授予对s3:*
的访问权限(您应该减少范围)。
答案 2 :(得分:0)
搜索一段时间后得到解决方案。我为John建议为redshift创建了单独的IAM角色,这是一个正确的建议,但在我的情况下不是问题。 然后跟着线程来解决问题:Copy from remote S3 using IAM Role - not authorized to assume IAM Role
我要激活我的群集所在的区域Account Settings
答案 3 :(得分:0)
我知道了。
在redshift群集中没有使用删除群集,重新启动或管理IAM角色的操作。
尽管我多次进行上述操作,但仍然遇到错误。然后我尝试了以下步骤。
在COPY命令中提供访问密钥ID和秘密密钥,而不是IAM角色。示例如下。
从“ s3://awssampledbuswest2/tickit/allusers_pipe.txt”复制用户 凭证'aws_access_key_id =; SKDFHSJKD; aws_secret_access_key = SDJHFJHajhsdjh' 分隔符'|' “ us-west-2”区域;
答案 4 :(得分:0)
我解决了这个问题! 默认情况下,Amazon Redshift集群可用的IAM角色可供该集群上的所有用户使用。您可以选择将IAM角色限制为特定集群或特定区域上的特定Amazon Redshift数据库用户。
要仅允许特定的数据库用户使用IAM角色,请执行以下步骤。
识别有权访问IAM角色的特定数据库用户
为您的Amazon Redshift集群中的数据库用户标识Amazon资源名称(ARN)。数据库用户的ARN格式为:arn:aws:redshift:region:account-id:dbuser:cluster-name / user-name。
通过url =“ https://console.aws.amazon.com/打开IAM控制台。
在导航窗格中,选择“角色”。
选择要限制为特定Amazon Redshift数据库用户的IAM角色。
选择“信任关系”选项卡,然后选择“编辑信任关系”。允许Amazon Redshift代表您访问其他AWS服务的新IAM角色具有以下信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "redshift.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
例如,以下信任关系指定区域us-west-2中的群集my-cluster上只有数据库用户user1和user2有权使用此IAM角色。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "redshift.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": [
"arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user1",
"arn:aws:redshift:us-west-2:123456789012:dbuser:my-cluster/user2"
]
}
}
}]
}
7。选择更新信任策略。
答案 5 :(得分:0)
我试图从Redshift访问Glue数据目录。我创建了具有附加必要策略(AWSGlueServiceRole,AmazonS3FullAccess)的角色,并将其添加到集群中。但是,我已将AWS服务设置为Glue,但它应该是Redshift,因为Redshift是需要访问的服务。附加这些策略后,我所拥有的Redshift角色(并在必要时将该角色添加到集群中)为我解决了这个问题。
答案 6 :(得分:0)
解决了
完成以下步骤:
创建一个IAM角色(move-redshift-data-role),附加S3Fullaccesss并将以下内容添加到信任关系
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::126111577039:root”
},
"Action": "sts:AssumeRole"
}
]
}
其中126111577039是redshift集群的帐户ID
在已与Redshift集群相关联的角色中添加以下策略(请参阅管理集群)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::888850378087:role/move-redshift-data-role"
}
]
}
其中888850378087:其中具有s3存储桶并具有move-redshift-data角色的帐户
最终运行命令
unload ('select * from sellercompliancestate')
to 's3://unload-swarnimg/unload-swarnimg/'
iam_role 'arn:aws:iam::126111577039:role/RedshiftDynamoDBAccess,arn:aws:iam::888850378087:role/move-redshift-data-role'
allowoverwrite
format as csv;