GeekFactory

int128.hatenablog.com

AWS SSOでサードパーティツールを実行する

AWS SSOを利用すると、IAM Access KeyやIAM Secret Access Keyの代わりにブラウザベースの認証を利用してAWS APIにアクセスできます。一方で、AWS SSOに対応しているものはAWS CLI v2ぐらいしかなく、Terraformなどのサードパーティツールはそのままでは使えません。そのため、AWS SSOでサードパーティツールを利用するためのヘルパーツールがいくつか公開されています。例えば aws2-wrap などがあります。

本稿では、AWS SSOやSTSの仕組みを理解するため、手動でShort-term credentialsを取得してサードパーティツールを実行する方法を紹介します。

AWS SSOはすでに設定済みである前提とします。参考までに、AWS SSOの設定例として公式ブログにある How to use G Suite as an external identity provider for AWS SSO を挙げておきます。

Short-term credentialsの取得

SSOセッションが切れている場合は再ログインします。例えば、G Suiteと連携している場合はブラウザでGoogleのログイン画面が表示されます。

% aws s3 ls

The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile.

% aws sso login
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://device.sso.ap-northeast-1.amazonaws.com/
...

まず ~/.aws/config の内容を確認します。ここにはAWS SSOでログインするための設定が格納されています。

[profile example]
sso_start_url = https://d-********.awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = ********
sso_role_name = PowerUserAccess

~/.aws/sso/cache にあるキャッシュファイルの内容を確認します。ここにはSSOログイン時に取得したアクセストークンが格納されています。

{"startUrl": "https://d-********.awsapps.com/start", "region": "ap-northeast-1", "accessToken": "ey********", "expiresAt": "2020-09-09T22:43:10UTC"}

必要な情報が揃ったら get-role-credentials コマンドを実行します。以下の引数が必要です。

  • --role-name: ~/.aws/configsso_role_name を指定します。これはログイン時に選択したロール名になります。
  • --region: ~/.aws/configsso_region を指定します。これはAWS SSOを有効にしたリージョンになります。
  • --account-id: ~/.aws/configsso_account_id を指定します。これはログイン先のAWSアカウントになります。
  • --access-token: ~/.aws/sso/cache にあるキャッシュファイルから accessToken の値を指定します。

get-role-credentials コマンドを実行すると、以下のような出力が得られます。

% aws sso get-role-credentials --role-name PowerUserAccess --region ap-northeast-1 --account-id ******** --access-token "ey********"
{
    "roleCredentials": {
        "accessKeyId": "********",
        "secretAccessKey": "********",
        "sessionToken": "********",
        "expiration": 1599667863000
    }
}

上記で表示されている情報が Short-term credentials になります。

環境変数の設定とコマンドの実行

前項のコマンドで取得した情報を以下の環境変数に設定します。

% export AWS_ACCESS_KEY_ID=********
% export AWS_SECRET_ACCESS_KEY=********
% export AWS_SESSION_TOKEN=********

環境変数を設定した状態でTerraformを実行してみましょう。AWS APIの呼び出しに成功するはずです。

% terraform apply

本稿の内容がAWS SSOやSTSの仕組みを理解する上で助けになれば幸いです。

CircleCIのmacOSビルドをOSSで利用する

kubelogin というKubernetes向けのツールをOSSで開発しているのですが、Goのビルド条件によって動作が異なる問題 *1 が出てきて、macOSでビルドを実行する必要が出てきました。ちょうど下記の記事でCircleCIがOSS向けにmacOSをサポートしていることを知りました。

medium.com

CircleCIにメールで問い合わせたところ、すぐにOSS向けのmacOSビルドを有効にしてもらえました。先ほどの問題も無事に解決しました。ありがとうございます!

OSS向けのmacOSビルドを有効にするにはCircleCIのFreeプランが適用されている必要があります。私の場合はGitHub Marketplaceのプランになっていたため、GitHub Marketplace上でプランを解約したらCircleCIがFreeプランに戻りました。

CircleCIでmacOS executorを利用するのはとても簡単で、ジョブの設定を docker から macos に変更するだけです。今回はGoのビルドでDocker executorとmacOS executorを併用しているので、以下の点にハマりました。

  • macOS executorでは自分でGoをダウンロードして配置する必要があります。Homebrewも利用できますが、ソースコードからビルドになるので時間がかかるので、ビルド済みパッケージを配置する方が時間が短くなると思います。
  • $GOPATH/pkg をキャッシュしている場合はDockerとmacOSで別々にする必要があります。Docker executorで作成されたtar ballをmacOS executorで展開しようとするとエラーになります。(Go 1.14.4で確認)

