AWS CLIを使ってCentOS7からS3へファイル転送する方法
-
カテゴリ:
- サーバ
-
タグ:
- #AWS
現在(2019/4/13)AWS Innovate 2019が開催中ですね!自分の登録だけはしました。w
その流れでは全然関係ないですが、たまたま仕事で外部のAWSのS3にデータ連携する機会があったので、その時調べた内容をメモしておきます。
OSのバージョンは「CentOS Linux release 7.6.1810 (Core)」になります。
今回説明するデータ連携には事前準備として3つの手順が必要です。
- 連携先(AWS S3)の接続情報を共有してもらう
- 連携元サーバ(自分のサーバ)にAWS CLIを設定しておく
- 接続情報をもとにprofileを作成する
データ連携する方法はprofileを作成する以外にいくつかありますが、個人的にはprofileを作成したほうが、接続先ごとに切り替えることができるので便利だと思います。
まずは接続情報の共有について説明していきます。接続情報の共有
自分のサーバ(連携元)からAWSのS3(連携先)にファイルを転送するには、S3から発行される接続情報を連携元のサーバに共有し設定しておく必要があります。
これは後々の手順のprofile作成時に必要になります。
連携元より以下の情報を連携先に共有しておいてください。
- 接続元グローバルIP一覧
- 利用環境(本番のみ/検証のみ/本番・検証)
- 利用サービス名
連携先から連携元に以下のアクセス情報を共有します。
- S3 アドレス
- アクセスキー/シークレットキー
AWS CLIの設定
AWS CLIは正式名称「AWSコマンドラインインターフェース」といい、その名の通り自分のサーバからコマンドを利用して、AWSを操作できるアプリです。S3へのファイル転送もAWS CLIを使って可能になります。
接続元サーバにAWS CLIのインストールを行います。
Windowsへのインストールの場合
下記サイトにアクセスし、 インストーラをダウンロードし、実行します。
Mac、Linuxへのインストールの場合
インストールにはPythonが必要になります。さらにバージョンが2.6.5以降ものでなくてはなりません。
pythonをまずインストールしてください。(方法は割愛、ここに載ってるよ)。
バージョンを確認します。
$ python --version
実際にawscliを使うには「pip」を使う必要があります。ただしこのpip、 Python3.4以上(Python2の場合は2.7.9以上)であれば、プレインストールされています。
awscliをインストールします。
$ sudo pip install awscli
以上です。
補足:pipのインストール
pipがあるか確認します。
$ python -m pip -V
または
$ pip -V
インストールされていなければpipをインストールします。
$ sudo curl -kL https://bootstrap.pypa.io/get-pip.py | python
ここで注意点ですが、以下のエラーが出た場合があります。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1622k 100 1622k 0 0 11.5M 0 --:--:-- --:--:-- --:--:-- 11.6M
Collecting pip
Using cached https://files.pythonhosted.org/packages/c2/d7/90f34*******************************************************/pip-18.1-py2.py3-none-any.whl
Collecting wheel
Using cached https://files.pythonhosted.org/packages/ff/47/1dfa4*******************************************************/wheel-0.32.3-py2.py3-none-any.whl
Installing collected packages: pip, wheel
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/lib/python2.7/site-packages/pip-18.1.dist-info'
Consider using the `--user` option or check the permissions.
どうやらsudoを使っていたのでファイルを落としてきたところがroot権限にも関わらず、pythonは自分のユーザでやっていたのが悪かったっぽいです、
面倒なのでインストールと実行を別々に動かすようにします。
$ cd ~/
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
profileの作成
CLIのコンフィグを行います。
profileを追加することで、その設定をprofileから読みだすことができます。
$aws configure --profile samplePro
AWS Access Key ID [None]: xxxxxxxxxx <-AWSの管理者から共有してもらった接続情報
AWS Secret Access Key [None]: xxxxxxxxxx <-AWSの管理者から共有してもらった接続情報
Default region name [None]: ap-northeast-1
Default output format [None]: json
説明:
プロファイルへ”samplePro”と設定します※環境に合わせて任意で設定してください
連携先から発行しているAccess Key,Secret Access Key を入力してください
以下固定値となります:ap-northeast-1 :json
profileが正常に作成されたか確認します。
$ aws configure list
$ aws configure list --profile samplePro
Name Value Type Location
---- ----- ---- --------
profile samplePro manual --profile
access_key ****************---- shared-credentials-file
secret_key ****************---- shared-credentials-file
region ap-northeast-1 config-file ~/.aws/config
ファイルの転送方法
コピーコマンドを実行して、AWSのS3へファイルを転送してみます。
以下のコマンドでアップロードを行ってください
$ aws s3 cp [File Name] [S3 アドレス] --profile [Profile Name] --sse
※S3のアドレスは「s3://[bucket]/[prefix]/[object]」となります。prefix とはディレクトリ、objectはフォルダみたいなものと考えてください。
最後にコマンドを実行した際の成功例を失敗例を紹介します。
以下のメッセージが返ってくるので、自分のプログラムに組み込む場合は、エラーハンドリングなどに利用できます。
S3コマンド例:
$ sudo aws s3 cp [コピー元のファイルパス] s3://[S3のURL] --profile [Profile Name] --sse
$ sudo aws s3 cp /var/tmp/sample.csv s3://testsite/tmp/sample.csv --profile smaplePro --sse
コマンド成功例:
$ aws s3 cp /var/tmp/sample.csv s3://testsite/tmp/sample.csv --profile smaplePro --sse
upload: ../../../../../var/tmp/sample.csv to s3://testsite/tmp/sample.csv
コマンド失敗例:
$ aws s3 cp /var/tmp/sample.csv s3://testsite/tmp/sample.csv --profile smaplePro --sse
upload failed: ../../../../../var/tmp/sample.csv to s3://testsite/tmp/sample.csv A client error (AccessDenied) occurred when calling the PutObject operation: Access Denied
転送失敗時は「upload failed: ~」となるので、このメッセージをもとにエラーの判別をしてもいいかもしれません。