AWS CLIを利用して、GetFederationTokenを利用します。
前提条件
S3、STSへの権限
- S3、STSに対してフル権限があること。
AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.7.39
aws --version
aws-cli/1.7.39 Python/2.7.6 Darwin/14.4.0
0. 準備
0.1. リージョンの指定
リージョンを指定しておきます。
export AWS_DEFAULT_REGION=ap-northeast-1
0.2. 変数の確認
プロファイルが想定のものになっていることを確認します。(IAM/STSフル権限が必要です。)
aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  iamFull           manual    --profile
access_key     ****************IK5Q shared-credentials-file    
secret_key     ****************nA0/ shared-credentials-file    
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
0.3. 作業用ディレクトリの確認
カレントディレクトリにファイルを出力する為、作業用のディレクトリをご用意ください。
pwd
ls -l
1. GetFederationToken利用
1.1. Federationユーザ用のポリシー作成
FederationユーザにS3へのアクセス権限を付与します。
FEDERATION_USER=feduser
FILE_FEDERATION_POLICY=${FEDERATION_USER}_POLICY.json \
  && echo ${FILE_FEDERATION_POLICY}
cat << EOF > ${FILE_FEDERATION_POLICY}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}
EOF
cat ${FILE_FEDERATION_POLICY}
JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。
jsonlint -q ${FILE_FEDERATION_POLICY}
1.2. 有効期限の指定
Tokenの有効期限を15分(60*15)に設定します。
EXPIRATION_SECONDS=`expr 60 \* 15` \
  && echo ${EXPIRATION_SECONDS}
1.3. FederationTokenの取得
保存用ファイル名を指定します。
FILE_FEDERATION_TOKEN_OUTPUT=federation_token_output.json
FederationTokenを取得します。
cat << ETX
        FEDERATION_USER: ${FEDERATION_USER}
        FILE_FEDERATION_POLICY: ${FILE_FEDERATION_POLICY}
        EXPIRATION_SECONDS: ${EXPIRATION_SECONDS}
        FILE_FEDERATION_TOKEN_OUTPUT: ${FILE_FEDERATION_TOKEN_OUTPUT}
ETX
aws sts get-federation-token \
  --name ${FEDERATION_USER} \
  --policy file://./${FILE_FEDERATION_POLICY} \
  --duration-seconds ${EXPIRATION_SECONDS} \
  > ${FILE_FEDERATION_TOKEN_OUTPUT} \
  && cat ${FILE_FEDERATION_TOKEN_OUTPUT}
{
    "Credentials": {
        "SecretAccessKey": "c53hZ5iIaCfFUkgVlC58jS8xLPpm0Ys8gHj923Al", 
        "SessionToken": "AQoDYXdzEEQa8AHEsVcD/T/4sTZLGcZyEwxELTcHh1pvq5nzTIz+Xx1NgBtcIHmk57K5xyNp1EIFaQwMgElzygEgnEsp6A+3T2gO204VXG16wOlF84t/8maBv6xNBrShkyCySbUr9iOsB77zL5+9XFvQvCPuXh+nomqyHjKdu3QYWBKH4qzyAEcqkub9vAd3NGpvP2CfHGstSpAiCFDDlCoQ0hp0zQi82vdr06mT5ELvZjbopWIgC88P4OAC41JRavpnv86hLILcqfx38LNiFELfUX+17YwavXpHRow31Jd97rFJpP0vl1SDfY0t67DdQXsTlOpUxFqQh10gi9SorQU=", 
        "Expiration": "2015-07-18T13:27:23Z", 
        "AccessKeyId": "ASIAJYC24GWEJ4HK3BLA"
    }
}
1.4. プロファイルの作成
取得したFederationToken出力を利用してプロファイルを作成します。
PROFILE_NAME=federation-token
FILE_PROFILE_CONFIG=${PROFILE_NAME}.config \
  && echo ${FILE_PROFILE_CONFIG}
echo "[profile ${PROFILE_NAME}]" > ${FILE_PROFILE_CONFIG}
cat ${FILE_FEDERATION_TOKEN_OUTPUT} | awk '
  $1 == "\"AccessKeyId\":" {
    gsub(/\"/,""); gsub(/,/,""); print "aws_access_key_id = "$2
  }
  $1 == "\"SecretAccessKey\":" {
    gsub(/\"/,""); gsub(/,/,""); print "aws_secret_access_key = "$2
  }
  $1 == "\"SessionToken\":" {
    gsub(/\"/,""); gsub(/,/,""); print "aws_session_token = "$2
  }
' >> ${FILE_PROFILE_CONFIG} \
  && cat ${FILE_PROFILE_CONFIG}
1.5. FederationTokenの利用
作成したプロファイルを環境変数に指定します。
export AWS_DEFAULT_PROFILE=${PROFILE_NAME}
export AWS_CONFIG_FILE=${FILE_PROFILE_CONFIG}
FederationTokenから作成したプロファイルに変更されていることを確認します。
aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile            session-token           manual    --profile
access_key     ****************3BLA      config-file    
secret_key     ****************23Al      config-file    
    region           ap-northeast-1              env    AWS_DEFAULT_REGION
Federationユーザ用に設定したS3へのアクセス権限を有していることを確認します。
aws s3 ls
2. FederationTokenの無効化確認
有効期間を過ぎた後、このプロファイルが利用できなくなることを確認します。
明示的に削除する手順は存在しません。