Atehna JDBC ドライバで Credential を明示的に指定せずに Athena にアクセスする
少し前まで対応していなかったのか、JDBC ドライバで Athena にアクセスする際に Credential を明示的に渡さず、EC2 インスタンスなどに付与されているロールの権限でアクセスする方法が探しても見つからなかったのですが、(いつからかはわかりませんが) 今はできるようになっていました。
これで Credential の管理を気にせずに Athena JDBC ドライバが使えます。
EC2 でも Lambda でもこれで OK。
を探してアクセスキー ID、シークレットアクセスキーを取得するように動作します。AWS CLI の Credential を探す動作と似てますね (boto3 っぽい感じ)。
このクラスを使うと、特にプロパティファイルや ~/.aws/credentials で認証情報を指定していない場合、EC2 の場合はインスタンスメタデータから、Lambda の場合は環境変数からアクセスキー ID、シークレットアクセスキーを取得し、EC2 インスタンスや Lambda についているロールの権限で Athena にアクセスできるようになります。
ちなみにこの DefaultAWSCredentialsProviderChain を使った方法、今の所は AWS Developer Guide では Undocumented の模様。Athena JDBC ドライバのドキュメントには InstanceProfileCredentialsProvider を使った方法は書いてありますが、このクラスはあくまで EC2 インスタンス用 (インスタンスメタデータから取得できる場合のみ使える方法) なので、Lambda では使えないです (Lambda 関数内からインスタンスメタデータを取れないので)。DefaultAWSCredentialsProviderChain の方が何も考えずに色々な環境で使えるので、こっちを使っておいた方がよさそう。
これで Credential の管理を気にせずに Athena JDBC ドライバが使えます。
How to configure
aws_credentials_provider_class に com.amazonaws.athena.jdbc.shaded.com.amazonaws.auth.DefaultAWSCredentialsProviderChain を指定する。これだけです。EC2 でも Lambda でもこれで OK。
How it works
JavaDoc によると、DefaultAWSCredentialsProviderChain クラスは- 環境変数
- Java のシステムプロパティ
- ~/.aws/credentials
- ECS、EC2 のインスタンスメタデータ
を探してアクセスキー ID、シークレットアクセスキーを取得するように動作します。AWS CLI の Credential を探す動作と似てますね (boto3 っぽい感じ)。
このクラスを使うと、特にプロパティファイルや ~/.aws/credentials で認証情報を指定していない場合、EC2 の場合はインスタンスメタデータから、Lambda の場合は環境変数からアクセスキー ID、シークレットアクセスキーを取得し、EC2 インスタンスや Lambda についているロールの権限で Athena にアクセスできるようになります。
ちなみにこの DefaultAWSCredentialsProviderChain を使った方法、今の所は AWS Developer Guide では Undocumented の模様。Athena JDBC ドライバのドキュメントには InstanceProfileCredentialsProvider を使った方法は書いてありますが、このクラスはあくまで EC2 インスタンス用 (インスタンスメタデータから取得できる場合のみ使える方法) なので、Lambda では使えないです (Lambda 関数内からインスタンスメタデータを取れないので)。DefaultAWSCredentialsProviderChain の方が何も考えずに色々な環境で使えるので、こっちを使っておいた方がよさそう。
Comments
Post a Comment