Amazon Redshift Spectrum에 대한 IAM 정책 - Amazon Redshift

Amazon Redshift Spectrum에 대한 IAM 정책

기본적으로 Amazon Redshift Spectrum은 AWS Glue를 지원하는 AWS 리전의 AWS Glue Data Catalog를 사용합니다. 다른 AWS 리전에서는 Redshift Spectrum이 Athena Data Catalog를 사용합니다. 클러스터가 AWS Glue 또는 Athena에 있는 외부 데이터 카탈로그와 Amazon S3에 있는 데이터 파일에 액세스하려면 권한 부여가 필요합니다. 이러한 권한은 클러스터에 연결되어 있는 IAM(AWS Identity and Access Management) 역할을 참조하면 부여할 수 있습니다. Apache Hive 메타스토어를 사용하여 데이터 카탈로그를 관리하는 경우 Athena에 대한 액세스 권한을 제공할 필요가 없습니다.

역할을 함께 묶어 클러스터가 클러스터에 연결되어 있지 않은 다른 역할을 수임하도록 할 수 있습니다. 자세한 내용은 Amazon Redshift Spectrum에서 IAM 역할 연결 단원을 참조하십시오.

액세스하는 AWS Glue 카탈로그가 보안을 강화하기 위해 암호화될 수 있습니다. AWS Glue 카탈로그가 암호화된 경우 AWS Glue 데이터 카탈로그에 액세스하려면 AWS Glue에 AWS KMS 키가 필요합니다. 자세한 내용은 AWS Glue Developer GuideEncrypting Your AWS Glue Data Catalog 섹션을 참조하세요.

참고

현재 Athena Data Catalog에 Redshift Spectrum 외부 테이블이 있다면 Athena Data Catalog를 AWS Glue Data Catalog로 마이그레이션할 수 있습니다. AWS Glue 데이터 카탈로그를 Redshift Spectrum과 함께 사용하려면 IAM 정책을 변경해야 할 수 있습니다. 자세한 내용은 Athena User GuideUpgrading to the AWS Glue Data Catalog 섹션을 참조하세요.

Amazon S3 권한

클러스터는 적어도 Amazon S3 버킷에 대한 GET 및 LIST 액세스가 필요합니다. 버킷이 클러스터와 동일한 AWS 계정에 속하지 않는 경우에도 마찬가지로 클러스터에게 데이터에 액세스할 수 있는 권한을 부여해야 합니다. 자세한 내용은 Amazon Redshift가 사용자를 대신하여 다른 AWS 서비스에 액세스할 수 있도록 권한 부여 섹션을 참조하세요.

참고

Amazon S3 버킷은 특정 VPC 엔드포인트로부터의 액세스만 제한하는 버킷 정책을 사용할 수 없습니다.

다음 정책은 모든 Amazon S3 버킷에 대한 GET 및 LIST 액세스 권한을 부여합니다. 이 정책은 COPY 작업뿐 아니라 Redshift Spectrum의 Amazon S3 버킷에 대한 액세스를 허용합니다.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "*" }] }

다음 정책은 myBucket이라는 Amazon S3 버킷에 대한 GET 및 LIST 액세스 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*" }] }

계정 간 Amazon S3 권한

