コマンドラインからAWS S3へファイルの送受信をしよう

こんにちは。かっぺいです。
今回は、AWS CLIを使ったコマンドラインからS3へのファイル送受信する方法です。
バッチでバックアップしたり、大量のファイルを送受信したい時などにCLIから行う場合に便利です。

IAMでS3アクセス権限を作成

まずは、CLIを使うための権限を付与します。EC2インスタンスで利用する場合はIAMロールで設定し、外部PCなどで実行する場合は、IAMユーザーを作成して設定します。

EC2インスタンスで使うためのIAMロール作成

IAMを開いて、アクセス管理・ロールを選び、ロールの作成を選びます。

信頼されてエンティティタイプに「AWSのサービス」を選び、ユースケースに「EC2」を選びます。

アクセス可能なバケットやパスを指定したい場合には、許可ポリシーの「AmazonS3FullAccess」をベースにアクセス可能なバケットを編集します。
今回は、特に制限しない「AmazonS3FullAccess」選んで作成に進みます。

外部PCで使うためのIAMユーザー作成

IAMユーザーの作成

インターネットに接続したPCから、S3にアクセスしたい場合にはIAMユーザーを作成して、アクセスキーを作成して権限を付与します。

まず、IAMを開いてアクセス管理・ロールを選び、ロールの作成を選びます。
ユーザー名を入力して、AWSマネージメントコンソールへのアクセスは必要ないのでチェックはしません。

次に、ポリシーの付与方法を選びます。
普通のユーザーの場合は、管理しやすいようにグループにポリシーをアタッチして管理しますが、CLIアクセスはユーザーに対してアクセスキーを付与して限定的に扱うので、ポリシーを直接アタッチで付与します。

今回は、特に制限しない「AmazonS3FullAccess」選んで作成に進みます。

バケットのアクセス制限などを付与したい場合は、あらかじめポリシーを作成するか、ポリシーを付与せずに一度ユーザーを作成したのち、インラインポリシーでポリシーを付与します。

アクセスキーの作成

作成したユーザーに対して、アクセスキーを作成します。
ユーザーを選択したのち、セキュリティ認証情報タブからアクセスキー項目にある「アクセスキーの作成」を選びます。

次へ進むと、ベストプラクティスと代替案が表示されるので、ユースケースに「コマンドラインインターフェース」を選びます

今回は、代替案を使わずに作成するので、確認にチェックを入れて次へ進みアクセスキーを作成します。

作成したのち、アクセスキーとシークレットアクセスキーが表示されるので控えておきましょう。CSVとしてダウンロードも可能です。

権限のCLIへのアタッチ方法

EC2インスタンスの場合

EC2インスタンスを選択して、「インスタンスの状態」から「セキュリティ」「IAMロールを変更」を選びます。

次に表示される画面から、ロールを選択し更新を実行します。
なお、実行中のインスタンスのロールを変更した場合、インスタンス内のOS上ではすぐには反映されません。

インターネット外から実行する場合

WindowsやMacなど、PCで実行する場合は対応するAWS CLIをダウンロードしてインストールします。

コマンドラインから、AWS CLIを起動して設定を行います。

# aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]: 

アクセスキーとシークレットアクセスキーを入力し、必要に応じてデフォルトリージョンを指定します。アウトプットフォーマットはデフォルトのままで問題ありません。

AWS CLIからS3APIを実行

コマンドラインから、ファイルのコピー・ムーブ・削除が行えますが、一般的なコマンドラインからファイルを扱うようなワイルドカードの使い方はできません。

ディレクトリ内のsyncも行うことができます。

コピー・ムーブ・削除

# aws s3 cp コピー元 コピー先

S3のファイルはS3URIで

S3のファイルを指定する場合は、S3URIで指定します。

S3://バケット名/オブジェクトパス

マネージメントコンソールのS3から、S3URIをクリップボードにコピーする機能があります。
S3のURIを取得したいオブジェクトを選択して、「S3 URIをコピー」ボタンでクリップボードにコピーできます。

複数ファイル指定したい場合

コピー元ファイルは、単一の指定しか行えません。複数ファイル指定したい場合は、ディレクトリを指定してオプションを付加することで一括転送可能になります。

ディレクトリ内を再帰的に転送

再帰的に指定する場合は、–recursiveオプションを付与します

ワイルドカード指定

ワイルドカード指定は、–excludeと–includeを組み合わせて使います。
通常は、–exclude “*”で全てを排除してから、–include “*.csv”でワイルドカード指定します。

例.ローカルのカレントディレクトリにあるjpgファイルをまとめてS3に移動

# aws s3 mv --exclude "*" --include "*.jpg" --recursive . s3://s3-backet/target/

同期(sync)

ディレクトリの同期をとる場合は、syncを指定します。
デフォルトでは、不足または更新ファイルのみコピーとなり、ソースになくてターゲットに無いファイルの削除は行われません。
–deleteを付与することで、削除ファイルの同期も行われます。

# aws s3 sync  . s3://s3-bucket/target/

syncでは、サブディレクトリも対象になります。
そのため、ディレクトリ丸ごとコピーする場合には、syncを使った方が簡単にファイル操作が可能です。