[Amazon Redshift] RedshiftのIAM Roles利用が可能となりました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSチームのすずきです。

先日のAWSのアップデートにより、Amazon Redshiftのインポート(COPY)、エクスポート(UNLOAD)先として利用する、 S3などのアクセス権限管理に、IAMロールを利用する事が可能になりました。

IAMロールを利用したCOPY操作を試す機会がありましたので、紹介します。

Amazon Redshift now supports using IAM roles with COPY and UNLOAD commands

IAM設定

IAMロール作成

  • AWSコンソール、IAM(Identity & Access Management)を利用します。

redshift-iam-role-01

  • ロールを指定し「新しいロールの作成」を行います。

redshift-iam-role-02

  • 任意のロール名を記入します。

redshift-iam-role-03

  • 新しく追加されたAWSサービスロール、「Amazon Redshift」を選択します。

redshift-iam-role-04

  • ポリシーのアタッチにて、任意のポリシーをアタッチします。

redshift-iam-role-05-640x322

  • ロールの信頼されたエンティティが「redshift.amazon.com」である事を確認し、ロールを作成します。

redshift-iam-role-06

  • 今回「ReadOnlyAccess」の管理ポリシーを利用しましたが、複数システムが稼働する環境などでは、ロール作成後適切なインラインポリシーへの変更をお勧めします。

redshift-iam-role-07

Redshift設定

RedshiftクラスタにIAMロール割当

  • AWSコンソール Redshift ダッシュボードより「Clusters」を開きます
  • ロール付与対象クラスタを指定し、「Manage IAM Roles」を指定します

redshift-iam-role-13

  • 先ほど作成したRedshift用のIAMロールを指定します

redshift-iam-role-14-2

  • 適切なロールが選択された事を確認し、「Apply change」より設定反映をおこないます

redshift-iam-role-16-2

  • 設定対象のRedshiftクラスタ、数分間ステータス「modifying」となります

redshift-iam-role-17

  • 数分後にステータス「available」となれば、設定完了です。
  • 今回の作業中、psqlでRedshiftに接続していましたが、そのセッションは切断される事はありませんでした。

redshift-iam-role-18

COPY検証

S3

redshift-role-s3-dynamo-20160401 redshift-role-mmmmmmmmm

COPY

export DBPASSWORD=#####
export DBENDPOINT=#####
export DBUSER=#####
export DBNAME=#####
export DBPORT=8192

psql -h ${DBENDPOINT} -U ${DBUSER} -d ${DBNAME} -p ${DBPORT} << _EoF

  CREATE temp TABLE temp_test
      ( col1  varchar(128)
      , col2  varchar(128)
      )
    ;

    COPY temp_test from 's3://redshift-test-<バケット名>/'
    CREDENTIALS 'aws_iam_role=arn:aws:iam::nnnnnnnnnnnn:role/redshift-role-mmmmmmmmm'
    REGION 'us-east-1' csv gzip
    ;

_EoF
  • s3://<バケット名> :任意のS3バケット名
  • : AWSアカウント番号(数値)
  • : 作成したロール
  • オプション
    • REGION 'us-east-1':US東のS3を利用した為、RedshiftとS3が同一であれば省略可能
      • csv gzip : インポート元はCSV、gzip圧縮データを利用

COPY結果

CREATE TABLE
INFO:  Load into table 'temp_test' completed, 182851 record(s) loaded successfully.
COPY

DynamoDB

COPY

psql -h ${DBENDPOINT} -U ${DBUSER} -d ${DBNAME} -p ${DBPORT} << _EoF

  CREATE temp TABLE temp_test
      ( col1  varchar(128)
      , col2  varchar(128)
      )
    ;

    COPY temp_test from 'dynamodb://redshift-test-20160401'
    CREDENTIALS 'aws_iam_role=arn:aws:iam::nnnnnnnnnnnn:role/redshift-role-mmmmmmmmm'
    readratio 1
    ;

_EoF

  • dynamodb://redshift-test-20160401 :任意のDynamoDBテーブル名
  • オプション
    • readratio 1 :DynamoDBキャパシティ1消費(1〜200)

COPY結果

CREATE TABLE
INFO:  Load into table 'temp_test' completed, 1 record(s) loaded successfully.
COPY

まとめ

今回のアップデートにより、Redshift専用のIAMロールを作成する事で、 アクセスキーの漏洩リスクや、一時セッション認証情報の発行の手間をかける事なく 安全にS3、DynamoDBを利用する事が可能になりました。

Redshiftのインポート、エクスポート処理、 Lambdaの実行時間制限(2016年4月現在5分)が問題とならない軽量なものであれば、 VPC対応したLambdaとスケジュールイベントにより、EC2レスでセキュアな実装の実現性が増しました。

IAM のベストプラクティスとして、EC2ではロールの利用が推奨されていますが、 Redshiftも同様、IAM権限の付与が必要な場合、IAMロールの利用を第一にご検討ください。

参考

credentials指定方法

アクセスキー埋込

credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' 

一時的セッション認証情報(STS)

credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>';

IAMロール指定

credentials 'aws_iam_role=<role-arn>'