よくAWSのリソースへアクセスするためにACCESS_KEY_ID
,SECRET_ACCESS_KEY
などが含まれるcredentialsを用意するパターンがある
現在だと推奨される方法ではないが、ツールなどでAWSと連携する場合に必要なことがぼちぼちある
今回は、AWSをSSO環境で使っている状況で、DuckDBのS3ファイルへのクエリをするために掲題の手法で実施したのでそのときのメモ
DuckDB S3上のJSONファイルへのクエリ
ドキュメントを読むとCREATE SECRET
でCHAIN 'sso'
と指定すればよいと記述されているがどうにもうまく動作しなかった
DuckDBには通常のSECRET登録方法としてACCESS_KEY_ID
,SECRET_ACCESS_KEY
を指定するも存在する
SSO環境に対応していない場合、通常のACCESS_KEY_ID
,SECRET_ACCESS_KEY
を指定して連携する方法しか存在しないケースがあるが、SSO環境でも一時的な認証情報を取得して通常のシークレット設定を行い連携する方法があるようなので調べて実施した
sso利用状態で一時的な認証情報を取得する
以下aws-sso-utilを使っている前提
aws-sso-util login ${url}
ブラウザに遷移して許可するか聞かれるので許可する
export-credentials
AWS CLIにexport-credentialsというコマンドがあるのでそれを利用する
aws configure export-credentials --profile {profile名}
で該当プロファイルでの一時認証情報を取得できる
これだけ
AccessKeyId
やSecretAccessKey
などの情報が出力されるので利用する
下記スクリプトはDuckDBでのSECRET登録用に簡単なスクリプトを書いて実行結果を貼り付けるだけにしたもの
連携するツールによって必要なフォーマットにして使えば良い
#!/bin/bash profile=$1 res=$(aws configure export-credentials --profile $profile) key_id=$(echo ${res} | jq -cr '.AccessKeyId') secret=$(echo ${res} | jq -cr '.SecretAccessKey') session_token=$(echo ${res} | jq -cr '.SessionToken') cat << EOF CREATE SECRET secret1 ( TYPE S3, KEY_ID '${key_id}', SECRET '${secret}', SESSION_TOKEN '${session_token}', REGION 'ap-northeast-1' ); EOF
profile
は.aws/config
の中に定義されているprofile名を引数に渡して実行すればOK
登録されているシークレットの確認
D SELECT * FROM duckdb_secrets();
データの取得
D select * from 's3://hoge-log/hogehoge/2024/09/22/fuga.log.gz';
で無事中身を見ることができた
おわり
よくAWSと連携したいけどSSOだからうまくいかない…というケースはありそうで、そういう場合に活用できるので覚えておきたい
DuckDBの話になってしまうが、~/.duckdb_history
に実行コマンドの履歴は残るのでシークレットの扱いには気を付けたい
SECRET登録用にSQLを用意して.read
で読み込んでも実行したSQLが残るので同様だった
一時的な認証情報であればまぁ一時的だし…となるが、そうじゃない場合は不安が残るな…という気持ちになった