🌧️

CloudFormationのParameterの入力値に正規表現を使用した際に感じたマネコンの2つの不親切(2022/10時点)。

2022/10/18に公開

概要

CloudFormtionにおいて、スタック作成者に環境毎に入力や選択を求めたい値を設定するParameterという機能があります。

以下のように入力欄やドロップダウンリストを用意し表示する事が可能です。

入力欄をどのようなタイプに出来るかについて纏めた記事がありました。
https://dev.classmethod.jp/articles/list-of-cloudformation-parameters-by-data-type/

記事内でも値に対して「エラーが発生するケース」がある事について触れていますが、

実際にはその原因に応じて挙動は変わります。

観測出来ている範囲で枝葉にはなりますがいくつかの例にだけ触れてみます。

構文や項目名のミスなどテンプレート自体が成立していない場合

この場合にはファイル選択後、”次へ”ボタンを押下した際、

”スタックの作成”ページ上部に赤帯でエラー表示が出現し解消したファイルを選択し直すまで先に進めない状況となります。

(※画像は本来”Descripton”であるべき所を”Descriptons”としてみた場合に出たエラー表示)

何かしらの問題があり、いずれかのリソースの作成に失敗する場合。

この場合、スタックの作成自体は開始されますが、全リソースの作成が完了する前に該当するリソースがFailedになりロールバックが開始されます。

インスタンスのUserdataなどのコマンドが失敗する場合。

例えばコマンドにTypoがあったり、インスタンスにコマンドの実行権限が不足していたりという場合です。

この場合はスタック作成は最後まで正常に完了してしまいます。
テンプレートでUserdata部分を記述しているからといってロールバックはされません。

テンプレート作成者が指定したルール等を逸脱している場合。

最後に触れるこのケースが、
まさに今回の主題である”パラメーターの入力に正規表現を利用”し、そのルール外の入力があった場合となります。

こちらは後で画像付きで挙動を確認したいと思います。

まずは正規表現について調べてみます。

公式ドキュメントにはこのように書かれています。

AWS CloudFormation テンプレート内では、正規表現 (regex と呼ばれることもあります) をさまざまな場所で使用できます (たとえば、テンプレートパラメータの作成時の AllowedPattern プロパティ)。
CloudFormation の正規表現は、Java の正規表現の構文に準拠しています。この構文と構造の詳細については、Java のドキュメント (java.util.regex.Pattern) を参照してください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-regexes.html

「Java の正規表現の構文に準拠」とのことです。

早速やってみたいと思います。

正規表現など制限を設定する前のパラメータ

2つ用意した項目共にTypeはString(文字列)としました。
※上はIPを求めるもの、下は特に用途を明示していません

Parameters: 
  MyIP:
    Description:  Please enter your global IP(xxx.xxx.xxx.xxx/32).
    Type: String
  MyString :
    Description: Please enter any string of between 8 and 10 characters.
    Type : String

Description(説明) にそれぞれ注意書きする事は可能ですが、IPを入力して欲しい欄に全然関係ないテキストを入力して先に進める事が可能になってしまいます。

この場合は、IPとして使いたかった文字列が実はIPでなかった事で、
例えば「セキュリティグループでこの値を利用するはずだったのに全然IPじゃない文字列だったので上手くいかない」といった事がおこり、ロールバックが開始されてしまいます。

これはこれで未然に想定外のリソースが作成されずに終われば事故にはならないかもしれませんが、
スタック作成者にとっては説明文の意図が掴みきれないと毎回時間をロスする事になります。

理想とは言い難く、Validationを行いたいと思う開発者が大半かと思います。

各パラメータに制限を追加してみます。

試しに先ほどの公式ドキュメントでも例として触れられていた”AllowedPattern”と合わせ、字面でわかり易いMin/MaxLengthをそれぞれ設定し挙動を見てみたいと思います。

Parameters: 
  MyIP:
    Description:  Please enter your global IP(xxx.xxx.xxx.xxx/32).
    Type: String
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
  MyString :
    Description: Please enter any string of between 8 and 10 characters.
    Type : String
    MaxLength: 10
    MinLength: 8

コンソールで画面を確認してみます。

設定後も見た目の表示は変わりません。

実際に追加した条件に違反する値を入力して進んでみます。

IPの入力を求めた欄に”こんにちわ”
8〜10文字で入力して欲しい欄に超過する文字数で入力をしています。

”次へ”ボタンを押下します。

こうした入力でも次のページである「スタックオプションの設定」に進む事が出来ました。

もう一度”次へ”ボタンを押下します。

最後の確認ページである「レビュー」に進む事が出来ました。

「このまま作成が開始されるのかな。。」と思いながら”スタックの作成”ボタンを押下します。

そうすると

またレビュー最上部に戻されました。
がテンプレート作成者でない作業者がスタックの作成を担当していた場合、何が起こっているかわかりません。

エラー文の表示に気付き難いマネコンのちょっとした不親切

スタック作成者にしてみると「エラーの帯は表示されていないのになぜかボタンが押せない」という認識になります。

が、実は自分で更に上にスクロールするとエラーはちゃんと表示されているんです。

この記事の作成(※2022年10月)時点の挙動の為、いずれ解消される可能性はありますがちょっと不親切です。

作成を拒んだ後もエラー赤帯の高さも込みの地点まで移動するようにしてくれたらなぁ。。

エラーはひとつずつしか表示されない。

今回のテストでは2つミスをしていますが、先ほどの画像にある通り片方しか表示されませんでした。

まずは正規表現が正常に検閲をしてくれている事は確認出来ました。
(本件と関係ないですがこれは嬉しい。)

「スタックの詳細を指定」ページまで戻って指摘された部分の入力を直します。

お察しの通り”スタックの作成”ボタンを押すと次のエラーが現れます。

一回で全部表示してくれないので、何度も戻って入力し直しが必要になる。

こっちはモロに無意味な時間のロスなので結構不親切です。

と、タイトルに”不親切”といれてしまったばかりにちょっと明るい雰囲気の記事にならずに終わってしまいましたが、とっても細かい部分です。(もしかしたら誰も気にしていないかもしれません)

最後に

マネコンは日々進化しているのでこのあたりの表示もすぐに改善されるかもしれません。

ただ「誰かが動いてくれるはず」ではなくサポート(AWS中の人)に意見をどんどんあげましょう。
というのはAWSユーザー全員に広まるべき考えだと思ったので、ここで終わらず初めて自分の意思でフィードバックをポストしてみました。

ここから

このように。
(typo×2してる)

「満足されましたか?」→「◉ はい」 なのはマネコンもAWSも素晴らしいサービスだと思っているからです。

記事はこんな感じですが、私もいつも高い意識でAWSを支えていらっしゃる中の皆様を尊敬している一人です。

以上、お読みいただき有難うございました!

Discussion