ジョギング
- 香椎浜 x 2 周
- 左足踵付近、右足付け根から太腿に違和感が続く
日課
- (腕立て x 30 + 腹筋 x 30) x 3
マッサージ
マラソンのマネージャーである奥さんにマッサージをしてもらって足に溜まっていた疲労はだいぶん癒えた気がする。ありがとう。
で日記を書いているが、やっぱりハードウェアのキーボードがしっくりくるけど、最適なキーボードは Apple Keyboard なんだろうなあと思ったり。
なんだかんだでバタバタで家事まででが回らず…奥さんには申し訳ないと思いつつ甘えてしまった。
Node.js をちゃんと勉強しなきゃなと思った次第。勉強しなきゃと思う言語が脳のキャパシティを超えてる。とにかく沢山書くしかないのかな。
以下のように 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 ドキュメントに記述があった。
リクエストパラメータをドキュメントより転載。
パラメータ | 詳細 | 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 自体の制限は以下に記載されている。
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 で指定出来るオプションにて、タグに関するオプションは以下のように書かれている。
今回のように EC2 タグからフィルタして一意のインスタンス ID が欲しい場合、tag-key
と tag-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-key
と tag-value
を使った状態でフィルタした場合、意図した結果が返って来なくてドキュメントをよく読んでみたら…というのがきっかけ。
検証した結果だと、tag-key
と tag-value
の併用と tag:Name = value
で結果が変わらなかった(意図した挙動になった)ので「アレレ」という状態なのだが、ドキュメントに書かれていることを信じて、今後は tag:Name = value
を使っていこうと思う。
ついつい、以下のように書いてしまうけど…
>>> 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']]