AWSコマンドラインインターフェイス(CLI)は、AWSサービスを管理するための統合ツールです。ダウンロードして設定するツールが1つだけで、コマンドラインから複数のAWSサービスを制御し、スクリプトを使用してそれらを自動化できます。この記事では、AWSCLIを使用してAmazonS3バケットとオブジェクトを管理する方法と、日常のAWSアクティビティで使用できる多くの例について説明します。
AWS CLIに加えて、aws-shellをインストールすることを強くお勧めします。このコマンドラインシェルプログラムは、AWSコマンドラインインターフェイスの新規ユーザーと上級ユーザーの両方を支援する便利な機能と生産性機能を提供します。主な機能は次のとおりです。
- AWS CLIコマンド、オプション、およびリソースのあいまいなオートコンプリート
- 動的インラインドキュメント
- OSシェルコマンドの実行
- 実行されたコマンドをテキストエディタにエクスポートする
最後に、AWSCLI用のSessionManagerプラグインをインストールすることをお勧めします。これにより、AWSコマンドラインインターフェイス(AWS CLI)を使用して、EC2インスタンスに接続するセッションを開始および終了できます。
AWSCLIのインストール
AWS CLIは、Windows、macOS、およびLinuxにインストールできます。それに加えて、Amazon LinuxAMIにはすでにOSディストリビューションの一部としてAWSCLIが含まれているため、手動でインストールする必要はありません。
最新のWindowsディストリビューションの場合、Chocolateyパッケージマネージャーを使用してAWSCLIをインストールすることをお勧めします。
# AWS CLI
choco install awscli
# Session Manager plugin
choco install awscli-session-manager
# AWS-Shell
choco install python
choco install pip
pip install aws-shell
macOS
MacOSにAWSCLIをインストールするには、brewパッケージマネージャーを使用することをお勧めします:
# AWS CLI
brew install awscli
# Session Manager plugin
brew install --cask session-manager-plugin
# AWS-Shell
pip install aws-shell
Linux
Linuxディストリビューションによって、インストール手順は異なります。
CentOS、Fedora、RHEL
YUMベースのディストリビューション(CentOS、Fedora、RHEL)の場合、次のインストール手順を使用できます。
# AWS CLI
sudo yum update
sudo yum install wget -y
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install epel-release-latest-7.noarch.rpm
sudo yum -y install python-pip
sudo pip install awscli
# Session Manager plugin
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" \
-o "session-manager-plugin.rpm"
sudo yum install -y session-manager-plugin.rpm
# AWS-Shell
pip install aws-shell
Debian、Ubuntu
APTベースのディストリビューション(Debian、Ubuntu)の場合、わずかに異なるインストール手順を使用できます:
# AWS CLI
sudo apt-get install python-pip
sudo pip install awscli
# Session Manager plugin
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" \
-o "session-manager-plugin.deb"
sudo dpkg -i session-manager-plugin.deb
# AWS-Shell
pip install aws-shell
他のLinuxディストリビューションの場合は、手動のAWSCLIインストール手順を使用できます。
AWS s3、s3api、およびs3controlの違い
s3
の主な違い 、s3api
およびs3control
コマンドは、s3
コマンドは、低レベルのs3api
の上に構築された高レベルのコマンドです。 JSONモデルによって駆動されるコマンド。
s3 | s3api | s3control |
---|---|---|
これらのコマンドは、CLIを使用したS3ファイルの管理を容易にするために特別に設計されています。 | これらのコマンドは、さまざまなAWSサービスのAPIを直接モデル化するJSONモデルから生成されます。これにより、CLIは、サービスのAPIのほぼ1対1のマッピングであるコマンドを生成できます | これらのコマンドを使用すると、AmazonS3コントロールプレーンを管理できます |
aws s3 ls | aws s3api list-objects-v2 --bucket my-bucket | aws s3control list-jobs --account-id 123456789012 |
これらのコマンドを使用してVPCエンドポイントを操作する方法については、Terraformを使用したマルチリージョンVPCエンドポイントへのアクセスの自動化に関する記事をご覧ください。
AWSS3CLIコマンド
通常、スクリプトまたはCICD自動化パイプラインを使用してS3操作を自動化する必要がある場合は、AWSCLIコマンドを使用してS3を管理します。たとえば、環境内の任意のAWSアカウントに対してAWSCLIコマンドを実行するようにJenkinsパイプラインを設定できます。
記事のこのセクションでは、AWSCLIコマンドを使用してS3バケットとオブジェクトを管理する最も一般的な例について説明します。
S3バケットの管理
AWS CLIは、S3バケット管理の作成、一覧表示、削除の操作をサポートしています。
S3バケットを作成
AWS CLIを使用してS3バケットを作成するには、aws s3 mb
を使用する必要があります ( m ake b ucket)コマンド:
aws s3 mb s3://hands-on-cloud-example-1
注 :S3バケット名は常にs3://
から開始する必要があります プレフィックス。
特定のAWSリージョンでAWSCLIを使用してS3バケットを作成するには、--region
を追加する必要があります 前のコマンドの引数:
aws s3 mb s3://hands-on-cloud-example-2 --region us-east-2
AWS CLIを使用してS3バケットを一覧表示するには、aws s3 ls
のいずれかを使用できます またはaws s3api list-buckets
コマンド。
aws s3 ls
aws s3api list-buckets
コマンドは出力としてJSONを生成します:
aws s3api list-buckets
aws s3api
の使用 コマンドを使用すると、--query
を使用できます JSON出力の特定のメンバーと値に対してJMESPathクエリを実行するためのパラメータ。
名前がhands-on-cloud-example
で始まるバケットのみを出力してみましょう :
aws s3api list-buckets --query \
'Buckets[?starts_with(Name, `hands-on-cloud-example`) == `true`].Name'
前のコマンドを拡張して、S3バケット名のみを出力できます:
aws s3api list-buckets --query \
'Buckets[?starts_with(Name, `hands-on-cloud-example`) == `true`].[Name]' \
--output text
S3バケットを削除
AWS CLIを使用してS3バケットを削除するには、aws s3 rb
のいずれかを使用できます またはaws s3api delete-bucket
コマンド。
aws s3 rb s3://hands-on-cloud-example-1
注 :空のS3バケットのみを削除できます
S3バケットにオブジェクトが含まれている場合は、--force
を使用できます 削除する前にバケットをクリーンアップする引数:
aws s3 rb s3://hands-on-cloud-example-2 --force
注 :--force
引数は、バケットの削除が失敗する原因となるバージョン管理されたオブジェクトを削除していません。
オブジェクトのバージョン管理が有効になっているS3バケットを削除するには、最初にそれをクリーンアップする必要があります:
export bucket_name="hands-on-cloud-versioning-enabled"
# Deleting objects versions
aws s3api delete-objects \
--bucket $bucket_name \
--delete "$(aws s3api list-object-versions \
--bucket $bucket_name \
--output=json \
--query='{Objects: Versions[].{Key:Key,VersionId:VersionId}}')"
# Deleting delete markers
aws s3api delete-objects \
--bucket $bucket_name \
--delete "$(aws s3api list-object-versions \
--bucket $bucket_name \
--output=json \
--query='{Objects: Contents[].{Key:Key,VersionId:VersionId}}')"
# Deleting S3 bucket
aws s3 rb s3://$bucket_name
S3オブジェクトの管理
記事のこのセクションでは、S3オブジェクトを管理するための最も一般的なAWSCLI操作について説明します。
S3バケットにファイルをアップロード
AWS CLIを使用してファイルをS3バケットにアップロードするには、ether aws s3 cp
を使用する必要があります コマンド:
aws s3 cp ./Managing-AWS-IAM-using-Terraform.png s3://hands-on-cloud-example-1
必要に応じて、アップロード操作中にアップロードされたS3オブジェクト名を変更できます:
aws s3 cp ./Managing-AWS-IAM-using-Terraform.png s3://hands-on-cloud-example-1/image.png
それに加えて、アップロード中にS3ストレージクラスを指定できます:
aws s3 cp ./Managing-AWS-IAM-using-Terraform.png s3://hands-on-cloud-example-1 --storage-class ONEZONE_IA
--storage-class
でサポートされているパラメータ 引数は次のとおりです:
- 標準–デフォルト、AmazonS3標準
- REDUCED_REDUNDANCY –AmazonS3の冗長性ストレージの削減
- STANDARD_IA –AmazonS3標準-アクセス頻度が低い
- ONEZONE-IA – AmazonS3Oneゾーン-アクセス頻度が低い
- INTELLIGENT_TIERING –AmazonS3インテリジェントティアリング
- GLACIER –AmazonS3氷河
- DEEP_ARCHIVE –AmazonS3グレイシャーディープアーカイブ
ファイルをデフォルトのSSE暗号化で暗号化する必要がある場合は、--sse
を指定する必要があります 引数:
aws s3 cp ./Managing-AWS-IAM-using-Terraform.png s3://hands-on-cloud-example-1 --sse AES256
KMS暗号化の場合は、次のコマンドを使用します。
aws s3 cp ./Managing-AWS-IAM-using-Terraform.png s3://hands-on-cloud-example-1 --sse 'aws:kms' --sse-kms-key-id KMS_KEY_ID
注 :KMS_KEY_ID
を置き換えます 上記のコマンドで、独自のKMSキーIDを使用します。
S3バケットに複数のファイルをアップロードする
複数のファイルをS3バケットにアップロードするには、aws s3 cp
のいずれかを使用する必要があります --recursive
を使用したコマンド 引数またはaws s3 sync
コマンド。
aws s3 cp ./directory s3://hands-on-cloud-example-1/directory --recursive
注 :上記のコマンドは、空のディレクトリが./directory
内に存在する場合、それらをアップロードしません。 パス(それらを表すS3オブジェクトは作成されません)。
上記の例と同じ引数を使用して、必要に応じてS3ストレージクラスまたは暗号化を設定できます。
それに加えて、--include
を使用できます および--exclude
アップロードするファイルのセットを指定するための引数。
たとえば、.png
のみをコピーする必要がある場合 ./directory
のファイル 、次のコマンドを使用できます:
aws s3 cp ./directory s3://hands-on-cloud-example-1/directory --recursive --exclude "*" --include "*.png"
aws s3 sync
を使用しても同じ結果を得ることができます コマンド:
aws s3 sync ./directory s3://hands-on-cloud-example-1/directory
注 :aws s3 sync
コマンドは、S3ストレージクラスと暗号化を設定するための同じ引数をサポートします。
aws s3 sync
を使用する利点 コマンドは、このコマンドが次回の実行時にローカルファイルシステムから変更されたファイルのみをアップロードすることです。
--delete
を使用できます ローカルファイルシステムでオブジェクトが削除された場合にS3バケットからオブジェクトを削除する引数(完全同期):
aws s3 sync ./directory s3://hands-on-cloud-example-1/directory --delete
S3バケットからファイルをダウンロード
AWS CLIを使用してS3バケットから単一のファイルをダウンロードするには、aws s3 cp
を使用する必要があります コマンド:
aws s3 cp s3://hands-on-cloud-example-1/image.png ./image.png
S3バケットから複数のファイルをダウンロード
AWS CLIを使用してS3バケットから複数のファイルをダウンロードするには、aws s3 cp
のいずれかを使用する必要があります またはaws s3 sync
コマンド:
aws s3 cp s3://hands-on-cloud-example-1/directory ./directory --recursive
注 :S3バケットの/directory
内に空の「ディレクトリ」が含まれている場合 プレフィックスを付けると、上記のコマンドを実行すると、ローカルファイルシステムに空のディレクトリが作成されます。
アップロード操作と同様に、共通プレフィックス内のS3バケットからローカルディレクトリにすべてのオブジェクトを同期できます:
aws s3 sync s3://hands-on-cloud-example-1/directory ./directory
注 :両方のコマンドの場合(aws s3 cp
およびaws s3 sync
)--include
を使用できます および--exclude
特定のファイルセットのみをダウンロードまたは同期するための引数。
注 :--delete
を使用する aws s3 sync
を使用した引数 コマンドを使用すると、ローカルフォルダ内のS3オブジェクトプレフィックスの完全なミラーを取得できます。
S3バケット内のファイルを一覧表示する
AWS CLIを使用してS3バケット内のファイルを一覧表示するには、aws s3 ls
を使用する必要があります コマンド:
aws s3 ls s3://hands-on-cloud-example-1
--human-readable
を使用すると、人間が読める形式のオブジェクトのサイズを取得できます。 引数:
aws s3 ls s3://hands-on-cloud-example-1 --human-readable
--recursive
を使用できます S3バケット内または同じプレフィックスを持つすべてのS3オブジェクトを一覧表示する引数:
# Recursive listing of the entire S3 bucket
aws s3 ls s3://hands-on-cloud-example-1 --recursive
# Recursive listing for the S3 prefix
aws s3 ls s3://hands-on-cloud-example-1/directory --recursive
S3オブジェクトの名前を変更
AWS CLIを使用してS3オブジェクトの名前を変更するには、aws s3 mv
を使用する必要があります コマンド:
aws s3 mv s3://hands-on-cloud-example-1/image.png s3://hands-on-cloud-example-1/image2.png
注 :S3オブジェクトの名前を変更できるだけでなく、ストレージクラスと暗号化を変更することもできます(例:
)。aws s3 mv s3://hands-on-cloud-example-1/image2.png s3://hands-on-cloud-example-1/image.png \
--sse AES256 --storage-class ONEZONE_IA
S3の「ディレクトリ」の名前を変更します
AWS CLIを使用してS3の「ディレクトリ」の名前を変更するには、aws s3 mv
を使用する必要があります コマンド:
aws s3 mv s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-1/directory2 --recursive
注 :--recursive
引数は指定されたS3「ディレクトリ」内の空の「ディレクトリ」を移動しないため、完全な「ディレクトリ」の移動を期待している場合は、ターゲットディレクトリに空の「ディレクトリ」を再作成する必要があります(aws s3 put-object
コマンド)、ソースディレクトリからそれらを削除します(以下の例を参照)。
AWS CLIを使用して空のS3「ディレクトリ」を作成するには、aws s3 put-object
を使用する必要があります コマンド:
aws s3api put-object --bucket hands-on-cloud-example-1 --key directory_name/
注 :/
空のディレクトリを作成するには、オブジェクト名の文字が必要です。それ以外の場合、上記のコマンドはdirectory_name
という名前のファイルオブジェクトを作成します 。
S3バケット間でファイルをコピー/移動
AWS CLIを使用してS3バケット間でファイルをコピーするには、aws s3 cp
のいずれかを使用する必要があります またはaws s3 sync
指図。 S3バケット間でファイルを移動するには、aws s3 mv
を使用する必要があります コマンド。
同じAWSリージョン内のS3バケット間でファイルをコピーするには:
aws s3 cp s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-2/directory --recursive
ソースと宛先のS3バケットが異なるAWSリージョンにある場合は、--source-region
を使用する必要があります および--region
(指定された宛先S3バケットの場所)引数:
aws s3 cp s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-2/directory --recursive \
--region us-west-2 --source-region us-east-1
同じリージョン内のS3バケット間でオブジェクトを移動するには、aws s3 mv
を使用する必要があります コマンド:
aws s3 mv s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-2/directory --recursive
ソースと宛先のS3バケットが異なるAWSリージョンにある場合は、--source-region
を使用する必要があります および--region
(指定された宛先S3バケットの場所)引数:
aws s3 mv s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-2/directory --recursive \
--region us-west-2 --source-region us-east-1
注 :--storage-class
を使用できます および--sse
ターゲットS3バケットのストレージクラスと暗号化メソッドを指定する引数
注 :--include
を使用できます および--exclude
ソースS3バケットからコピー/移動する特定のファイルのみを選択するための引数
注 :--recursive
引数は指定されたS3プレフィックス内の空の「ディレクトリ」をコピー/移動しないため、完全な「ディレクトリ」のコピー/移動が必要な場合は、ターゲットディレクトリに空の「ディレクトリ」を再作成する必要があります(aws s3 put-object
指図)。上記の例を参照してください。
S3バケット間で「ディレクトリ」を同期するには、aws s3 sync
を使用する必要があります コマンド、例:
aws s3 sync s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-2/directory
注 :--storage-class
のような引数を使用できます 、--sse
、--include
および--exclude
aws s3 sync
を使用 コマンド:
aws s3 sync s3://hands-on-cloud-example-1/directory s3://hands-on-cloud-example-2/directory \
--region us-west-2 --source-region us-east-1 --sse AES256
S3オブジェクトの削除
AWS CLIを使用してS3オブジェクトを削除するには、aws s3 rm
を使用する必要があります コマンド:
aws s3 rm s3://hands-on-cloud-example-1/image.png
注 :--recursive
を使用できます 、--include
、および--exclude
aws s3 rm
を使用した引数 コマンド。
S3オブジェクトの事前署名されたURLを生成します
AWS CLIを使用してS3オブジェクトの事前署名されたURLを生成するには、aws s3 presign
を使用する必要があります コマンド:
aws s3 presign s3://hands-on-cloud-example-1/image.png --expires-in 604800
注 :–expires-in引数は、3600(分)から604800(最大)秒の間の秒単位で事前署名されたURLの有効期限を定義します。
これで、生成された事前署名されたURLを使用して、Webブラウザーまたはwget
を使用してS3オブジェクトをダウンロードできます。 コマンド、例:
wget generated_presigned_url
または、curl
を使用してS3オブジェクトを置き換えます コマンド:
curl -H "Content-Type: image/png" -T image.png generated_presigned_url
注 :The request signature we calculated does not match the signature you provided. Check your key and signing method.
エラーメッセージが表示されたら、AWSアクセスキーとAWSシークレットキーを再生成する必要があります。エラーの主な理由は、AWSクレデンシャルに+
などの特定の文字が含まれていることです 、%
、および/
。
この記事では、AWSCLIを使用してAmazonS3バケットとオブジェクトを管理する方法について説明し、日々のAWSアクティビティで使用できる多くの例を紹介しました。