Redshift Spectrum에 다른 AWS 계정에 속한 Amazon S3 버킷의 데이터에 액세스할 수 있는 권한을 부여하려면 Amazon S3 버킷에 다음 정책을 추가합니다. 자세한 내용은 교차 계정 버킷 권한 부여를 참조하십시오.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::redshift-account:role/spectrumrole" }, "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucketname", "arn:aws:s3:::bucketname/*" ] } ] }

Redshift Spectrum을 사용하여 액세스 권한을 부여하거나 제한하기 위한 정책

Redshift Spectrum을 사용하는 경우에 한해 Amazon S3 버킷에 대한 액세스 권한을 부여하려면 사용자 에이전트 AWS Redshift/Spectrum에 대한 액세스를 허용하는 조건을 추가합니다. 다음 정책은 Redshift Spectrum에 한해 Amazon S3 버킷에 대한 액세스를 허용합니다. COPY 작업 같은 다른 액세스는 제외됩니다.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }

마찬가지로 COPY 작업에 대한 액세스는 허용하지만 Redshift Spectrum 액세스는 제외하는 IAM 역할을 생성할 수 있습니다. 이를 위해서는 사용자 에이전트 AWS Redshift/Spectrum에 대한 액세스를 거부하는 조건을 추가하면 됩니다. 다음 정책은 Redshift Spectrum을 제외하고 Amazon S3 버킷에 대한 액세스를 허용합니다.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:Get*", "s3:List*"], "Resource": "arn:aws:s3:::myBucket/*", "Condition": {"StringNotEquals": {"aws:UserAgent": "AWS Redshift/Spectrum"}} }] }

최소 권한을 부여하기 위한 정책

다음 정책은 Amazon S3, AWS Glue 및 Athena에서 Redshift Spectrum을 사용하는 데 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListMultipartUploadParts", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::bucketname", "arn:aws:s3:::bucketname/folder1/folder2/*" ] }, { "Effect": "Allow", "Action": [ "glue:CreateDatabase", "glue:DeleteDatabase", "glue:GetDatabase", "glue:GetDatabases", "glue:UpdateDatabase", "glue:CreateTable", "glue:DeleteTable", "glue:BatchDeleteTable", "glue:UpdateTable", "glue:GetTable", "glue:GetTables", "glue:BatchCreatePartition", "glue:CreatePartition", "glue:DeletePartition", "glue:BatchDeletePartition", "glue:UpdatePartition", "glue:GetPartition", "glue:GetPartitions", "glue:BatchGetPartition" ], "Resource": [ "*" ] } ] }

데이터 카탈로그에 AWS Glue 대신 Athena를 사용할 경우 정책에 모든 Athena 액세스 권한이 필요합니다. 다음 정책은 Athena 리소스에 대한 액세스 권한을 부여합니다. 외부 데이터베이스가 Hive 메타스토어에 있는 경우 Athena 액세스 권한이 필요 없습니다.

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["athena:*"], "Resource": ["*"] }] }

Amazon Redshift Spectrum에서 IAM 역할 연결

역할을 클러스터에 연결하면 클러스터가 Amazon S3, Athena 및 AWS Glue에 액세스할 수 있는 역할을 맡을 수 있습니다. 클러스터에 연결된 역할에 필요한 리소스에 대한 액세스 권한이 없는 경우 다른 계정에 속한 다른 역할을 함께 묶을 수 있습니다. 그러면 클러스터는 함께 묶은 역할을 일시적으로 수임하여 데이터에 액세스합니다. 역할을 함께 묶어 교차 계정 액세스를 부여할 수도 있습니다. 최대 10개의 역할을 함께 묶을 수 있습니다. 체인의 각 역할은 클러스터가 체인의 끝에 있는 역할을 수임할 때까지 체인의 다음 역할을 수임합니다.

역할을 함께 묶으려면 역할 간에 신뢰 관계를 구성해야 합니다. 다른 역할을 수임하는 역할에는 지정된 역할을 수임하도록 허용하는 권한 정책이 있어야 합니다. 결국 권한을 전달하는 역할에는 해당 권한을 다른 역할에 전달하도록 허용하는 신뢰 정책이 있어야 합니다. 자세한 내용은 Amazon Redshift에서 IAM 역할 연결 섹션을 참조하세요.

CREATE EXTERNAL SCHEMA 명령을 실행하여 쉼표로 구분된 역할 ARN 목록을 포함해 역할을 함께 묶을 수 있습니다.

참고

함께 묶은 역할 목록에 공백을 포함하면 안 됩니다.

다음 예에서 MyRedshiftRole은 클러스터에 연결됩니다. MyRedshiftRoleAcmeData 역할이 111122223333 계정에 속한 것으로 간주합니다.

create external schema acme from data catalog database 'acmedb' region 'us-west-2' iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole,arn:aws:iam::111122223333:role/AcmeData';

AWS Glue 데이터 카탈로그에 대한 액세스 제어

데이터 카탈로그에 AWS Glue를 사용하는 경우 IAM 정책을 사용해 AWS Glue 데이터 카탈로그에 세분화된 액세스 제어를 적용할 수 있습니다. 예를 들어 특정 IAM 역할에 데이터베이스 및 테이블 몇 개만 보이도록 하려고 할 수 있습니다.

다음 단원에서는 AWS Glue 데이터 카탈로그에 저장된 데이터에 대한 다양한 액세스 수준에 관한 IAM 정책을 설명합니다.

데이터베이스 작업에 대한 정책

사용자에게 데이터베이스 보기 및 생성 권한을 부여하려는 경우 사용자에게는 데이터베이스 및 AWS Glue 데이터 카탈로그 둘 다에 대한 액세스 권한이 필요합니다.

다음 예 쿼리는 데이터베이스를 생성합니다.

CREATE EXTERNAL SCHEMA example_db FROM DATA CATALOG DATABASE 'example_db' region 'us-west-2' IAM_ROLE 'arn:aws:iam::redshift-account:role/spectrumrole' CREATE EXTERNAL DATABASE IF NOT EXISTS

다음 IAM 정책은 데이터베이스 생성에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:CreateDatabase" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:catalog" ] } ] }

다음 예 쿼리는 현재 데이터베이스를 나열합니다.

SELECT * FROM SVV_EXTERNAL_DATABASES WHERE databasename = 'example_db1' or databasename = 'example_db2';

다음 IAM 정책은 현재 데이터베이스를 나열하는 데 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetDatabases" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:database/example_db1", "arn:aws:glue:us-west-2:redshift-account:database/example_db2", "arn:aws:glue:us-west-2:redshift-account:catalog" ] } ] }

테이블 작업에 대한 정책

사용자에게 테이블에 대한 보기, 생성, 삭제, 변경 또는 기타 작업을 수행할 수 있는 권한을 부여하려면 몇 가지 유형의 액세스가 필요합니다. 테이블 자체, 테이블이 속한 데이터베이스 및 카탈로그에 대한 액세스가 필요합니다.

다음 예 쿼리는 외부 테이블을 생성합니다.

CREATE EXTERNAL TABLE example_db.example_tbl0( col0 INT, col1 VARCHAR(255) ) PARTITIONED BY (part INT) STORED AS TEXTFILE LOCATION 's3://test/s3/location/';

다음 IAM 정책은 외부 테이블 생성에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:CreateTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

다음 각 예 쿼리는 현재 외부 테이블을 나열합니다.

SELECT * FROM svv_external_tables WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';
SELECT * FROM svv_external_columns WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';
SELECT parameters FROM svv_external_tables WHERE tablename = 'example_tbl0' OR tablename = 'example_tbl1';

다음 IAM 정책은 현재 외부 테이블을 나열하는 데 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTables" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl1" ] } ] }

다음 예 쿼리는 기존 테이블을 변경합니다.

ALTER TABLE example_db.example_tbl0 SET TABLE PROPERTIES ('numRows' = '100');

다음 IAM 정책은 기존 테이블 변경에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTable", "glue:UpdateTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

다음 예 쿼리는 기존 테이블을 삭제합니다.

DROP TABLE example_db.example_tbl0;

다음 IAM 정책은 기존 테이블 삭제에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:DeleteTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

파티션 작업에 대한 정책

사용자에게 파티션 수준 작업(보기, 생성, 삭제, 변경 등)을 수행할 수 있는 권한을 부여하려면 파티션이 속한 테이블과 데이터베이스 및 데이터 카탈로그에 대한 사용 권한이 필요합니다. 또한 관련 데이터베이스 및 AWS Glue 데이터 카탈로그에 대한 권한도 필요합니다.

다음 예 쿼리는 파티션을 생성합니다.

ALTER TABLE example_db.example_tbl0 ADD PARTITION (part=0) LOCATION 's3://test/s3/location/part=0/'; ALTER TABLE example_db.example_t ADD PARTITION (part=1) LOCATION 's3://test/s3/location/part=1/';

다음 IAM 정책은 파티션 생성에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetTable", "glue:BatchCreatePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

다음 예 쿼리는 현재 파티션을 나열합니다.

SELECT * FROM svv_external_partitions WHERE schemname = 'example_db' AND tablename = 'example_tbl0'

다음 IAM 정책은 현재 파티션을 나열하는 데 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetPartitions", "glue:GetTables", "glue:GetTable" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

다음 예 쿼리는 기존 파티션을 변경합니다.

ALTER TABLE example_db.example_tbl0 PARTITION(part='0') SET LOCATION 's3://test/s3/new/location/part=0/';

다음 IAM 정책은 기존 파티션 변경에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:GetPartition", "glue:UpdatePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }

다음 예 쿼리는 기존 파티션을 삭제합니다.

ALTER TABLE example_db.example_tbl0 DROP PARTITION(part='0');

다음 IAM 정책은 기존 파티션 삭제에 필요한 최소 권한을 부여합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:DeletePartition" ], "Resource": [ "arn:aws:glue:us-west-2:redshift-account:catalog", "arn:aws:glue:us-west-2:redshift-account:database/example_db", "arn:aws:glue:us-west-2:redshift-account:table/example_db/example_tbl0" ] } ] }