この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
RedashのデータソースとしてAthenaを指定する場合、アクセスキーの指定が求められます。ただ、アクセスキー漏洩を考慮して極力IAM Roleへのスイッチしたいのが本音です。
どうにかしてRoleArnを使えないだろうかとソースコードを追ってみたところ、ドキュメント上には存在しないものの、とある環境変数を指定しておくとアクセスキーの欄がIAM RoleArnの入力欄に切り替わる仕組みであることを確認しました。
実際の設定と、画面の違いについてまとめました。
環境変数に指定する
必要なキーは ATHENA_ASSUME_ROLE
です。設定する値は何でも構いません。
export ATHENA_ASSUME_ROLE=1
cdkでFargateを使う場合はContainerの environment
に追加するだけです。
IAM RoleArnのフォームへ切り替える
環境変数に設定されていれば自動で変わります。変更前後は以下の通り。
変更前 | 変更後 |
---|---|
![]() |
![]() |
IAM Role to AssumeにRoleArnを指定し、External ID to be used while STS assume roleにはredash等の固有の文字列を入れておきましょう。
実装について
該当するdefaultブランチ(CommitHash:f21f7e2)でのコードです。環境変数があった場合はRoleArnの取得フォームへと切り替えて、Glueからスキーマを取得する際に認証しています。
ASSUME_ROLE = parse_boolean(os.environ.get("ATHENA_ASSUME_ROLE", "false"))
if ASSUME_ROLE:
del schema["properties"]["aws_access_key"]
del schema["properties"]["aws_secret_key"]
schema["secret"] = []
schema["order"].insert(1, "iam_role")
schema["order"].insert(2, "external_id")
schema["properties"].update(
{
"iam_role": {"type": "string", "title": "IAM role to assume"},
"external_id": {
"type": "string",
"title": "External ID to be used while STS assume role",
},
}
)
else:
schema["order"].insert(1, "aws_access_key")
schema["order"].insert(2, "aws_secret_key")
def _get_iam_credentials(self, user=None):
if ASSUME_ROLE:
role_session_name = "redash" if user is None else user.email
sts = boto3.client("sts")
creds = sts.assume_role(
RoleArn=self.configuration.get("iam_role"),
RoleSessionName=role_session_name,
ExternalId=self.configuration.get("external_id"),
)
return {
"aws_access_key_id": creds["Credentials"]["AccessKeyId"],
"aws_secret_access_key": creds["Credentials"]["SecretAccessKey"],
"aws_session_token": creds["Credentials"]["SessionToken"],
"region_name": self.configuration["region"],
}
else:
def __get_schema_from_glue(self):
client = boto3.client("glue", **self._get_iam_credentials())
schema = {}
実装自体はシンプルですが、追ってみないと気が付かない代物でした。
なお、初回スキーマ取得時には認証に時間が掛かっているのか読み込めず、再度スキーマを取得してみると正常に読み込まれました。
あとがき
RedashからAthenaへ接続するためだけにアクセスキーを発行したくない場合にはとても助かる実装になっています。IAM UserからIAM Roleへの切り替えが求められる状況が故にRedashが選択外になっていた場合にはおすすめです。