AWS CLI S3 とは:基礎知識と導入方法
AWS CLI S3 の特徴と注目点
AWS CLI S3は、コマンドラインからAmazon S3バケットを操作するためのツールです。以下の特徴により、多くの開発者から支持されています:
- 効率的な操作: GUIよりも素早く操作が可能
- 自動化の容易さ: シェルスクリプトやCI/CDパイプラインに組み込み可能
- バッチ処理: 複数のファイルやディレクトリを一括で処理可能
- クロスプラットフォーム: Windows、macOS、Linuxで利用可能
- 高度な制御: 詳細なオプションによる柔軟な操作
AWS CLI のインストールと初期設定手順
AWS CLIのインストールは、使用するOSによって異なります。以下に主要なOSでのインストール方法を示します:
Windows の場合:
- AWS CLIインストーラー(64ビット)をダウンロード
https://awscli.amazonaws.com/AWSCLIV2.msi
- ダウンロードしたインストーラーを実行
- インストールウィザードの指示に従う
macOS の場合:
# Homebrewを使用する場合 brew install awscli # 公式インストーラーを使用する場合 curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target /
Linux の場合:
# Amazon Linux 2 & RHEL sudo yum install -y aws-cli # Ubuntu & Debian sudo apt-get update sudo apt-get install -y awscli
インストール後、バージョンを確認して正しくインストールされたことを確認します:
aws --version
認証情報の設定と確認方法
AWS CLIを使用するには、適切な認証情報の設定が必要です。以下の手順で設定を行います:
- アクセスキーの準備
- AWS Management Consoleにログイン
- IAMダッシュボードから対象ユーザーを選択
- 「セキュリティ認証情報」タブでアクセスキーを作成
- 認証情報の設定
aws configure
以下の情報を順に入力:
- AWS Access Key ID
- AWS Secret Access Key
- Default region name (例: ap-northeast-1)
- Default output format (json/yaml/text)
- 設定の確認
# 設定した認証情報の確認 aws configure list # より詳細な設定の確認 aws configure get aws_access_key_id aws configure get region
設定のベストプラクティス:
- 本番環境用とテスト環境用で異なるプロファイルを作成する
- アクセスキーは定期的にローテーション(90日推奨)
- 必要最小限の権限を持つIAMユーザーを使用
注意点:
- アクセスキーは厳重に管理し、公開リポジトリにコミットしない
- 共有端末での認証情報の取り扱いには十分注意
- プロダクション環境ではIAMロールの使用を検討
以上の設定が完了すれば、AWS CLI S3を使用する準備が整います。次のセクションでは、具体的なS3の操作コマンドについて解説します。
AWS CLI S3の基本操作:13のよく使うコマンド
バケットの作成・一覧表示・削除
S3バケットの基本操作について解説します。
- バケットの作成
# バケットの作成(基本)
aws s3 mb s3://my-bucket-name
# リージョンを指定してバケットを作成
aws s3 mb s3://my-bucket-name --region ap-northeast-1
# バージョニングを有効化してバケットを作成
aws s3api create-bucket \
--bucket my-bucket-name \
--region ap-northeast-1 \
--create-bucket-configuration LocationConstraint=ap-northeast-1
aws s3api put-bucket-versioning \
--bucket my-bucket-name \
--versioning-configuration Status=Enabled
- バケットの一覧表示
# すべてのバケットを表示 aws s3 ls # 特定のバケット内のオブジェクトを表示 aws s3 ls s3://my-bucket-name/ # 再帰的にすべてのオブジェクトを表示 aws s3 ls s3://my-bucket-name/ --recursive # 詳細情報(サイズ、更新日時など)を表示 aws s3 ls s3://my-bucket-name/ --human-readable --summarize
- バケットの削除
# 空のバケットを削除 aws s3 rb s3://my-bucket-name # バケット内のオブジェクトも含めて強制削除 aws s3 rb s3://my-bucket-name --force
ファイルのアップロード・ダウンロード・削除
- ファイルのアップロード
# 単一ファイルのアップロード
aws s3 cp file.txt s3://my-bucket-name/
# 公開アクセス権限を付与してアップロード
aws s3 cp file.txt s3://my-bucket-name/ --acl public-read
# メタデータを付与してアップロード
aws s3 cp file.txt s3://my-bucket-name/ \
--metadata '{"key1":"value1","key2":"value2"}'
# サーバーサイド暗号化を指定してアップロード
aws s3 cp file.txt s3://my-bucket-name/ \
--sse AES256
- ファイルのダウンロード
# 単一ファイルのダウンロード
aws s3 cp s3://my-bucket-name/file.txt ./
# ディレクトリ全体のダウンロード
aws s3 cp s3://my-bucket-name/directory/ ./ --recursive
# 特定の拡張子のファイルのみダウンロード
aws s3 cp s3://my-bucket-name/ ./ \
--recursive \
--exclude "*" \
--include "*.jpg"
- ファイルの削除
# 単一ファイルの削除
aws s3 rm s3://my-bucket-name/file.txt
# ディレクトリ内のすべてのファイルを削除
aws s3 rm s3://my-bucket-name/directory/ --recursive
# 特定のパターンのファイルのみ削除
aws s3 rm s3://my-bucket-name/ \
--recursive \
--exclude "*" \
--include "*.tmp"
ディレクトリの同期(sync)コマンド
syncコマンドは、ローカルディレクトリとS3バケット間の差分を同期する強力な機能です。
# ローカルからS3への同期
aws s3 sync ./local-dir s3://my-bucket-name/remote-dir
# S3からローカルへの同期
aws s3 sync s3://my-bucket-name/remote-dir ./local-dir
# 削除されたファイルも同期(完全ミラーリング)
aws s3 sync ./local-dir s3://my-bucket-name/remote-dir --delete
# 特定のファイルを除外して同期
aws s3 sync ./local-dir s3://my-bucket-name/remote-dir \
--exclude "*.tmp" \
--exclude "*.log"
バケットポリシーの設定と確認
バケットポリシーはJSON形式で定義し、バケットのアクセス制御を行います。
- バケットポリシーの取得
aws s3api get-bucket-policy --bucket my-bucket-name
- バケットポリシーの設定
# ポリシーをファイルから設定
aws s3api put-bucket-policy \
--bucket my-bucket-name \
--policy file://policy.json
# 特定のIPアドレスからのアクセスのみを許可するポリシー例
cat > policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24"
}
}
}
]
}
EOF
- バケットポリシーの削除
aws s3api delete-bucket-policy --bucket my-bucket-name
これらのコマンドを組み合わせることで、S3バケットの効率的な管理が可能になります。次のセクションでは、これらのコマンドを活用した実践的な使用方法について解説します。
AWS CLI S3の実践的な使い方
大容量ファイルの効率的な転送方法
大容量ファイルを扱う際は、転送の効率化と信頼性の確保が重要です。
- マルチパートアップロードの活用
# マルチパートアップロードの設定 aws configure set default.s3.multipart_threshold 64MB aws configure set default.s3.multipart_chunksize 16MB aws configure set default.s3.max_concurrent_requests 10 # 大容量ファイルのアップロード(自動的にマルチパート転送が適用) aws s3 cp large_file.zip s3://my-bucket-name/
- 転送高速化の設定
# 転送アクセラレーションの有効化
aws s3api put-bucket-accelerate-configuration \
--bucket my-bucket-name \
--accelerate-configuration Status=Enabled
# アクセラレーションを使用したアップロード
aws s3 cp large_file.zip s3://my-bucket-name/ \
--endpoint-url http://s3-accelerate.amazonaws.com
- チェックサムによる整合性確認
# アップロード時にチェックサムを計算
aws s3 cp large_file.zip s3://my-bucket-name/ \
--checksum SHA256
# ダウンロード後の整合性確認
aws s3api head-object \
--bucket my-bucket-name \
--key large_file.zip \
--query ChecksumSHA256
複数ファイルの一括処理テクニック
大量のファイルを効率的に処理するためのテクニックを紹介します。
- パターンマッチングを使用した処理
# 複数の条件でファイルを選択
aws s3 cp s3://my-bucket-name/ ./download/ \
--recursive \
--exclude "*" \
--include "*.jpg" \
--include "*.png" \
--exclude "thumb/*"
# 更新日時による選択
aws s3 sync s3://my-bucket-name/logs/ ./logs/ \
--recursive \
--exclude "*" \
--include "*.log" \
--newer-than 2024-01-01
- バッチ処理の効率化
# 並列処理の設定
aws configure set default.s3.max_concurrent_requests 20
aws configure set default.s3.max_queue_size 10000
# ディレクトリ構造を保持したコピー
aws s3 cp ./local_dir/ s3://my-bucket-name/remote_dir/ \
--recursive \
--preserve
- フィルタリングとソート
# サイズでフィルタリング
aws s3api list-objects-v2 \
--bucket my-bucket-name \
--query 'Contents[?Size > `10485760`]' \
--output json
# 更新日時でソート
aws s3api list-objects-v2 \
--bucket my-bucket-name \
--query 'sort_by(Contents, &LastModified)[]'
エラー処理とトラブルシューティング
一般的なエラーとその解決方法について解説します。
- 一般的なエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
| AccessDenied | 権限不足 | IAMポリシーの見直し |
| NoSuchBucket | バケット不在 | バケット名の確認 |
| InvalidRequest | リクエスト不正 | パラメータの確認 |
| SlowDown | リクエスト過多 | リトライ間隔の調整 |
- エラーハンドリングの実装
# エラー時のリトライ設定
aws configure set default.retry_mode adaptive
aws configure set default.max_attempts 5
# エラーログの詳細化
aws s3 cp large_file.zip s3://my-bucket-name/ \
--debug 2> error.log
# 終了コードのチェック
if [ $? -eq 0 ]; then
echo "アップロード成功"
else
echo "エラーが発生しました"
fi
- トラブルシューティングのベストプラクティス
- 問題の切り分け
- ネットワーク接続の確認
- 認証情報の有効性確認
- バケットのアクセス権限確認
- リクエストの内容確認
- デバッグモードの活用
# デバッグ情報の出力
export AWS_DEBUG=true
aws s3 ls --debug
# HTTP通信の詳細確認
aws s3 cp file.txt s3://my-bucket-name/ \
--debug \
--endpoint-url http://s3.amazonaws.com
- 一般的な解決手順
- AWS CLIの最新バージョンへの更新
- 認証情報の再設定
- バケットポリシーの確認
- VPCエンドポイントの確認(VPC内から実行時)
これらの実践的なテクニックを活用することで、AWS CLI S3をより効率的に使用できます。次のセクションでは、これらの操作を自動化する方法について解説します。
AWS CLI S3 の自動化とスクリプティング
シェルスクリプトでの活用例
AWS CLI S3の操作を自動化するための実践的なシェルスクリプト例を紹介します。
- 日次バックアップスクリプト
#!/bin/bash
# バックアップ設定
SOURCE_DIR="/var/www/html"
BUCKET_NAME="my-backup-bucket"
BACKUP_DIR="daily-backup"
DATE=$(date +%Y-%m-%d)
# バックアップの実行
backup_daily() {
# 圧縮
tar -czf "/tmp/backup-${DATE}.tar.gz" "${SOURCE_DIR}"
# S3にアップロード
aws s3 cp "/tmp/backup-${DATE}.tar.gz" \
"s3://${BUCKET_NAME}/${BACKUP_DIR}/${DATE}/"
# 古いバックアップの削除(30日以上前)
aws s3 ls "s3://${BUCKET_NAME}/${BACKUP_DIR}/" | \
awk '{print $2}' | \
grep -E '^[0-9]{4}-[0-9]{2}-[0-9]{2}/$' | \
while read -r dir; do
dir_date=$(echo "$dir" | cut -d'/' -f1)
days_old=$(( ( $(date +%s) - $(date -d "$dir_date" +%s) ) / 86400 ))
if [ "$days_old" -gt 30 ]; then
aws s3 rm "s3://${BUCKET_NAME}/${BACKUP_DIR}/${dir}" --recursive
fi
done
# 一時ファイルの削除
rm "/tmp/backup-${DATE}.tar.gz"
}
# エラーハンドリング
backup_daily || {
echo "バックアップ失敗: $(date)" >> /var/log/backup-error.log
exit 1
}
- ログローテーションスクリプト
#!/bin/bash
# ログローテーション設定
LOG_DIR="/var/log"
BUCKET_NAME="my-logs-bucket"
RETENTION_DAYS=90
# ログファイルの圧縮とアップロード
rotate_logs() {
find "${LOG_DIR}" -name "*.log" -type f -mtime +7 | while read -r log_file; do
filename=$(basename "$log_file")
date_suffix=$(date +%Y%m%d)
# 圧縮
gzip -c "$log_file" > "/tmp/${filename}-${date_suffix}.gz"
# S3にアップロード
aws s3 cp "/tmp/${filename}-${date_suffix}.gz" \
"s3://${BUCKET_NAME}/logs/${filename}/${date_suffix}/"
# ローカルファイルの削除
rm "/tmp/${filename}-${date_suffix}.gz"
cat /dev/null > "$log_file"
done
# 古いログの削除
aws s3 ls "s3://${BUCKET_NAME}/logs/" --recursive | \
awk '{print $4}' | \
while read -r key; do
file_date=$(echo "$key" | grep -oE '[0-9]{8}')
if [ -n "$file_date" ]; then
days_old=$(( ( $(date +%s) - $(date -d "${file_date}" +%s) ) / 86400 ))
if [ "$days_old" -gt "$RETENTION_DAYS" ]; then
aws s3 rm "s3://${BUCKET_NAME}/${key}"
fi
fi
done
}
# クーロンジョブとして設定
# 0 0 * * * /path/to/rotate_logs.sh
バックアップ処理の自動化
- 差分バックアップの実装
#!/bin/bash
# 差分バックアップ設定
SOURCE_DIR="/data"
BUCKET_NAME="my-backup-bucket"
MANIFEST_FILE="/tmp/backup-manifest.txt"
# 差分バックアップの実行
differential_backup() {
# 現在のファイルリストの作成
find "${SOURCE_DIR}" -type f -exec sha256sum {} \; > "${MANIFEST_FILE}.new"
# 前回のマニフェストファイルの取得
aws s3 cp "s3://${BUCKET_NAME}/manifest/backup-manifest.txt" "${MANIFEST_FILE}.old" || touch "${MANIFEST_FILE}.old"
# 差分ファイルの特定と転送
diff "${MANIFEST_FILE}.old" "${MANIFEST_FILE}.new" | grep "^>" | cut -c 3- | while read -r line; do
file_hash=$(echo "$line" | cut -d' ' -f1)
file_path=$(echo "$line" | cut -d' ' -f2-)
# 変更されたファイルのアップロード
aws s3 cp "${file_path}" \
"s3://${BUCKET_NAME}/data/${file_hash}/" \
--metadata "path=${file_path}"
done
# 新しいマニフェストファイルのアップロード
aws s3 cp "${MANIFEST_FILE}.new" "s3://${BUCKET_NAME}/manifest/backup-manifest.txt"
# 一時ファイルの削除
rm "${MANIFEST_FILE}.new" "${MANIFEST_FILE}.old"
}
CI/CD パイプラインでの利用方法
- GitHub Actionsでの利用例
name: Deploy to S3
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Build application
run: |
npm install
npm run build
- name: Deploy to S3
run: |
aws s3 sync build/ s3://my-website-bucket/ \
--delete \
--cache-control "max-age=3600" \
--exclude "*.html" \
--include "*.js" \
--include "*.css" \
--include "*.png" \
--include "*.jpg"
# HTMLファイルは別のキャッシュ設定で配信
aws s3 sync build/ s3://my-website-bucket/ \
--delete \
--cache-control "no-cache" \
--include "*.html" \
--exclude "*"
- Jenkins パイプラインでの利用例
pipeline {
agent any
environment {
AWS_DEFAULT_REGION = 'ap-northeast-1'
S3_BUCKET = 'my-artifact-bucket'
}
stages {
stage('Build') {
steps {
sh 'mvn package'
}
}
stage('Upload to S3') {
steps {
script {
def artifactPath = "artifacts/${env.BUILD_NUMBER}"
// アーティファクトのアップロード
sh """
aws s3 cp target/*.jar \
s3://${S3_BUCKET}/${artifactPath}/ \
--metadata "build=${env.BUILD_NUMBER},commit=${env.GIT_COMMIT}"
"""
// デプロイマニフェストの更新
sh """
echo "latest=${env.BUILD_NUMBER}" | \
aws s3 cp - s3://${S3_BUCKET}/manifest.txt
"""
}
}
}
stage('Cleanup') {
steps {
script {
// 古いビルドの削除
sh """
aws s3 ls s3://${S3_BUCKET}/artifacts/ | \
sort -r | \
tail -n +6 | \
awk '{print \$2}' | \
xargs -I {} aws s3 rm s3://${S3_BUCKET}/artifacts/{} --recursive
"""
}
}
}
}
}
これらの自動化スクリプトとCI/CD設定を活用することで、S3の操作を効率的に自動化できます。次のセクションでは、これらの自動化を安全に実施するためのセキュリティベストプラクティスについて解説します。
AWS CLI S3 のセキュリティベストプラクティス
適切な IAM ポリシーの設定方法
S3バケットへのアクセスを適切に制御するためのIAMポリシー設定について解説します。
- 最小権限の原則に基づくポリシー設定
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSpecificBucketAccess",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::my-specific-bucket",
"arn:aws:s3:::my-specific-bucket/*"
]
},
{
"Sid": "DenyOtherBuckets",
"Effect": "Deny",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::*"
],
"Condition": {
"StringNotEquals": {
"s3:ResourceAccount": ["123456789012"]
}
}
}
]
}
- タグベースのアクセス制御
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringEquals": {
"s3:ResourceTag/Environment": "Production"
}
}
}
]
}
- IP制限の実装
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"203.0.113.0/24",
"2001:DB8::/32"
]
}
}
}
]
}
暗号化オプションの使い方
- サーバーサイド暗号化の設定
# AES256による暗号化
aws s3 cp file.txt s3://my-bucket/ --sse AES256
# AWS KMSによる暗号化
aws s3 cp file.txt s3://my-bucket/ \
--sse aws:kms \
--sse-kms-key-id arn:aws:kms:region:account:key/key-id
# バケットのデフォルト暗号化設定
aws s3api put-bucket-encryption \
--bucket my-bucket \
--server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}
]
}'
- クライアントサイド暗号化の実装
# Python例: クライアントサイド暗号化の実装
import boto3
from boto3.s3.transfer import TransferConfig
from cryptography.fernet import Fernet
def encrypt_and_upload(file_path, bucket, key):
# 暗号化キーの生成
encryption_key = Fernet.generate_key()
fernet = Fernet(encryption_key)
# ファイルの暗号化
with open(file_path, 'rb') as file:
encrypted_data = fernet.encrypt(file.read())
# S3にアップロード
s3 = boto3.client('s3')
config = TransferConfig(multipart_threshold=1024*25)
s3.put_object(
Bucket=bucket,
Key=key,
Body=encrypted_data,
Metadata={'encryption_key': encryption_key.decode()}
)
セキュリティリスクと対策
- 一般的なセキュリティリスクと対策
| リスク | 対策 | 実装例 |
|---|---|---|
| 認証情報の漏洩 | 認証情報の暗号化と定期的なローテーション | aws configure set default.credential_process /path/to/credential-process |
| バケットの誤公開 | パブリックアクセスブロック設定 | aws s3api put-public-access-block |
| データの改ざん | バージョニングとチェックサムの活用 | aws s3api put-bucket-versioning |
| 権限の過剰付与 | IAMポリシーの定期的な監査 | AWS IAM Access Analyzer の利用 |
- セキュリティ監査の実装
#!/bin/bash
# バケットセキュリティ監査スクリプト
audit_bucket_security() {
BUCKET_NAME=$1
echo "=== バケットセキュリティ監査: ${BUCKET_NAME} ==="
# パブリックアクセス設定の確認
aws s3api get-public-access-block \
--bucket "${BUCKET_NAME}"
# バケットポリシーの確認
aws s3api get-bucket-policy \
--bucket "${BUCKET_NAME}" 2>/dev/null || \
echo "バケットポリシーが設定されていません"
# 暗号化設定の確認
aws s3api get-bucket-encryption \
--bucket "${BUCKET_NAME}" 2>/dev/null || \
echo "デフォルト暗号化が設定されていません"
# バージョニング状態の確認
aws s3api get-bucket-versioning \
--bucket "${BUCKET_NAME}"
# ログ設定の確認
aws s3api get-bucket-logging \
--bucket "${BUCKET_NAME}"
}
- セキュリティベストプラクティスのチェックリスト
- 認証とアクセス制御
- [ ] IAMユーザー/ロールの最小権限設定
- [ ] MFAの有効化
- [ ] アクセスキーの定期的なローテーション
- [ ] IP制限の実装
- データ保護
- [ ] サーバーサイド暗号化の有効化
- [ ] バージョニングの有効化
- [ ] ライフサイクルポリシーの設定
- [ ] クロスリージョンレプリケーションの検討
- モニタリングと監査
- [ ] CloudTrailログの有効化
- [ ] S3アクセスログの有効化
- [ ] CloudWatchアラームの設定
- [ ] 定期的なセキュリティ監査の実施
- インシデント対応手順
#!/bin/bash
# インシデント対応スクリプト
incident_response() {
BUCKET_NAME=$1
INCIDENT_TYPE=$2
case "${INCIDENT_TYPE}" in
"unauthorized_access")
# バケットへのアクセスを一時的にブロック
aws s3api put-bucket-policy \
--bucket "${BUCKET_NAME}" \
--policy '{
"Version": "2012-10-17",
"Statement": [{
"Sid": "DenyAllAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::'"${BUCKET_NAME}"'",
"arn:aws:s3:::'"${BUCKET_NAME}"'/*"
]
}]
}'
# アクセスログの保存
aws s3api get-bucket-logging \
--bucket "${BUCKET_NAME}" > "incident_${BUCKET_NAME}_$(date +%Y%m%d_%H%M%S).log"
;;
"data_leak")
# バージョニング履歴の確認
aws s3api list-object-versions \
--bucket "${BUCKET_NAME}" > "versions_${BUCKET_NAME}_$(date +%Y%m%d_%H%M%S).log"
# アクセスログの分析
aws s3api get-bucket-logging \
--bucket "${BUCKET_NAME}" > "access_${BUCKET_NAME}_$(date +%Y%m%d_%H%M%S).log"
;;
esac
}
これらのセキュリティベストプラクティスを実装することで、AWS CLI S3の安全な利用が可能になります。定期的なセキュリティ監査と更新を行い、常に最新のセキュリティ対策を維持することが重要です。