Quantcast
Channel: プログラミング
Viewing all articles
Browse latest Browse all 7831

AWSのSSO環境で一時的な認証情報を用いる - notebook

$
0
0

よくAWSのリソースへアクセスするためにACCESS_KEY_ID,SECRET_ACCESS_KEYなどが含まれるcredentialsを用意するパターンがある

現在だと推奨される方法ではないが、ツールなどでAWSと連携する場合に必要なことがぼちぼちある

今回は、AWSをSSO環境で使っている状況で、DuckDBのS3ファイルへのクエリをするために掲題の手法で実施したのでそのときのメモ

DuckDB S3上のJSONファイルへのクエリ

ドキュメントを読むとCREATE SECRETCHAIN '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名}

で該当プロファイルでの一時認証情報を取得できる

これだけ

AccessKeyIdSecretAccessKeyなどの情報が出力されるので利用する

下記スクリプトは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が残るので同様だった

一時的な認証情報であればまぁ一時的だし…となるが、そうじゃない場合は不安が残るな…という気持ちになった


Viewing all articles
Browse latest Browse all 7831

Trending Articles