EC2経由でAmazon Redshiftアクセスする際の情報を揃える

2014.08.13

小ネタです。(ボリューム的に)

Amazon Redshiftの環境及び、その環境下で日々のタスクをこなすための構成は構築の手段や方法が幾つか考えられるかと思いますが、一番オーソドックスな形としては、LinuxベースのEC2サーバをバッチサーバとして1つ立てて、その環境下でスクリプトを実行し、諸々の作業を行うというのが挙げられるでしょう。当エントリではその処理実施の際の肝となる『Amazon Redshiftクラスタへのアクセス』をEC2から行う際に必要となる情報を揃えるためのTips的情報をサンプルコードを交えて解説・ご紹介して行きたいと思います。

目次

IAMロールの作成

Amazon Redshiftにアクセスするには、アクセスキーID(ACCESS_KEY_ID)とシークレットアクセスキー(SECRET_ACCESS_KEY)が最低限必要となります。1つの手段としては、IAMユーザを作成してそのアクセスキーIDとシークレットアクセスキーをそのまま利用する、というものがありますがこれはセキュリティ上あまり好ましいものではないでしょう。そこで当エントリではIAMロールを経由してこれらの情報を取得する方法をご紹介します。

まずはIAMロールを作成します。今回はAWS Service Roles:EC2、Policy:Power User AccessのIAMロールを作成しました。

iam-role

アクセスする環境となるEC2サーバを構築します。その際、上記で作成したIAM RoleをEC2に紐付けておいてください。

iam-role2

環境構築 on Amazon EC2

AWS Linxu AMIを使いEC2を起動した後、以下のコマンドを実行して各種パッケージを導入してください。『jq』を新規インストールし、AWS CLIを最新版にアップグレードします。

$ sudo yum -y update
$ sudo yum -y install jq gcc
$ sudo easy_install pip
$ sudo pip install --upgrade awscli
$ jq --version
jq version 1.3
$ aws --version
aws-cli/1.4.1 Python/2.6.9 Linux/3.10.42-52.145.amzn1.x86_64
$ 

EC2上でIAM Roleからセキュリティ認証情報を取得する

EC2に紐付けたIAM Roleから必要な情報を取得するには、『インスタンスメタデータ』の仕組みを利用します。EC2内部からであれば、自分自身(インスタンス)の情報をこの仕組みを用いて取得する事が可能です。IAM Roleに関する情報もこのインスタンスメタデータの中に含まれていますので、同じ仕組みを用いて情報を取得する事が出来ます。

curlコマンドを使い、所定のURLにアクセスしてみます。最後のIAM Roleに関する部分は作成したIAM Roleの名前が入ります。適宜置き換えてください。

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/cm-xxxx-xxxx-xxxx-role/
{
  "Code" : "Success",
  "LastUpdated" : "2014-08-13T00:48:06Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ASIAXXXXXXXXXXXXXXXX",
  "SecretAccessKey" : "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
  "Token" : "XxxXX(中略)xxXx==",
  "Expiration" : "2014-08-13T07:03:59Z"
}
$

AWS CLIでAmazon Redshiftクラスタに関する情報を取得する

一方、Amazon Redshiftクラスタの接続情報についてはAWS CLIを用います。以下のコマンドを実行する事でクラスタの情報を取得する事が出来ます。得られる結果はJSONで階層構造化されたものが出力されますので、IAM Role情報同様、jqを使って必要な部分を抽出する形となります。

$ aws redshift describe-clusters --cluster-identifier (クラスタ名)

サンプルコード

上記を踏まえたサンプルコード(シェルスクリプト)が以下となります。IAM Roleの情報を利用する場合、アクセスキーID、シークレットアクセスキーの他にトークン情報も必要となりますので併せて取得しています。

また、Amazon RedshiftクラスタのDB接続に用いるユーザー名及びパスワードですが、これはユーザー個別のものでもありますので個別に設定するしか無さそうです。そのままこのシェルスクリプトに記載するか、または別の方法で接続情報を取得・設定する機構を組み込むか、でしょうか。

$ vi redshift-variables.sh
----------------
#!/bin/sh

IAM_ROLE_NAME='cm-xxxx-xxxx-xxxx-role'
REDSHIFT_CLUSTER_ID='cm-XXXXXXXXXXX'
AWS_DEFAULT_REGION='us-east-1'

ACCESS_KEY_ID=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/$IAM_ROLE_NAME/ | jq -r '.AccessKeyId'`
SECRET_ACCESS_KEY=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/$IAM_ROLE_NAME/ | jq -r '.SecretAccessKey'`
TEMP_TOKEN=`curl http://169.254.169.254/latest/meta-data/iam/security-credentials/$IAM_ROLE_NAME/ | jq -r '.Token'`

REDSHIFT_DBHOST=`aws redshift describe-clusters --cluster-identifier cm-redshift --region $AWS_DEFAULT_REGION | jq -r '.Clusters[0].Endpoint.Address'`
REDSHIFT_DBPORT=`aws redshift describe-clusters --cluster-identifier cm-redshift --region $AWS_DEFAULT_REGION | jq -r '.Clusters[0].Endpoint.Port'`
REDSHIFT_DBNAME=`aws redshift describe-clusters --cluster-identifier cm-redshift --region $AWS_DEFAULT_REGION | jq -r '.Clusters[0].DBName'`
REDSHIFT_DBUSER=''
REDSHIFT_DBPASS=''

echo 'ACCESS_KEY_ID     :'$ACCESS_KEY_ID
echo 'SECRET_ACCESS_KEY :'$SECRET_ACCESS_KEY
echo 'TEMP_TOKEN        :'$TEMP_TOKEN
echo 'REDSHIFT_DBHOST   :'$REDSHIFT_DBHOST
echo 'REDSHIFT_DBPORT   :'$REDSHIFT_DBPORT
echo 'REDSHIFT_DBNAME   :'$REDSHIFT_DBNAME

まとめ

以上、サンプルスクリプトを交えてのAmazon Redshiftアクセスに関するまとめでした。この手のスクリプトは一旦作ってしまえばどうって事は無いですが、ゼロから接続環境を整える...となると割と手間が掛かるものです。この解説及びサンプルスクリプトが環境構築の際の一助となれば幸いです。こちらからは以上です。