まとめ
- python から呼び出す時に
aws cli
のコマンドは絶対パスで入れる。-
/usr/local/bin/aws s3 cp s3://hoge/fuga/foo.txt bar.txt
とか。
-
boto
使わなかったのはバケットの下の方にしかアクセス権限がなくてエラー出た気がしたため。
やりたいこと
$ aws s3 cp s3://hoge/fuga/foo_20160711.txt .
とかで S3 からファイルを持ってきたいわけです。ファイル名は日付とかで毎日変わる。ダウンロードに成功したら取り込みの処理をして、とか何とか。とりあえず python で呼び出すようにしようと思います。
やってみた
fetch.py
import datetime
import os
import stat
import subprocess
import tempfile
def main():
fd, tmp = tempfile.mkstemp()
os.close(fd)
os.chmod(tmp, stat.S_IRWXU | stat.S_IROTH)
filename = 'foo_{}.txt'.format(datetie.datetime.now().strftime('%Y%m%d'))
subprocess.check_call([
'aws',
's3',
'cp',
's3://hoge/fuga/{}'.format(filename),
tmp,
'--quiet',
])
do_something(tmp)
if __name__ == '__main__':
main()
みたいな感じでコードを組む。
コマンドラインから走らせて動作を確認したのでcrontab に放り込みます。
0 1 * * * /usr/local/bin/python /home/vagrant/fetch.py
ダメだった。
ダメな理由
実行履歴を見ると普通にエラーが出ます。aws
コマンドが存在しないと言われている。そういえば awscli
のコンフィグファイルがホームディレクトリにあるので、環境変数でホームディレクトリをキッチリ指定しておかないとコンフィグが読み込めないという話をどっかで聞きました。しかし、そもそも aws
コマンドが無いと言われているわけだから、環境変数の問題に辿り着いていない。PATH
がないのかもしれない。PATH
を足すか、直接コマンドの場所を指定すると解決しそうな気がしますね。
修正
- crontab にホームディレクトリを追加
-
subprocess.check_call()
に環境変数を渡す - aws コマンドを which とかで探して直接参照させる
HOME=/home/vagrant
0 1 * * * /usr/local/bin/python /home/vagrant/fetch.py
fetch.py
import datetime
import os
import stat
import subprocess
import tempfile
def do_something(name):
return
def main():
fd, tmp = tempfile.mkstemp()
os.close(fd)
os.chmod(tmp, stat.S_IRWXU | stat.S_IROTH)
filename = 'foo_{}.txt'.format(datetie.datetime.now().strftime('%Y%m%d'))
subprocess.check_call([
'/usr/local/bin/aws',
's3',
'cp',
's3://hoge/fuga/{}'.format(filename),
tmp,
'--quiet',
], env=os.environ.copy())
do_something(tmp)
if __name__ == '__main__':
main()
だいたい動いた。