LoginSignup
6
8

More than 5 years have passed since last update.

crontab に登録した Python 2.7 スクリプトから awscli を呼び出そうとして地味にハマっていたこと

Posted at

まとめ

  • 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()

だいたい動いた。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8