Table of Contents
やること・つかうもの
やること
- AWSマネージメントコンソールへのログインURLの生成
つかうもの
- ruby : 2.5
- AWS SDK : 3.0.1
- 対象AWSアカウントのIAMアクセス情報
やってみる
手順としては、以下です。
- IAMアカウントのstsクレデンシャルを取得
- AWSのフェデレーションポイントへリクエストを投げ、トークンを取得する
- トークンを使ってログイン用URLを整形する
コードはこんな感じ
require "aws-sdk"
require "open-uri"
cred = Aws::Credentials.new(access_key_id, secret_access_key)
sts = Aws::STS::Client.new(region: 'us-east-1', credentials: cred)
# ログインURLにて操作できる権限を設定
policy = {
Version: '2012-10-17',
Statement: {
Effect: 'Allow',
Action: '*',
Resource: '*'
}
}
session = sts.get_federation_token({
duration_seconds: 3600,
name: 'fusic',
policy: policy.to_json
})
# ログインセッションが切れたときのリンクURL
issuer_url = "https://fusic.co.jp"
# ログイン後のリダイレクトページ、今回はトップ画面
console_url = "https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1"
# AWSフェデレーションエンドポイント
signin_url = "https://signin.aws.amazon.com/federation"
# 認証情報からセッション文字列を生成
session_json = {
sessionId: session.credentials.access_key_id,
sessionKey: session.credentials.secret_access_key,
sessionToken: session.credentials.session_token
}.to_json
# セッション文字列をURLエンコード
get_signin_token_url = signin_url + "?Action=getSigninToken" + "&SessionType=json&Session=" + CGI.escape(session_json)
# AWSフェデレーションエンドポイントにリクエストを送信してサインイントークンを取得
returned_content = URI.parse(get_signin_token_url).read
signin_token = JSON.parse(returned_content)['SigninToken']
signin_token_param = "&SigninToken=" + CGI.escape(signin_token)
# 5. ログイン用URLを作成
issuer_param = "&Issuer=" + CGI.escape(issuer_url)
destination_param = "&Destination=" + CGI.escape(console_url)
login_url = signin_url + "?Action=login" + signin_token_param + issuer_param + destination_param
puts login_url
生成されたURLをブラウザでたたいてみるとマネージメントコンソールに行けるはずです。
おわりに
AWS SDKを利用してログインURLを生成するTipsでした。
AWSをより快適に使うための誰かの助けになれば。
今回はIAMアカウント自身のURLを生成したので、結局IAMアカウントがログインしたいアカウント分必要のように思えますが、AssumeRole
を利用してセッション情報を取得すればその必要もありません。
その内容についてはまた別の記事で書けたらと思います。
uchida
福岡でWebエンジニアやってます。PHP, クラウド, インフラあたりが好き。