AWS CLIでS3操作するまとめ

AWS logo
作業メモがわり。






画像を全部base64エンコードしてHTMLに埋め込むWYSIWYGがありまして(環境整備しなくていいという意味でとっつきやすさは理解出来るけど、そんなの本番では使いものにならんやろ)そのせいで激重になってるコンテンツを軽量化すべく、画像をS3にアップロードしてURLだけ埋め込むようなタスクをゆるっと進行中です。んで、S3用のクレデンシャルを発行してもらって作業してるんですけどIAMの関係でS3コンソールにアクセス出来ないので、慣れないAWS CLIで操作しつつ最終的にやんわりハマったのでそこまでを。


AWS CLIのインストール

Windowsの場合、こちらからダウンロードしてインストール。


AWS CLIの最新バージョンをインストールまたは更新する – AWS Command Line Interface


翻訳の都合かところどころ日本語がおかしいですが、まあわかるので良し。

確認

PS C:\> aws --version
aws-cli/2.4.28 Python/3.8.8 Windows/10 exe/AMD64 prompt/off



クレデンシャルの設定を保存

いちいち入力するのはキツいので「Access key ID」と「Secret access key」を設定しておきます。

$ aws configure
AWS Access Key ID [NONE]: ← 入力
AWS Secret Access Key [NONE]: ← 入力
Default region name [NONE]: ap-northeast-1
Default output format [NONE]: json

複数のクレデンシャルを使い分ける場合は

「–profile」オプションを使います。

$ aws configure --profile s3-user

コマンドを実行するときも同じ。

$ aws s3 ls bucket --profile s3-user

設定の保存先は

以下の2つのファイルに分かれて保存されています。

~/.aws/credentials
~/.aws/config



AWS CLIでS3を操作してみる

基本的なコマンドは以下にあります。例によって日本語がおかしいですが、技術的な部分には影響はありません。


このトピックでは、を使用して Amazon S3 バケットとオブジェクトを管理するために使用できるコマンドの一部について説明します。aws s3内のコマンドAWS CLI。このトピックで説明していないコマンドおよび追加のコマンドの例については、を参照してください。aws s3内のコマンドAWS CLIリファレンス。

高レベル aws s3 コマンドを使用すると、Amazon S3 オブジェクトの管理が容易になります。これらのコマンドにより、Amazon S3 のコンテンツの管理をそれ自体の内部およびローカルディレクトリ内で管理することができます。

AWS CLI での高レベル (S3) コマンドの使用 – AWS Command Line Interface


バケットとオブジェクトの一覧表示

$ aws s3 ls sample-bucket

特定のディレクトリのファイルを一覧表示するには

$ aws s3 ls sample-bucket/test-dir/


※正確にはS3にはディレクトリという概念はなくファイルの「プレフィックス」ということになります。


ファイルをアップロードする

$ aws s3 cp test.txt sample-bucket



閲覧可能な状態でファイルを配置する

セキュリティ的な意味で、バケットや特定のプレフィックスを公開状態にすることなくオブジェクト単位で公開する運用とします。その場合、以下のコマンドでアップロードすることで公開状態に出来ます。


$ aws s3 cp test.txt sample-bucket --acl public-read


Access Denied

なんですが、今の僕の環境ではアップロードに失敗します。


upload failed: .\test.txt to s3://sample-bucket/test.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied


権限が不足していてPutObjectに失敗していると言われているようです。が、--acl オプションを付加しなければアップロードは成功します。どうやらaclの変更が出来ない?


IAM ユーザーがアップロード中にオブジェクトのアクセスコントロールリスト (ACL) を更新する必要がある場合、ユーザーは IAM ポリシーで s3:PutObjectAcl のアクセス許可も持っている必要があります。ユーザーの IAM ポリシーを更新する方法については、IAM ユーザーのアクセス権限の変更をご参照ください。

Amazon S3 における IAM 関連のアクセス拒否エラーをトラブルシューティングする


解決方法

現実的には次のうちのどれかかと。

  1. 指定されたプレフィックスのみパブリック読み取りOKにするバケットポリシーを設定しておく
  2. S3用IAMにPutObjectAclのアクセス許可を付与する
  3. バプリック読み取りOKのバケットを作る

どれも一長一短ですが、先に書いた運用(オブジェクト単位で公開する)に基づくと理想的な解決方法は2になるのかな。出来るならどれでも良いんですけど、管理者の判断にお任せして現在リクエスト中です。



今のところそんな感じ。