AWS Systems Manager でAnsible実行するとRunCommandのときだけasciiエラーで死ぬ


AWS Systems Manager で複雑な Ansible のプレイブックを実行可能に
https://aws.amazon.com/jp/about-aws/whats-new/2019/09/now-use-aws-systems-manager-to-execute-complex-ansible-playbooks/

しゅごい。個人の環境下に何も用意しなくてもAWSコンソールからポチるだけでAinsibleが実行できる。
超いけてる。

ローカルで完璧に作ったPlaybookを、AmazonLinux2のインスタンスに対して意気揚々と実行。

・・・なんだけど、以下のエラーでドハマリした。Pythonなんて知らん。

{
  "changed": true,
  "cmd": "aws --region=xxx secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:xxx:999:secret:xxx",
  "delta": "0:00:00.000000",
  "end": "2020-01-01 01:00:00.000000", 
  "msg": "non-zero return code",
  "rc": 255, 
  "start": "2020-01-01 01:00:00.000000",
  "stderr": "\n'ascii' codec can't encode characters in position 998-999: ordinal not in range(128)",
  "stderr_lines": [
    "",
    "'ascii' codec can't encode characters in position 998-999: ordinal not in range(128)"
  ],
  "stdout": "",
  "stdout_lines": []
}

playbookは以下みたいな感じ(雰囲気)

- name: read secretmanager secret value
  shell: >
    aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}

単に aws secretsmanager get-secret-value 叩いてるだけ。

このPlaybookをローカルで叩いたり、サーバー上で直接実行しても問題なくスンッって通る。
でもSMSのAWS-ApplyAnsiblePlaybooks経由で実行したときだけ、 'ascii' codec can't encode characters in position 998-999: ordinal not in range(128) っていうエラーになる。

やったこと1: PYTHONIOENCODING=utf8

'ascii' って書いてあるしUTF-8的な何かだとは思ったので https://qiita.com/NPoi/items/b2e6d3568b1b011ed3e7 こちらとか参考にしつつ

PYTHONIOENCODING=utf8 aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}

やってみたけど駄目。 PYTHONIOENCODING=utf8PYTHONIOENCODING=UTF-8 どっちもやったけど駄目。

やったこと2: aws cliのパスを変える

よくよく見てったらaws のパスが /bin/aws で実行されてて、 /usr/bin/aws じゃなかったので、

/usr/bin/aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}

とかやってみたけど駄目。Pythonわかんねぇ・・・。

正解

というわけで数時間ドハマリした結果、以下が正解

- name: read secretmanager secret value
  shell: >
    LANG=C.UTF-8 aws --region=xxx secretsmanager get-secret-value --secret-id {{ secret_manager_arn }}

これで通るようになった。

locale確認するとRun Command経由で実行したときは以下みたいな感じになってる。

LANG=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

POSIXになってるので、とりあえずLANGを C.UTF-8 にしてあげることで解決できた。
3年後に覚えてる自信が無いのでメモ。