全力で怠けたい

怠けるために全力を尽くしたいブログ。

AWS CLI で意図していないプロファイルを使ってしまうのを防止するコマンドを書いたメモ。

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. みたいに処理対象を入力させるシステムがあったら事故が減らせるのでは? と思った。

↓こういうやつ。

f:id:ebc_2in2crc:20190728165659p:plain:w400
Githubリポジトリを消すときのアレ

ラップコマンドの実行イメージ

実行イメージはこんな感じ。

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-awsstaging-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_APPTARGET_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 = <本番環境のシークレットキー>

参考にしたサイト

togetter.com

本番環境とステージング環境を取り違える事故を減らしたくて Twitter で聞いてみたら本職のインフラエンジニアから DevOps やってる人まで珠玉の知見を教えてもらいまくったのを参考にした。感謝しかない……っ!!