ようへいの日々精進XP

よかろうもん

俺は AWS について何も解っていなかった 〜 Step Functions の SendTaskFailure に纏わる各種制限 〜

やりたかった事(ハマった事)

以下のように Golang で Step Functions の Activity Task で実行される処理が失敗した際に出力される結果を TaskFailure として送信したかった。

...
        params := &sfn.SendTaskFailureInput{
            Error: aws.String(message),
            TaskToken: activity.TaskToken,
        }
        _, err := sfnSession.SendTaskFailure(params)
        if err != nil {
            log.Printf(err.Error())
            os.Exit(1)
        }
...

ところが、出力がある一定の長さを超えると以下のようなエラーとなってしまった。

2017/09/04 22:29:32 ValidationException: 1 validation error detected: Value 'エラーメッセージ...エラーメッセージ...エラーメッセージ...エラーメッセージ' at 'error' failed to satisfy constraint: Member must have length less than or equal to 256

どうやら error キーの値は 256 文字以内という制限があるようだ。

解っていなかった事

256 文字以内という制限が有るのは解ったが、どこにそれが定義されているのかとドキュメントを探していたら、素の API ドキュメントに記述があった。

docs.aws.amazon.com

リクエストパラメータをドキュメントより転載。

パラメータ 詳細 Type Length Constraints Required
cause A more detailed explanation of the cause of the failure. String Minimum length of 0. Maximum length of 32768. No
error An arbitrary error code that identifies the cause of the failure. String Minimum length of 0. Maximum length of 256. No
taskToken The token that represents this task. Task tokens are generated by the service when the tasks are assigned to a worker (see GetActivityTask::taskToken). String Minimum length of 1. Maximum length of 1024. Yes

なるほど。

本来は error にはエラーの概要を記載して cause にエラーの原因となるメッセージを書くべきんだんと思うけど、何も考えずに error に突っ込んでしまっていた自分のこれまた知ったかぶりだった。

その他、Step Functions 自体の制限は以下に記載されている。

docs.aws.amazon.com

ということで

  • AWS のサービスを使い始める時にはサービスの制限については把握しておきたい(limits.html を見ておきたい)
  • SDK を操作する際には API ドキュメントを読むと API そのものの制限等も把握出来るので読んだ方が良いと思う

2017 年 09 月 04 日(月)

ジョギング

  • 香椎浜 x 2 周
  • 左足の踵外側周りの痛みが強まったり、引いたりを繰り返している
  • 大学 2 年の時に箱根出走を逃した時の痛みと同じ
  • 明日は走ろうか悩みどころ

iPad mini4

  • Apple 再整備品を購入したら無線 LAN が超絶不安定で泣きそうになったので返品
  • Wi-fi + Cellular 版を購入したブツが届いた
  • セットアップしてみたが、無線 LAN も何のことなく安定していて、やっぱり、新品に越したことは無いなと思った次第

夕飯

  • 豚しゃぶ
  • 鍋に放り込むのは豚バラと豆腐のみ
  • サッと湯にくぐらせた豚バラはカイワレか刻んだ茗荷を巻いて食べるのが最近の川原家のトレンド

2017 年 09 月 03 日(日)

ジョギング

  • 香椎浜 x 2 周
  • 左足かかと付近の痛みを気にしながら
  • 走るには良い季節になってきた

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

アボガドディップ

  • 奥さんが即席で作った
  • こんがり焼いたパンとの相性が抜群でお代わりしまくった

奥さんと散歩

  • 夕方、奥さんと夕焼けを見ながら香椎浜を散歩
  • 落陽そのものより陽が沈んだ後の空が綺麗だった
  • 奥さんの散歩は長続きするか心配

夕飯

  • 冷製パスタ
  • 今日はサーモンをちらしてみた
  • 美味しゅうございました

  • Golang で二つほどツールを書いた
  • なんでもそうだけど、書かなきゃ直ぐに忘れる…辛い

俺は AWS について何も解っていなかった 〜 ec2 describe instances の Filters オプションでタグによる検索をしたい場合 〜

やりたかった事

EC2 タグ Key = foo と Value = true が付与されているインスタンス ID を取得したかった。

+------------+-----+-------+
| INSTANCEID | KEY | VALUE |
+------------+-----+-------+
| i-a7fe057c | foo | true  |
+------------+-----+       +
| i-45ada37f | bar |       |
+------------+-----+-------+
| i-831bccdb | foo | false |
+------------+-----+-------+

これらのインスタンス ID はフィクションです。

解っていなかった事

知ったかぶりをして

ドキュメントを読まずに知ったかぶりをして以下のように書いた。

>>> import boto3
>>> ec2 = boto3.client('ec2', endpoint_url='http://127.0.0.1:5000')
>>>
>>> response = ec2.describe_instances(Filters=[{'Name':'tag-key','Values':['foo']},{'Name':'tag-value','Values':['true']}])
>>> [instance['InstanceId'] for r in response['Reservations'] for instance in r['Instances']]
['i-a7fe057c']

