はじめに
AW EC2上に配置したpythonスクリプトをAWS lambdaからSystem Manager(SSM)のRunShellScriptを利用して呼び出した際に、ログインユーザーに関する問題で躓いたので、問題の概要と解決策をまとめます。
参考にさせていただいたサイト
問題点
SSMからRunShellScriptを実行した場合、実行ユーザーはroot
となる。
一方、EC2インスタンスに通常ログインした場合のユーザーはec2-user
となる。
ec2-user
で構築した環境で動くスクリプトをSMS RunShellScriptから呼ぶと、実行時ユーザーがroot
となるため実行環境が異なり、import module error
などが発生する。
SSMからRunShellScriptで実行した場合
$ pwd
/usr/bin
$ whoami
root
$ which python3
/usr/bin/python3
EC2にSSH接続した場合
$ pwd
/home/ec2-user
$ whoami
ec2-user
$ which python3
~/.pyenv/shims/python3
解決策
以下のサイトでは、AWS Systems Managerドキュメントを使用していますが、RunShellScriptでも同じこと。
実行時ユーザーをec2-user
に変更することで実現できます。
$ su - ec2-user -c "実行したいコマンド"
結果
/home/ec2-user
ec2-user
/home/ec2-user/.pyenv/shims/python3
したがって、lambdaからEC2インスタンス上のスクリプトを呼ぶ場合も、このように実行時ユーザーを変更することで可能となりました。
lambdaスクリプト(抜粋)
import boto3
ssm = boto3.client('ssm')
# Run Command実行
response = ssm.send_command(
InstanceIds = [instance_id],
DocumentName = "AWS-RunShellScript",
Parameters = {
"commands": [
"su - ec2-user -c 呼び出したいコマンド",
]
},
)
うまくいかなかった解決策
以下のように、実行時ユーザーを変更した上でスクリプトを呼び出した場合はうまくいきませんでした。
うまくいかなかった例
$ sudo su - ec2-user
$ 呼び出したいコマンド