この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
アノテーションの荒川です。7 月から AWS 構築業務を担当しています。
AWS CLI を使ったオペレーションを Bash のシェルスクリプトにする機会があり、コマンドのリターンコードによって処理を分岐させようと考えました。
リターンコードを使った分岐処理は、AWS ドキュメントを参考に作りました。
いざ実行してみるとreadonly
やlocal -r
を付けた変数に格納したときだけ、期待する動作となりませんでした。
問題のあるコード
以下のようなコードで、問題が発生しました。
readonly PARAM_VALUE=`aws ssm get-parameter \
--region ${REGION} \
--output text \
--name ${PARAM_KEY} \
--query "Parameter.Value" \
2> /dev/null`
if [ $? -eq 0 ]; then
# パラメータの取得に成功
echo "Parameter Key: ${PARAM_KEY}"
echo "Parameter Value: ${PARAM_VALUE}"
else
# パラメータの取得に失敗
echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}."
fi
この場合、リターンコードの$?
は常に 0(成功)となり、パラメータの取得が成功した処理へと進みます。readonly
を消せば期待通りに動作しますが、SSM パラメータストアから取得した値は変更できなくしたいです。
期待する動作となるコード
以下のようなコードに修正することで、問題が回避できます。
readonly PARAM_VALUE=`aws ssm get-parameter \
--region ${REGION} \
--output text \
--name ${PARAM_KEY} \
--query "Parameter.Value" \
2> /dev/null` return_code=$?
if [ ${return_code} -eq 0 ]; then
echo "Parameter Key: ${PARAM_KEY}"
echo "Parameter Value: ${PARAM_VALUE}"
# 分岐条件を追加してリターンコードに応じた処理が可能
else
echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}."
fi
PARAM_VALUE
だけではなくreturn_code
も readonly(再代入不可)となりますが、期待したリターンコードが得られます。
readonly
コマンドをリターンコード取得後に実行することでも、期待する動作となります。
PARAM_VALUE=`aws ssm get-parameter \
--region ${REGION} \
--output text \
--name ${PARAM_KEY} \
--query "Parameter.Value" \
2> /dev/null`
return_code=$?
readonly PARAM_VALUE
if [ ${return_code} -eq 0 ]; then
echo "Parameter Key: ${PARAM_KEY}"
echo "Parameter Value: ${PARAM_VALUE}"
# 分岐条件を追加してリターンコードに応じた処理が可能
else
echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}."
fi
おわりに
問題の原因は Bash のreadonly
を他言語のアクセス修飾子のような感覚で使っていたためでした。
readonly
やlocal -r
はコマンドですので、実行に成功すればリターンコード 0(成功)が返され、直前に実行された AWS CLI のリターンコードが上書きされます。
問題の一時しのぎとして、パラメータストアから取得した文字列長が 0 かチェックする方法もありますが、リターンコードに応じた分岐処理が行えなくなるため、オススメできません。
同じような事象に遭遇した方の参考になれば幸いです。
参考
- AWS CLI からのリターンコードを理解する - AWS Command Line Interface
- 'readonly' exit status in bash - Stack Overflow
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。