Amazon Redshift가 사용자를 대신하여 다른 AWS 서비스에 액세스할 수 있도록 권한 부여
일부 Amazon Redshift 기능을 사용하려면 Amazon Redshift가 사용자 대신 다른 AWS 서비스에 액세스해야 합니다. 예를 들어 COPY 및 UNLOAD 명령은 Amazon S3 버킷을 사용하여 Amazon Redshift 클러스터로 데이터를 로드하거나 언로드할 수 있습니다. CREATE EXTERNAL FUNCTION 명령은 스칼라 Lambda 사용자 정의 함수(UDF)를 사용하여 AWS Lambda 함수를 호출할 수 있습니다. Amazon Redshift Spectrum은 Amazon Athena 또는 AWS Glue의 데이터 카탈로그를 사용할 수 있습니다. Amazon Redshift 클러스터가 사용자를 대신하여 작동하도록 하려면 클러스터에 보안 자격 증명을 제공해야 합니다. 보안 자격 증명을 제공하는 데 선호되는 방법은 AWS Identity and Access Management(IAM) 역할을 지정하는 것입니다. COPY 및 UNLOAD의 경우 임시 자격 증명을 제공할 수 있습니다.
사용자가 AWS Management Console 외부에서 AWS와 상호 작용하려면 프로그래밍 방식의 액세스가 필요합니다. 프로그래밍 방식으로 액세스를 부여하는 방법은 AWS에 액세스하는 사용자 유형에 따라 다릅니다.
사용자에게 프로그래밍 방식 액세스 권한을 부여하려면 다음 옵션 중 하나를 선택합니다.
프로그래밍 방식 액세스가 필요한 사용자는 누구인가요? | To | By |
---|---|---|
작업 인력 ID (IAM Identity Center에서 관리되는 사용자) |
임시 보안 인증 정보로 AWS CLI, AWS SDK 또는 AWS API에 대한 프로그래밍 요청에 서명합니다. |
사용하고자 하는 인터페이스에 대한 지침을 따릅니다.
|
IAM | 임시 보안 인증 정보로 AWS CLI, AWS SDK 또는 AWS API에 대한 프로그래밍 요청에 서명합니다. | IAM 사용 설명서의 AWS 리소스와 함께 임시 보안 인증 정보 사용에 나와 있는 지침을 따르세요. |
IAM | (권장되지 않음) 장기 보안 인증 정보로 AWS CLI, AWS SDK 또는 AWS API에 대한 프로그래밍 요청에 서명합니다. |
사용하고자 하는 인터페이스에 대한 지침을 따릅니다.
|
다음을 통해 다른 AWS 서비스에 액세스하는 데 필요한 권한과 함께 IAM 역할을 생성하는 방법을 알아봅니다. Amazon Redshift 명령을 실행할 때 역할을 클러스터와 연관시키고 역할의 Amazon 리소스 이름(ARN)을 지정해야 합니다. 자세한 내용은 IAM 역할을 사용하여 COPY, UNLOAD, CREATE EXTERNAL FUNCTION 및 CREATE EXTERNAL SCHEMA 작업에 대한 권한 부여 섹션을 참조하세요.
또한 슈퍼 사용자는 특정 사용자 및 그룹에 ASSUMEROLE 권한을 부여하여 COPY 및 UNLOAD 작업을 위한 역할에 대한 액세스 권한을 제공할 수 있습니다. 자세한 내용은 Amazon Redshift 데이터베이스 개발자 안내서의 GRANT를 참조하세요.
Amazon Redshift 클러스터가 AWS 서비스에 액세스 할 수 있도록 IAM 역할 생성
Amazon Redshift 클러스터에서 사용자를 대신하여 다른 AWS 서비스와 통신하도록 허용하는 IAM 역할을 생성하려면 다음 단계를 수행합니다. 이 섹션에 사용된 값은 예시이며 필요에 따라 값을 선택할 수 있습니다.
Amazon Redshift에서 AWS 서비스에 액세스하도록 허용하는 IAM 역할을 생성하려면
-
IAM 콘솔(IAM console)
을 엽니다. -
탐색 창에서 역할을 선택합니다.
-
역할 생성(Create role)을 선택합니다.
-
AWS 서비스를 선택한 다음 Redshift를 선택합니다.
-
사용 사례 선택 아래에서, Redshift - 사용자 지정 가능(Redshift - Customizable)을 선택한 후 다음: 권한(Next: Permissions)을 선택합니다. 첨부 파일 권한 정책(Attach permissions policy) 페이지가 나타납니다.
-
예를 들어 COPY를 사용하여 Amazon S3에 액세스하려면
AmazonS3ReadOnlyAccess
를 사용하고 추가할 수 있습니다. COPY 또는 UNLOAD를 사용하여 Amazon S3에 액세스하려면 원하는 버킷 및 접두사에 대한 액세스를 제한하는 관리형 정책을 생성하는 것이 좋습니다. 읽기 및 쓰기 작업 모두에 대해 최소 권한을 적용하고 Amazon Redshift에 필요한 Amazon S3 버킷 및 키 접두사로만 제한하는 것이 좋습니다.CREATE EXTERNAL FUNCTION 명령에 대한 Lambda 함수 호출에 액세스하려면
AWSLambdaRole
을 추가합니다.Redshift Spectrum의 경우 Amazon S3 액세스 외에
AWSGlueConsoleFullAccess
또는AmazonAthenaFullAccess
를 추가합니다.Next: Tags(다음: 태그)를 선택합니다.
-
태그 추가(Add tags) 페이지가 나타납니다. 선택적으로 태그를 추가할 수 있습니다. Next: Review(다음: 검토)를 선택합니다.
-
Role name(역할 이름)에는 역할 이름을 입력합니다(예:
RedshiftCopyUnload
). 역할 생성(Create role)을 선택합니다. -
새로운 역할은 해당 역할을 사용하는 클러스터의 사용자라면 모두에게 제공됩니다. 특정 클러스터의 일부 사용자로 액세스를 제한하거나, 혹은 특정 리전의 클러스터로 제한하려면 역할에 대한 신뢰 관계를 편집하세요. 자세한 내용은 IAM 역할에 대한 액세스 제한 섹션을 참조하세요.
-
역할을 클러스터와 연결합니다. IAM 역할은 새롭게 생성한 클러스터와 연결할 수도 있고, 혹은 기존 클러스터에 추가할 수도 있습니다. 자세한 내용은 IAM 역할을 클러스터와 연결 섹션을 참조하세요.
참고
특정 데이터에 대한 액세스를 제한하려면 필요한 최소 권한을 부여하는 IAM 역할을 사용합니다.
IAM 역할에 대한 액세스 제한
기본적으로 Amazon Redshift 클러스터에서 사용할 수 있는 IAM 역할은 해당 클러스터의 모든 사용자가 사용할 수 있습니다. IAM 역할을 특정 클러스터 또는 특정 영역의 특정 Amazon Redshift 데이터베이스 사용자로 제한하도록 선택할 수 있습니다.
특정 데이터베이스 사용자에 한해 IAM 역할을 사용할 수 있도록 하려면 다음 단계를 따르세요.
특정 데이터베이스 사용자로 IAM 역할에 대한 액세스 권한을 제한하려면
-
Amazon Redshift 클러스터의 데이터베이스 사용자에 대한 Amazon 리소스 이름(ARN)을 확인합니다. 데이터베이스 사용자의 ARN 형식은
arn:aws:redshift:
입니다.region
:account-id
:dbuser:cluster-name
/user-name
Amazon Redshift Serverless의 경우 다음 ARN 형식을 사용합니다.
arn:aws:redshift:
region
:account-id
:dbuser:workgroup-name
/user-name
-
IAM 콘솔(IAM console)
을 엽니다. -
탐색 창에서 Roles(역할)를 선택합니다.
-
특정 Amazon Redshift 데이터베이스 사용자로 제한하려는 IAM 역할을 선택합니다.
-
신뢰 관계(Trust Relationships) 탭을 선택한 다음 신뢰 관계 편집(Edit Trust Relationship)을 선택합니다. Amazon Redshift가 귀하를 대신하여 다른 AWS 서비스에 액세스 할 수 있게 해주는 새로운 IAM 역할은 다음과 같이 신뢰 관계를 갖습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
신뢰 관계의
sts:AssumeRole
작업 영역에sts:ExternalId
필드를 지정하는 값으로 제한하는 조건을 추가합니다. 역할에 대한 액세스 권한을 부여할 각 데이터베이스 사용자의 ARN을 추가합니다. 외부 ID는 고유한 문자열일 수 있습니다.예를 들어 다음 신뢰 관계는
user1
리전의user2
클러스터에 속한 데이터베이스 사용자인my-cluster
과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" ] } } }] }
-
신뢰 정책 업데이트(Update Trust Policy)를 선택합니다.
IAM 역할을 한 AWS 리전으로 제한
특정 AWS 리전에만 액세스할 수 있도록 IAM 역할을 제한할 수 있습니다. 기본적으로 Amazon Redshift에 대한 IAM 역할은 단일 리전으로 제한되지 않습니다.
IAM 역할 사용을 리전별로 제한하려면 다음 단계를 수행합니다.
IAM 역할에 대해 허용되는 리전을 확인하려면
-
탐색 창에서 역할(Roles)을 선택합니다.
-
특정 리전에 제한되도록 수정할 역할을 선택합니다.
-
신뢰 관계(Trust Relationships) 탭을 선택한 다음 신뢰 관계 편집(Edit Trust Relationship)을 선택합니다. Amazon Redshift가 귀하를 대신하여 다른 AWS 서비스에 액세스 할 수 있게 해주는 새로운 IAM 역할은 다음과 같이 신뢰 관계를 갖습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
Service
의Principal
목록을 역할 사용을 허용할 특정 리전의 목록으로 수정합니다.Service
목록에서 각 리전은redshift.
형식이어야 합니다.region
.amazonaws.com예를 들어, 다음과 같이 편집된 신뢰 관계는
us-east-1
및us-west-2
리전에서만 IAM 역할을 사용하도록 허용합니다.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "redshift.us-east-1.amazonaws.com", "redshift.us-west-2.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
-
신뢰 정책 업데이트(Update Trust Policy)를 선택합니다.
Amazon Redshift에서 IAM 역할 연결
역할을 클러스터에 연결하면 클러스터가 Amazon S3, Amazon Athena, AWS Glue 및 AWS Lambda에 액세스할 수 있는 역할을 맡을 수 있습니다. 클러스터에 연결된 역할에 필요한 리소스에 대한 액세스 권한이 없는 경우 다른 계정에 속한 다른 역할을 함께 묶을 수 있습니다. 그러면 클러스터는 함께 묶은 역할을 일시적으로 수임하여 데이터에 액세스합니다. 역할을 함께 묶어 교차 계정 액세스를 부여할 수도 있습니다. 체인의 각 역할은 클러스터가 체인의 끝에 있는 역할을 수임할 때까지 체인의 다음 역할을 수임합니다. 연결할 수 있는 최대 IAM 역할 수는 할당량에 따라 달라집니다. 자세한 내용은 Amazon Redshift 객체에 대한 할당량에서 할당량 "Amazon Redshift Redshift가 다른 AWS 서비스에 액세스하기 위한 클러스터 IAM 역할" 섹션을 참조하세요.
예를 들어, 회사 A가 회사 B에 속한 Amazon S3 버킷의 데이터에 액세스하려고 한다고 가정합니다. 회사 A는 RoleA
라는 Amazon Redshift에 대한 AWS 서비스 역할을 생성하고 해당 클러스터에 연결합니다. 회사 B는 RoleB
라는 이름의 역할을 생성합니다. 이는 회사 B 버킷의 데이터에 액세스할 수 있는 권한을 받았습니다. 회사 B 버킷의 데이터에 액세스하려면 회사 A는 iam_role
파라미터를 사용하여 COPY 명령을 실행하고 RoleA
와 RoleB
를 묶습니다. COPY 작업 기간 동안 RoleA
은 RoleB
를 수임하여 Amazon S3 버킷에 액세스합니다.
역할을 함께 묶으려면 역할 간에 신뢰 관계를 구성해야 합니다. 또 다른 역할을 수임하는 역할(예: RoleA
)에는 다음 묶인 역할(예: RoleB
)을 수임하도록 허용하는 권한 정책이 있어야 합니다. 반대로 권한을 전달하는 역할(RoleB
)에는 권한을 이전에 묶인 역할(RoleA
)로 전달하도록 허용하는 신뢰 정책이 있어야 합니다. 자세한 내용은 IAM User Guide의 Using IAM roles를 참조하세요.
체인의 첫 번째 역할은 클러스터에 연결된 역할이어야 합니다. 첫 번째 역할과 체인의 다음 역할을 수임하는 각 후속 역할에는 특정 문이 포함된 정책이 있어야 합니다. 이 문은 Allow
작업 및 sts:AssumeRole
요소에 있는 다음 역할의 Amazon 리소스 이름(ARN)에 Resource
효과를 줍니다. 예를 들어 RoleA
에는 RoleB
를 수임하도록 허용하는 권한 정책이 있고, 이는 AWS 계정 210987654321
이 소유합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1487639602000", "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::210987654321:role/RoleB" } ] }
다른 역할로 전달하는 역할은 역할을 수임하는 역할 또는 해당 역할을 소유한 AWS 계정과의 신뢰 관계를 설정해야 합니다. 예를 들어 RoleB
에는 신뢰 정책이 있어 RoleA
와의 신뢰 관계를 설정합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::role/RoleA" } } ] }
다음 신뢰 정책은 RoleA
의 소유자인 AWS 계정 123456789012
와의 신뢰 관계를 설정합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::123456789012:root" } } ] }
참고
특정 사용자로 역할 연결 권한 부여를 제한하려면 조건을 정의합니다. 자세한 내용은 IAM 역할에 대한 액세스 제한 섹션을 참조하세요.
UNLOAD, COPY, CREATE EXTERNAL FUNCTION 또는 CREATE EXTERNAL SCHEMA 명령을 실행할 때 iam_role
파라미터에서 쉼표로 구분된 역할 ARN 목록을 포함해 역할을 함께 묶습니다. 다음은 iam_role
파라미터에서 역할을 묶기 위한 구문을 나타냅니다.
unload ('select * from venue limit 10') to 's3://acmedata/redshift/venue_pipe_' IAM_ROLE 'arn:aws:iam::<
aws-account-id-1
>:role/<role-name-1
>[,arn:aws:iam::<aws-account-id-2
>:role/<role-name-2
>][,...]';
참고
전체 역할 체인은 작은따옴표로 묶여 있으며, 공백을 포함해서는 안 됩니다.
다음 예에서 RoleA
는 AWS 계정 123456789012
에 속하는 클러스터에 연결됩니다. 계정 210987654321
에 속한 RoleB
는 s3://companyb/redshift/
라는 버킷에 액세스할 수 있는 권한을 가집니다. 다음 예에서는 RoleA
와 RoleB
를 묶어 s3://companyb/redshift/ 버킷에 데이터 UNLOAD를 수행합니다.
unload ('select * from venue limit 10') to 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
다음 예에서는 COPY 명령을 사용하여 이전 예에서 언로드된 데이터를 로드합니다.
copy venue from 's3://companyb/redshift/venue_pipe_' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
다음 예에서는 CREATE EXTERNAL SCHEMA가 묶인 역할을 사용하여 RoleB
를 수임합니다.
create external schema spectrumexample from data catalog database 'exampledb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
다음 예에서는 CREATE EXTERNAL FUNCTION이 묶인 역할을 사용하여 역할 RoleB
를 수임합니다.
create external function lambda_example(varchar) returns varchar volatile lambda 'exampleLambdaFunction' iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
추가 정보
자세한 내용은 IAM 역할을 사용하여 COPY, UNLOAD, CREATE EXTERNAL FUNCTION 및 CREATE EXTERNAL SCHEMA 작업에 대한 권한 부여 섹션도 참조하세요.