AWS CLI で意図していないプロファイルを使ってしまうのを防止するコマンドを書いたメモ。
動機
AWS CLI はプロファイルを --profile
オプションや AWS_DEFAULT_PROFILE
環境変数で指定できるようになっていて AWS アカウントや IAM ユーザーが複数あってもあまり手間なくいろいろな操作を行うことができる反面、使うプロファイルを間違うといとも簡単に悲惨なことが起こり得る。
日常の作業の多くは AWS アカウント向け / 操作対象の環境向けのスクリプトを書くなりして操作の入り口から分けてしまうなどの対策を取ればかなりの事故は減らせるが、ちょっとしたお試しとか突発的な作業をするときはどうしても生の aws
コマンドを触ってしまいがちでどうしても事故が発生しやすくなってしまう。
そこで、AWS CLI を使うときに Github のリポジトリを消すときの Please type in the name of the repository to confirm.
みたいに処理対象を入力させるシステムがあったら事故が減らせるのでは? と思った。
↓こういうやつ。
ラップコマンドの実行イメージ
実行イメージはこんな感じ。
AWS CLI のラップコマンド staging-hoge-aws
を実行すると対象のアプリケーションと対象の環境を聞いてくる。この実行イメージは hoge
が対象のアプリケーションで staging
が環境。
staging-hoge-aws
コマンドはコマンド内にハードコーディングされたアプリケーションおよび環境とユーザーが入力するアプリケーションおよび環境が 一致するときだけ実際の aws コマンドを実行する。この実行イメージは aws s3 ls
が実際のコマンド。
$ staging-hoge-aws s3 ls
Enter target application name: hoge
Enter target environment name: staging
2019-07-27 11:13:21 xxx-bucket
2019-07-27 11:13:21 yyy-bucket
staging-hoge-aws
コマンドはユーザーが入力するアプリケーションか環境が間違っているとメッセージを表示して実際のコマンドは実行しない。
$ staging-hoge-aws s3 ls
Enter target application name: fuga
Invalid application name: fuga
このラップコマンドはアプリケーションと環境の組み合わせ分を作っておく。
たとえば hoge
アプリケーションは本番環境とステージング環境があるなら production-hoge-aws
と staging-hoge-aws
を作っておく。
本番環境用のラップコマンドはアプリケーションと環境の確認に加えて「本番環境をいじろうとしてるけど本当にいいの?」的なことを聞いてきてユーザーが yes
を入力したときだけ実際の aws コマンドを実行する。ユーザーが yes
以外を入力したときは実際の aws コマンドは実行しない。
$ production-hoge-aws s3 ls Enter target application name: hoge Enter target environment name: production You will make changes to the production environment!!!!! Are you sure you want to continue (yes/no)?: yes # ユーザーが yes を入力したときだけ実際の aws コマンドが実行される 2019-07-27 11:13:21 xxx-bucket 2019-07-27 11:13:21 yyy-bucket
ラップコマンドの中身
staging-hoge-aws
はこんな感じになっている。
単純に対象のアプリケーションと環境がハードコーディングしてあってユーザーの入力と一致するときに実際の aws コマンドを実行するだけ。
新しいアプリケーションあるいは環境用のコマンドをつくるときは TARGET_APP
と TARGET_ENV
だけ書き換える感じ。
#!/bin/bash TARGET_APP=hoge TARGET_ENV=staging PROFILE=${TARGET_ENV}-${TARGET_APP} echo -n 'Enter target application name: ' read APP_NAME if [ "${APP_NAME}" != "${TARGET_APP}" ]; then echo "Invalid application name: ${APP_NAME}" exit 1 fi echo -n 'Enter target environment name: ' read ENV_NAME if [ "${ENV_NAME}" != "${TARGET_ENV}" ]; then echo "Invalid environment name: ${ENV_NAME}" exit 1 fi if [ "${ENV_NAME}" == "production" ]; then echo "You will make changes to the production environment!!!!!" echo -n 'Are you sure you want to continue (yes/no)?: ' read CONFIRM if [ "${CONFIRM}" != "yes" ]; then exit 1 fi fi echo '' aws --profile $PROFILE "$@"
プロファイル
config ファイル
config
ファイルはこんな感じにしておく。
[profile staging-hoge] output = json region = ap-northeast-1 [profile production-hoge] output = json region = ap-northeast-1
credentials ファイル
credentials
ファイルはこんな感じにしておく。
[staging-hoge] aws_access_key_id = <ステージング環境のアクセスキー> aws_secret_access_key = <ステージング環境のシークレットキー> [production-hoge] aws_access_key_id = <本番環境のアクセスキー> aws_secret_access_key = <本番環境のシークレットキー>
参考にしたサイト
本番環境とステージング環境を取り違える事故を減らしたくて Twitter で聞いてみたら本職のインフラエンジニアから DevOps やってる人まで珠玉の知見を教えてもらいまくったのを参考にした。感謝しかない……っ!!