Linux環境からAW CLIでS3にファイル転送する方法のメモ。
割とよく使うコマンドだけど、AWS CLI自体を一から入れたり、クレデンシャルファイル置いたりって最初の一回やったら以降はやらないなーと思ったのでメモ。
S3転送の前に、まずはAWS CLIをインストールしてコマンドラインでAWSコマンドを実行可能にするところからですね。
AWS CLIの実行環境用意
1. Pythonインストール
AWS CLIはpip(Pythonのパッケージ管理システム)を使用してインストールするので、まずはPythonを使用可能にします。
大抵のサーバでは標準で入っているので以下のコマンドを打ってバージョンが表示されればスキップして大丈夫(インストールされていればバージョンは2系でも3系でも可)ですが、入っていない場合はまずはPython自体をインストールします。
1 2 |
$ python --version Python 2.7.12 |
入っていない場合は、方法はなんでも良いのでインストールします。
1 2 3 4 5 |
## yum でpython2.7を入れる例 $ yum -y install python27 $ python --version Python 2.7.12 |
2. pipインストール
Pyhtonが入ったらパッケージ管理システムのpipをインストールします。
今はget-pipを落として実行すれば一発で入れられるようになったみたいですね。
こちらもPythonのバージョンが2.7.9以降 or 3.4以降の場合はデフォルトで入っているので、既に入っている場合はスキップ可です。
1 2 3 4 5 |
$ curl -O https://bootstrap.pypa.io/get-pip.py $ sudo python get-pip.py $ pip --version pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7) |
pipがインストールできたのを確認したら、get-pip.pyのファイルは消してしまいましょう。
3. AWS CLIインストール
pipが入ったら今度は、AWS CLIをインストールします。
1 2 3 4 |
$ pip install awscli $ aws --version aws-cli/1.11.83 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.46 |
4. S3へのフルアクセスロールをアタッチしたAWSのIAMユーザを用意
今回はS3にファイルを転送するので、フルアクセスロールを持ったIAMユーザをAWS上で作成し、同ユーザのaccess keyとsecret keyを用意する必要があります。
丁度前回の記事でS3へのアクセスロールのみをアタッチしたIAMユーザを作っていたので、今回はそれを流用しました。
5. credentialsとconfigファイル作成
上記で作成したIAMユーザのcredentialsとaws-cliコマンド実行時のデフォルト設定configファイルを作成します。
aws-cliが正しくインストールできていれば、コンソール上でaws configureと打った後に聞かれる項目を一つずつ答えていけば自動で作成されます。
デフォルト設定は、リージョンを東京、出力フォーマットをjsonにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ aws configure AWS Access Key ID [None]: 上記で作成したIAMユーザのアクセスキー入力 AWS Secret Access Key [None]: 上記で作成したIAMユーザのシークレットキー入力 Default region name [None]: ap-northeast-1 Default output format [None]: json ## 完了後.awsディレクトリと、その中のconfigファイルとcredentialsファイルができたのを確認 $ cd .aws/ $ ls -al . .. config credentials $ cat credentials [default] aws_access_key_id = ******************** aws_secret_access_key = ******************************** $ cat config [default] output = json region = ap-northeast-1 |
これでaws-cliコマンドが使用可能になりました。
今回登録したIAMユーザはS3へのアクセスロールのみがアタッチされたユーザなので、S3コマンドが使用可能になっているか確認しておきます。
1 |
$ aws s3 ls |
アクセス可能なバケットの一覧が表示されればOKです。
サーバ上のファイルをS3に転送
準備が整ったのでサーバ上のファイルをS3にアップロードします。
今回は、サーバ上に「test.txt」というテストファイルを作成し、作成したファイルをs3の「test-hogehoge」バケットに「uploaded-text.txt」というファイル名でアップロードしてみます。
1 2 3 4 5 |
$ touch test.txt $ ls test.txt $ aws s3 cp test.txt s3://test-hogehoge/uploaded-text.txt |
コマンド先頭にawsを入れ、半角スペースの後に使用するサービス名(今回で言えばs3)を入れれば後は普通のLinuxコマンドと同じですね。
1 2 |
$ aws s3 ls s3://test-hogehoge/ uploaded-text.txt |
アップロードしたファイルの確認もlsコマンドで。
AWSコンソールからS3に入り上記でアップロードしたファイルが表示されることを確認。
おまけ:ダウンロード、移動、ディレクトリ同期
Linuxコマンドがそのまま使えるんだからアップロード以外にもダウンロードやファイル移動、ディレクトリ同期もできるよね!という事で、ざっとコマンド例だけ。
【ダウンロード】
1 2 3 4 |
$ aws s3 cp s3://test-hogehoge/uploaded-text.txt download-text.txt $ ls download-text.txt |
ダウンロードはアップロードの時と順番を変えるだけ。
S3上の「uploaded-text.txt」を「download-text.txt」というファイル名でダウンロードしています。
【ファイル移動】
1 2 3 4 5 6 7 8 9 10 11 12 |
## サーバ上 → s3へのファイル移動 $ touch move-test.txt $ aws s3 mv move-test.txt s3://test-hogehoge/move-test-s3-text.txt $ aws s3 ls s3://test-hogehoge/ move-test-s3-text.txt ## s3 → s3へのファイル移動 $ aws s3 mv s3://test-hogehoge/move-test-s3-text.txt s3://test-hogehoge/move-test-s3-text-after.txt $ aws s3 ls s3://test-hogehoge/ move-test-s3-text-after.txt |
cpをmvに変えただけですね。
Linuxコマンドそのまんまです。
【ディレクトリ同期】
s3の「test-hogehoge」バケットに「test」という空ディレクトリをあらかじめ作成しておき、サーバ上で同期させたいディレクトリを作った上で同期させてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
## サーバ上に同期させたいディレクトリ作成 $ mkdir test-server $ cd test-server/ $ touch test1.txt $ touch test2.txt $ ls test1.txt test2.txt ## サーバ上のtest-serverディレクトリをs3のtestディレクトリに同期 $ aws s3 sync ../test-server s3://test-hogehoge/test upload: test-server/test1.txt to s3://test-hogehoge/test/test1.txt upload: test-server/test2.txt to s3://test-hogehoge/test/test2.txt $ aws s3 ls s3://test-hogehoge/test/ test1.txt test2.txt |
ディレクトリ同期はsyncコマンドで行います。
Linuxだとキャッシュ内容をディスクに書き出すコマンドだったので少し意味が変わりますね。
同期は色々事故が起こりそうなので、実行前にドライランオプションをつけて一度実行し、結果を確認してから行う癖をつけておきたいです。
(ドライランは、実行結果をログ出力するだけで実際には処理を行いません)
1 2 3 4 |
## 同期実行結果の確認 $ aws s3 sync ../test-server s3://test-hogehoge/test --dryrun (dryrun) upload: test-server/test1.txt to s3://test-hogehoge/test/test1.txt (dryrun) upload: test-server/test2.txt to s3://test-hogehoge/test/test2.txt |
ディレクトリ同期は、ドライラン以外にも同期対象ファイル(–include)や同期除外対象ファイル(–exclude)の指定など色々オプションがつけられるようです。
公式ドキュメントに詳しく書かれているので興味がある方は見てみてください。
サーバ上ファイルとS3ファイルのやりとりができるようになったところで今回はおしまい!