AWS CLIを使ってS3バケットにファイルを転送する

仕事中に触ることがあったので、メモ程度に残しておきます。

事前準備

AWS CLIをインストール

https://aws.amazon.com/jp/cli/
からインストーラがダウンロードできるので、自身の環境にあったインストーラをダウンロードし、インストールします。
(私はWindowsで試しています。)

IAMユーザの作成と、アクセスキーID/シークレットアクセスキーの取得

今回はプロファイルを使ってS3へのアクセス権限を取得しますので、事前に専用のIAMユーザーを作成しておくか、普段使っているユーザのアクセスキー/シークレットアクセスキーを取得しておきます。
私はS3アクセス用のIAMユーザーを作成しました。
コンソールからIAMのダッシュボード画面へ遷移し、新規ユーザーを作成します。

ここで、キーの表示、もしくはダウンロードを行っておかないと、後から確認ができないので忘れないようにしてください。
(忘れた場合、IAMのアクセス管理-ユーザー-概要、と画面遷移し、認証情報タブから再度「アクセスキーの作成」を行ってください。)

言わずもがな、バケットも作成しておいてください。
(ここでは過去にbeanstalkに触った時に作られた、今は全く使っていないバケットを再利用します。)

aws configureを使用してcredentialsファイルを作成

AWS CLIからS3を操作するために、事前に認証情報を作成しておきます。
今回は「aws configure」コマンドでcredentialsファイルを作成します。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html
で説明されている、「aws configure を使用したクイック設定」に従って操作を行えば問題なくできるかと思います。

バケットにファイルを置く

準備ができたので、さっそくAWS CLIでS3バケットの操作を行います。
バケットにファイルを配置する構文はこちらです。

aws s3 mv 配置対象のファイルパス 配置先バケット --オプション
aws s3 cp 配置対象のファイルパス 配置先バケット --オプション

mv、cpどちらでもバケットへ配置されるのですが、mvは対象のファイルの”移動”になるので、実行後は配置対象のファイルは操作しているマシンからは無くなります。(ファイルを残しておきたい場合はcpで。)

実際にファイルを置いてみます。
まずは念のため、アップしたいファイルが存在することを確認し、実行します。

PS C:\workspace\s3> dir


    ディレクトリ: C:\workspace\s3


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2020/12/30     11:41             30 up_sample.txt

確認後、awsコマンドを実行します。
コマンド実行時、「–オプション」に事前準備で作成した認証情報のプロファイルを指定します。(あと、ファイルをローカルに残したいので、cpで実行します。)

aws s3 cp up_sample.txt s3://elasticbeanstalk-ap-northeast-1-xxxxx/upload/ --profile s3_access

補足ですが、「/upload/」はフォルダ名です。
また、フォルダ名に「/フォルダ名/」と、最後にも「/」を付与しています。これを忘れると、このフォルダ名のファイルが作成されてしまうので、忘れないようにしてください。

コマンド実行時にエラーとなった場合は、以下の点を確認してみてください。

・profileの設定が行われていない。もしくは別のプロファイルを指定、プロファイル名が誤っている。
・アクセスキー、シークレットキーに誤りがある。もしくは期限が切れている。
・アップロードするファイルのパスが誤っている。

エラー無く完了したら、バケットにファイルが配置されているか確認します。
「aws s3 ls」を実行することで、バケット内のファイルの一覧を取得することができます。

aws s3 ls s3://elasticbeanstalk-ap-northeast-1-xxxxx/upload/ --profile s3_access

PS C:\workspace\s3> aws s3 ls s3://elasticbeanstalk-ap-northeast-1-xxxxx/upload/ --profile s3_access
2021-01-01 21:12:28          0
2021-01-01 22:38:54         30 up_sample.txt

配置されていました。簡単ですね。

アクセス許可について

ファイルを単純にアップするだけならこれで終わりですが、実際にはアクセス許可操作も行っていたので、ここでやってみます。

特にアクセス許可を指定しない場合はこうなっています。

配置の段階でアクセス制御を行いたい場合は、「–grants」オプションを付与して実行します。

aws s3 cp s3://elasticbeanstalk-ap-northeast-1-xxxxx/upload/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers

この場合の権限はこうなります。

複数の権限(例えば、オブジェクト所有者と全員(パブリックアクセス))を同時に指定する場合は、以下のようにgrantオプションに複数指定します。

aws s3 cp up_sample.txt s3://elasticbeanstalk-ap-northeast-1-xxxxx/upload/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=アカウントのメールアドレス

AWS CLIでS3を操作する方法の紹介は以上です。
コマンドが使えると、シェルなどに応用ができるので、活用してみてはいかがでしょうか。