Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

まとめ

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

だいたい動いた。

debari
博士(情報科学)。 ZETA株式会社のエンジニア。検索エンジンを作ったり、レコメンドエンジンを作ったり。
zeta
サイト内検索/レコメンドを主軸としたECソリューションを開発・提供。ディープラーニング技術のEC展開にも注力しています。
https://zeta.jpn.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away