我创建了带有红移群集和主用户的云形式堆栈:testuser
"RedshiftCluster" : {
"IamRoles" : [
{
"Fn::GetAtt": [
"IAMInstanceRole",
"Arn"
]
}
]
... other configurations
它使用以下IAM角色(iaminstancerole(,该角色处于同步状态,红移群集正在启动并运行:
"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": "*"
}
]
}
}
]
}
我正在尝试使用复制命令将CSV文件从S3加载到RedShift,而IAM_Role作为凭据。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]
-----------------------------------------------
请建议一些解决方案。
我遇到了同一问题当我创建群集时,红移角色。如果您从RedShift中选择群集,请选择"操作"上的下拉列表,然后从那里选择"管理IAM角色",您将能够连接您可能为此集群创建的红移角色。
无论如何,这为我解决了问题。希望这会有所帮助。
我解决了这个问题!默认情况下,该集群的所有用户都可以使用Amazon Redshift群集可用的IAM角色。您可以选择将IAM角色限制为特定的特定群集或特定区域的特定亚马逊红移数据库用户。
仅允许特定的数据库用户使用IAM角色,请执行以下步骤。
确定具有访问IAM角色的特定数据库用户
-
为亚马逊红移集群中的数据库用户标识Amazon Resource名称(ARN(。数据库用户的ARN处于格式:ARN:AWS:REDSHIFT:REDSHIFT:account-id:dbuser:cluster-name/user-name。
-
打开url =" https://console.aws.amazon.com/。
(打开IAM控制台 在导航窗格中,选择角色。
选择要限制在特定的Amazon Redshift数据库用户的IAM角色。
选择"信任关系"选项卡,然后选择"编辑信任关系"。一个新的IAM角色,允许亚马逊RedShift代表您访问其他AWS服务的信任关系如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "redshift.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
- 在信任关系的STS:假设行动部分中添加条件,该部分将STS:外部ID字段限制为您指定的值。为您要授予该角色访问权限的每个数据库用户包括一个ARN。
例如,以下信任关系指定只有数据库用户user1 and user2在cluster my-cluster in in region us-west-2中使用此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.选择更新信任策略。
解决了
完成的步骤如下:
- 与RedShift(Move-Redshift-Data(在同一区域中创建S3桶
- 在其中创建一个文件夹。(Move-Redshift-data(
-
创建一个IAM角色(Move-Redshift-Data-lole(,附加S3Fullaccess,并将以下内容添加到Trust Relations
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::126111577039:root” }, "Action": "sts:AssumeRole" } ] }
其中126111577039是RedShift cluster的帐户ID
- 找到您已经扮演的角色
- 打开红移集群
- 单击操作 ->管理IAM角色
- 您可以看到这个角色(我的是Redshiftdynamodbaccess(
- 在IAM控制台中打开角色并将以下内联策略附加到它。
将以下策略添加到已经与红移集群相关的角色(请参阅管理集群中(
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": "arn:aws:iam::888850378087:role/move-redshift-data-role"
}
]
}
其中8888850378087:其中包含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;
这是一个效果很好的模板:
{
"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和Grants访问s3:*
来承担该角色(您应该在范围中减少(。
我试图访问胶水数据RedShift目录。我使用附加必要的策略(Awsglueservicerole,Amazons3fullaccess(创建了角色,并将其添加到集群中。但是,我将AWS服务设置为胶水,但应该是红移,因为RedShift是需要访问的服务。附加这些策略,我拥有的红移角色(并在必要时添加到集群中(为我解决了问题。
在搜索后找到了解决方案一阵子。正如约翰所建议的那样,我为RedShift创建了单独的IAM角色,这是一个正确的建议,但在我的情况下不是问题。然后遵循该线程解决问题:使用IAM角色从远程S3复制 - 不被授权担任IAM角色
我会激活我的群集在帐户设置中的区域
i通过像这样的编辑函数
解决了{"版本":" 2012-10-17"&quot"陈述&quot&quot&quot [[{"效果":"允许"校长":{{"服务":[[&quot" sagemaker.amazonaws.com"&quot" redshift.amazonaws.com&quot"这是给出的},,&quot"行动":" sts:asherole"}这是给出的}
我添加了" sagemaker.amazonaws.com"对我的功能AmazonRedShiftMl
函数
显然我的红移iam角色缺少对sts的策略:suce s on source iam角色上的asherole。
我弄清楚了。
没有使用删除群集,重新启动或管理IAM角色。
尽管我在很多时候都做了很多次,但我还是遇到了错误。然后我尝试了以下步骤。
在复制命令中提供访问密钥ID和秘密密钥,而不是IAM角色。如下。
从's3://awssampledbuswest2/tickit/allusers_pipe.txt'复制用户凭证'aws_access_key_id =; skdfhsjkd; aws_secret_access_key = sdjhfjhajhsdjh''定界符'|'区域'us-west-2';