$CIRCLE_BRANCH などの環境変数macOS executorでも同じように使えます。

GitHub ActionsもmacOSビルドをサポートしており、こちらは問い合わせしなくても使えるのですが、今回はこれまでのビルドスクリプトをそのまま利用したかったためCircleCIを選択しました。

Certified Kubernetes Administratorを取得した

Certified Kubernetes Administrator(CKA)を取得しました。すでに多くの受験記があるので、他の人が書いていないことをまとめてみます。

きっかけ

いろんな言い訳でCKAの申し込みを先延ばしにしてきたのですが、以下の条件が揃ったので受験するに至りました。

  • 会社で受験費用が支給される(同僚が事務処理をやってくれた)
  • シェアオフィスが営業を再開したので個室を確保できる
  • 勉強時間を捻出できた
  • やる気が出た

事前準備

会社が契約しているシェアオフィスで個室を借りました。自宅からシェアオフィスまでは3.5km程度なので、自転車で行くことにしました。近くに駐輪場があるかどうかや個室が受験要件を満たすかどうかを確認しておきたかったので、前々日にリハーサルを行いました。まあシェアオフィスに着いたら普通に仕事していましたが。

試験は24時間前までに申し込む必要があります。試験の開始時刻はいろいろ選べます。私の場合は前々日に申し込みをしましたが、14時開始しか空いていませんでした。シェアオフィスの個室は、前後1時間の余裕を見て、13時から18時までを借りました。

前日までに以下を勉強しました。

受験記でよく紹介されているUdemyなどのトレーニングコースは特にやりませんでした。まとまった時間を確保できる方はトレーニングコースを利用する方が効率的に学べるかもしれません。私の場合は断片的な時間で少しずつKubernetes The Hard Wayやkubeadmをやっていました。

参考までに、kubeadmによるSingle control-plane clusterやHighly available clusterの構築方法は下記にまとめています。

github.com

当日

当日は14時から開始でした。13時45分までに以下の準備を行いました。

  • 机の上にある備品を一時的に片付ける。
  • 外部ディスプレイを接続して動作を確認する。
  • トイレに行く。
  • ペットボトルのラベルを剥がしておく。
  • 糖分を補給する。長女のラムネを拝借した。

13時45分になったら開始ボタンを押しました。監督員(Live Monitor)とはチャット上で英語でやり取りします。まずは環境要件を確認するのですが、私の場合は30分ぐらいかかりました。気を付けるとよさそうな点を以下に示します。

  • スピーカーはOFFにしておく。ハウリングしてしまう。
  • 個室が暗いのでカメラの映りが悪い。個室や机を明瞭に映すためにMacBookをゆっくり移動させる必要があった。
  • 外部ディスプレイを利用する場合は、メインディスプレイに加えて外部ディスプレイも共有する。
  • マスクは外す必要がある。
  • 監督員からなかなか返信がこない。不安になるが辛抱強く待つ。
  • チャットで長文の英語が送られてくるのでウッとなる。辛抱強く読む。(たぶんテンプレート化されている)

個室の机には備え付けの電灯があり、取り外せないので気になっていたのですが、特に指摘はありませんでした。

14時20分から試験を開始しました。試験時間は3時間なので、17時20分が終了時刻になります。以下、雑感です。

  • 簡単な問題と難しい問題が混ざっている。難しい問題はフラグを立てて後回しにするとよい。
  • 日本語の意図がよく分からない場合は英語の原文を読むとよい。
  • 延々と問題が続くのでトイレ休憩のタイミングがつかめない。私の場合は1時間半ぐらい経過した時点でトイレに行き、個室に戻ってからストレッチと糖分補給を行った。
  • Kubernetesの公式ドキュメントやGitHubリポジトリ以外のサイトにうっかりアクセスしないように注意する必要がある。
  • シンプルなメモ帳ツールが用意されている。コピペが必要な場面で活用するとよい。
  • カメラや画面の共有でCPUに負荷がかかるため、MacBook Airがファン全開で熱くなる。集中力が削がれてしまう。

同じ姿勢を3時間も続けていると体がおかしくなります。終わったらストレッチをしましょう。

事後

36時間以内に結果がメールで送付されます。私の場合は翌々日の0時にメールが来ていました。CNCF Trainingのポータルにアクセスすると成績を参照できます。

私の成績は以下でした。

  • Your Score: 94%
  • Score Needed to Pass: 74%

お約束の証書を貼っておきます。

f:id:int128:20200606125614p:plain

ご参考まで。