AWS+MFAのCLIツールを作ってみる
・MFA+元々のアカウント -> GetSessionToken
・MFA+Switch先に移動 -> AssumeRole
を使って、一時クレデンシャルを取得
.aws/configに記載できるパラメータの一覧
.aws/configとcredentialsのformat
configは
[profile xxxx]
だけど
credentialは
[xxxx]
だけでよいので注意
Configを扱うGoのSDK(v2)
v1->v2のMigrationページの例がわかりやすい
AssumeRole
STS package
config、credentialsの編集に使えそう
To create a new key:
err := cfg.Section("").NewKey("name", "value")
読み込みだけaws-sdk-go-v2
、書き込みはini
にしてしまうと煩雑化しそうなので、
config、credentialsの読み込み〜更新は「ini」に任す読み込んだ値をaws-sdk-go-v2に渡して、セッション取得
の流れにしたい
↑環境変数によるcredentialsの上書きの挙動を考慮すると、読み込みを独自で実装するとユーザーを混乱させてしまいそう
Environment Variables
By default, the SDK detects AWS credentials set in your environment and uses them to sign requests to > > AWS. That way you don’t need to manage credentials in your applications.The SDK looks for credentials in the following environment variables:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN (optional)
config、credentialsの読み込み:aws-sdk-go-v2
config、credentialsファイルの更新のみ:ini
がよさそう
aws-sdk-go-v2だと、configに記載したsource_profileの値が読み取りづらいなどなど、問題が山積していたので、
- 環境変数の考慮必要な場合のconfig、credentialsの読み込み:
aws-sdk-go-v2
- 環境変数の考慮不要 or aws-sdk-go-v2だと読めないプロパティの場合のconfig、credentialsの読み込み:
ini
- config、credentialsファイルの更新:
ini
でいく
goでcliを作るテンプレート
Apache 2
cobraのわかりやすい逆引き
AWS CLIの環境変数一覧
興味深いのが、sts時のEndpoint選択の挙動
aws cliのversionによってGlobalかRegionalのどちらにいくかのデフォルト値が違うらしい
- v1: デフォルトでglobal endpointへ行く
- v2: デフォルトで.configに指定されたregionのendpointへ向く
Cobra使うんだったら、Viper使おうと思ったが、ini形式は明示的に非対応だった...
CobraをTeastableにする
途中に出てくる「コマンド出力結果のテスト」はやれるようにしたほうがよさそう
k8sでも同様の手法をとっているらしい
kubernetesのapplyコマンド↓
出力結果を標準とERROR出力に分けるのは、cobra v1.1.3だとライブラリに取り込まれ済みの模様