public memo

エンジニア向け小ネタ書き溜め用。公開日記だけど親切な文章とは程遠いかもしれない。

Linux環境からAWS CLIでS3にファイル転送

2017-08-01 by MasakiMisawa
Tweet
このエントリーをはてなブックマークに追加
Pocket
LINEで送る

Linux環境からAW CLIでS3にファイル転送する方法のメモ。
割とよく使うコマンドだけど、AWS CLI自体を一から入れたり、クレデンシャルファイル置いたりって最初の一回やったら以降はやらないなーと思ったのでメモ。

S3転送の前に、まずはAWS CLIをインストールしてコマンドラインでAWSコマンドを実行可能にするところからですね。

AWS CLIの実行環境用意

1. Pythonインストール

AWS CLIはpip(Pythonのパッケージ管理システム)を使用してインストールするので、まずはPythonを使用可能にします。
大抵のサーバでは標準で入っているので以下のコマンドを打ってバージョンが表示されればスキップして大丈夫(インストールされていればバージョンは2系でも3系でも可)ですが、入っていない場合はまずはPython自体をインストールします。

Python version
ZSH
1
2
$ python --version
Python 2.7.12

入っていない場合は、方法はなんでも良いのでインストールします。

Python install
ZSH
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以降の場合はデフォルトで入っているので、既に入っている場合はスキップ可です。

pip install
ZSH
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をインストールします。

pip install
ZSH
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にしました。

create aws credentials
ZSH
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コマンドが使用可能になっているか確認しておきます。

use s3 command
ZSH
1
$ aws s3 ls

アクセス可能なバケットの一覧が表示されればOKです。

サーバ上のファイルをS3に転送

準備が整ったのでサーバ上のファイルをS3にアップロードします。
今回は、サーバ上に「test.txt」というテストファイルを作成し、作成したファイルをs3の「test-hogehoge」バケットに「uploaded-text.txt」というファイル名でアップロードしてみます。

create aws credentials
ZSH
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コマンドと同じですね。

aws s3 ls
ZSH
1
2
$ aws s3 ls s3://test-hogehoge/
uploaded-text.txt

アップロードしたファイルの確認もlsコマンドで。

aws s3 ls

AWSコンソールからS3に入り上記でアップロードしたファイルが表示されることを確認。

おまけ:ダウンロード、移動、ディレクトリ同期

Linuxコマンドがそのまま使えるんだからアップロード以外にもダウンロードやファイル移動、ディレクトリ同期もできるよね!という事で、ざっとコマンド例だけ。

【ダウンロード】

aws s3 download
ZSH
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」というファイル名でダウンロードしています。

【ファイル移動】

aws s3 mv
ZSH
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」という空ディレクトリをあらかじめ作成しておき、サーバ上で同期させたいディレクトリを作った上で同期させてみます。

aws s3 sync
ZSH
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だとキャッシュ内容をディスクに書き出すコマンドだったので少し意味が変わりますね。

同期は色々事故が起こりそうなので、実行前にドライランオプションをつけて一度実行し、結果を確認してから行う癖をつけておきたいです。
(ドライランは、実行結果をログ出力するだけで実際には処理を行いません)

aws s3 sync dryrun
ZSH
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ファイルのやりとりができるようになったところで今回はおしまい!

Tweet
このエントリーをはてなブックマークに追加
Pocket
LINEで送る

カテゴリー: S3 タグ: AWS CLI, S3

profile

profile_img Web系のソフトウェアエンジニアです。
野球観戦(横浜DeNAベイスターズ)、格闘ゲーム、カメラ、ランニング、愛犬、インテリア、美味しいものの食べ歩き、などなどが好き。

  • twitter MasakiMisawa
  • facebook MisawaMasaki
  • github MasakiMisawa
  • instagram masakimisawa
  • follow us in feedly

search

recent entry

  • M1 MacでAppleシリコンとIntelプロセッサのバイナリ管理を分離して共存させる
  • M1 MacでtfenvからTerraform1.0.2未満のダウンロードに失敗する問題を無理矢理解決する
  • GitHub ActionsからAWS利用時に永続的クレデンシャル情報を渡さないようにする
  • TerraformでAuroraのエンジンバージョンアップグレードをする時は、対象リソースをクラスターだけに絞る
  • CloudWatch Logsに出力されたエラーログ本文のSlackへの転送

category

  • AWS (17)
    • ACM (1)
    • AWS CLI (1)
    • Chatbot (2)
    • CloudWatchAlarm (1)
    • CloudWatchLogs (1)
    • CodeBuild (3)
    • DynamoDB (1)
    • IAM (1)
    • Kinesis (2)
    • Lambda (5)
    • OpenId Connect (1)
    • RDS (1)
    • S3 (2)
    • SNS (2)
    • SSM (2)
    • STS (1)
  • CI (2)
  • GCP (1)
    • PageSpeedInsights (1)
  • Git (3)
    • GitHub (2)
      • GitHub Actions (1)
  • M1 Mac (2)
  • Python (2)
  • Redis (1)
  • selenium (1)
  • Slack (3)
  • Terraform (3)
  • その他 (1)

archive

  • 2022年2月 (3)
  • 2021年1月 (1)
  • 2020年12月 (1)
  • 2020年11月 (1)
  • 2020年9月 (2)
  • 2020年8月 (1)
  • 2020年7月 (1)
  • 2020年6月 (1)
  • 2020年5月 (2)
  • 2020年4月 (1)
  • 2020年3月 (1)
  • 2020年1月 (1)
  • 2019年1月 (1)
  • 2017年12月 (1)
  • 2017年9月 (1)
  • 2017年8月 (1)
  • 2017年7月 (1)
  • 2017年2月 (1)
  • 2016年10月 (1)

tag cloud

ACM Aurora AWS AWS CLI Billing CI CloudWatchAlarm CloudWatch Logs CodeBuild Code Format Docker DynamoDB EC2 env find firehose Git GitHub GitHub Actions Homebrew husky IAM Role Java kinesis KinesisFirehose Lambda lint-staged M1 Mac Node.js OpenId Connect PHP Python RDS Redis RI S3 Selenium Slack SNS SSM Terraform tfenv セッションマネジャー リモートワーク 生産性

Copyright © 2025 public memo.