一応、意図した通りのインスタンス ID が取得出来ている。

ところが、ドキュメントを読むと…

Filters で指定出来るオプションにて、タグに関するオプションは以下のように書かれている。

  • tag :key =value - The key/value combination of a tag assigned to the resource. Specify the key of the tag in the filter name and the value of the tag in the filter value. For example, for the tag Purpose=X, specify tag:Purpose for the filter name and X for the filter value.
  • tag-key - The key of a tag assigned to the resource. This filter is independent of the tag-value filter. For example, if you use both the filter “tag-key=Purpose” and the filter “tag-value=X”, you get any resources assigned both the tag key Purpose (regardless of what the tag’s value is), and the tag value X (regardless of what the tag’s key is). If you want to list only resources where Purpose is X, see the tag :key =value filter.
  • tag-value - The value of a tag assigned to the resource. This filter is independent of the tag-key filter.

今回のように EC2 タグからフィルタして一意のインスタンス ID が欲しい場合、tag-keytag-value を併用するのでは無く、tag:foo = true と指定するべきらしい。

こんな感じ

>>> response = ec2.describe_instances(Filters=[{'Name':'tag:foo','Values':['true']}])
>>> [instance['InstanceId'] for r in response['Reservations'] for instance in r['Instances']]
['i-a7fe057c']

先程と同様に意図した通りのインスタンス ID が取得出来ている。

ということで

このメモを書くきっかけ

とあるお仕事で tag-keytag-value を使った状態でフィルタした場合、意図した結果が返って来なくてドキュメントをよく読んでみたら…というのがきっかけ。

検証した結果だと、tag-keytag-value の併用と tag:Name = value で結果が変わらなかった(意図した挙動になった)ので「アレレ」という状態なのだが、ドキュメントに書かれていることを信じて、今後は tag:Name = value を使っていこうと思う。

Python のリスト内包表記

ついつい、以下のように書いてしまうけど…

>>> for r in response['Reservations']:
...     for instance in r['Instances']:
...         instance_ids.append(instance['InstanceId'])

リスト内包表記だと以下のようにシンプルに書けたのが気持ち良かった。

[instance['InstanceId'] for r in response['Reservations'] for instance in r['Instances']]

2017 年 09 月 02 日(土)

ジョギング

  • 香椎浜 x 3 周
  • 左膝の踵に痛み…気になる

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

五条烏丸

  • 奥さん専用チャリ五条烏丸をとうとう手放すことになった
  • 今まで有難う、五条烏丸

iPad mini4 セルラーモデル

  • 出荷されたらしい

2017 年 09 月 01 日(金)

ジョギング

  • 香椎浜 x 2 周
  • 二日間サボったので体は軽かった気がする

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

踏んだり蹴ったり

  • 洗濯物が飛んで行ったりして…結局、洗濯を 3 回することになった
  • iPad mini4 をセットアップしていたら無線 LAN への接続が超絶不安定だったので返品してセルラーモデルを買い直すことにした

2017 年 08 月 31 日(木)

出張二日目

  • 今日がメインの客先訪問
  • えっ!?と思うこともあったけど、幾つか宿題を頂きつつも無事終了
  • お昼は武川さんオススメのうどん屋さん、美味しかったけど東京価格にびっくり

クタクタ

  • 睡眠時間がいつもより短かったり、客先での緊張だったりでクタクタで福岡に帰ってきた

iPad mini4

が届いていた。

2017 年 08 月 30 日(水)

東京出張

8 月も終わり、急な出張で東京に来た。家を出た時にはだいぶん涼しかったけど、東京は蒸し暑くてガクッときた。

打ち合わせに 3 件ほど参加して、夜は色々と資料の整理や検証等。

顔を突き合わせて話しをすることで、色々と理解が深まったような気がする。

三田製麺所

ミスター三田製麺としては、東京にきたら三田製麺を欠かさず食べるようにしたい。

以前に比べるといろいろとメニューが増えたような気がするし 、味はなんとなく落ちたような気がした。

残念。

2017 年 08 月 29 日(火)

ジョギング

  • 香椎浜 x 2 周
  • 右足の大腿から膝の内側辛い

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

宇宙軒

  • 唐揚げと四川麻婆豆腐を食べた
  • お腹一杯

出張

  • 急遽、明日から出張

2017 年 08 月 28 日(月)

ジョギング

  • 香椎浜 x 2 周
  • なんか体が重い
  • 昨日のブルゾンちえみの走りには心を動かされた

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

夕飯

  • 豚しゃぶ
  • なかなか美味しいのでクセになりそう

iPad mini4

  • 再整備品が出ていたのでゲットした
  • 石田さんに貰った Nexus 7 の代替えとして
  • 新品の SIM フリーモデル(Wi-fi + Cellular)もヨサゲだったけど、2 年前の製品に 70000 円はちと高かった