[小ネタ] CodeBuild に割り当てた IAM Role のクレデンシャルを取得する

2018.02.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、藤本です。

AWS の操作を行う時、各種サービスに対する利用権限を持つ IAMユーザーや IAMロールの認証情報(クレデンシャル)が必要となります。AWS の公式 SDK、ライブラリや、AWS を意識したライブラリは特に意識することなく、OS 環境変数やクレデンシャルファイル、インスタンスメタデータから優先順位に従ってクレデンシャルを取得します。しかし、中には明示的にアクセスキー、シークレットキー、IAM Roleの場合はセッショントークンを与える必要があるライブラリもあります。

そんなライブラリを使う機会があり、かつ、ユニットテストを行うためにそんなライブラリを CodeBuild 上で使いたかったのですが、CodeBuild 上のクレデンシャル取得方法を調べたのでその備忘録です。

結論

ECS のタスクロールのクレデンシャル取得と同じでした。

Shell(curlコマンド)

curl 169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI}

JSON 形式で返ってくるので、各種情報を取り出すには jq を使うと簡単です。例えばアクセスキーを取得する場合。

curl 169.254.170.2${AWS_CONTAINER_CREDENTIALS_RELATIVE_URI} |jq -r .AccessKeyId

Python(botocore)

from botocore.utils import ContainerMetadataFetcher
import os

uri = os.environ.get('AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'))
credential = ContainerMetadataFetcher().retrieve_uri(uri)

### credential は dict で返ってくる。アクセスキーを取得する場合
access_key = credential.get('AccessKeyId')

まとめ

もっと AWS のクレデンシャルの取り扱いが普及し、明示的に与えずともいい感じに取ってくれるといいのですが、、、どなたかのお役に立てば幸いです。