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=utf8
と PYTHONIOENCODING=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年後に覚えてる自信が無いのでメモ。
Author And Source
この問題について(AWS Systems Manager でAnsible実行するとRunCommandのときだけasciiエラーで死ぬ), 我々は、より多くの情報をここで見つけました https://qiita.com/takyam/items/7c0c4104a9caaa606704著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .