【保存版】AWS CLI完全ガイド2024 -導入から実践まで15の基本コマンドとユースケース

AWS CLI とは?初心者でもわかる基礎知識

AWS CLI の概要と重要性

AWS CLI(Command Line Interface)は、AWSのサービスをコマンドラインから操作するためのツールです。コマンドを入力することで、AWSの各種サービスを効率的に管理・操作することができます。

AWS CLIの主な特徴:

  • クロスプラットフォーム対応: Windows、macOS、Linuxで利用可能
  • Python製: Python環境があれば簡単にインストール可能
  • 自動化対応: シェルスクリプトやバッチファイルでの自動化が容易
  • 最新機能に迅速対応: 新機能のリリースに合わせて迅速にアップデート

AWS CLI を使うメリット 3 選

  1. 作業の効率化と自動化
  • 複数のリソースに対する一括操作が可能
  • 定期的な作業を自動化できる
  • 複雑な操作をスクリプト化して再利用可能
  1. 細かな制御とカスタマイズ
  • 詳細なパラメータ設定が可能
  • 出力形式を自由にカスタマイズ(JSON/YAML/テキスト)
  • フィルタリングやクエリ機能で必要な情報のみ抽出可能
  1. システム管理の効率化
  • 複数環境の一元管理が容易
  • バージョン管理システムとの連携が可能
  • CI/CDパイプラインへの組み込みが容易

AWS CLIとマネジメントコンソールの違い

比較項目AWS CLIマネジメントコンソール
操作方法コマンドラインGUI(Webブラウザ)
学習曲線最初は急だが、慣れると効率的直感的で学習が容易
自動化容易(スクリプト化可能)困難(手動操作が基本)
操作速度高速(慣れた後)比較的遅い(画面遷移が必要)
エラー対応詳細なエラーメッセージ視覚的なエラー表示
向いている作業反復作業、大量の操作、自動化視覚的な確認、単発の操作、設定の確認

AWS CLIは、特に以下のような場面で威力を発揮します:

  • 複数のS3バケット間でのファイル転送
  • EC2インスタンスの一括起動/停止
  • CloudWatchログの一括取得
  • IAMユーザーの一括作成/管理
  • バックアップ作業の自動化

これらの作業は、マネジメントコンソールでは手間と時間がかかりますが、AWS CLIを使用することで効率的に実行できます。

AWS CLIのインストールと初期設定(2024年最新版)

環境別インストール手順

Windows環境での導入手順

  1. MSIインストーラーのダウンロード
  • AWS CLI公式ページから64ビット版のMSIインストーラーをダウンロード
  • ダウンロードしたファイル名:AWSCLIV2.msi
  1. インストールの実行
   # インストーラーを実行
   msiexec.exe /i AWSCLIV2.msi

   # バージョン確認
   aws --version

macOS環境での導入手順

  1. Homebrewを使用する方法(推奨)
   # Homebrewでインストール
   brew install awscli

   # バージョン確認
   aws --version
  1. パッケージインストーラーを使用する方法
   # パッケージのダウンロードとインストール
   curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
   sudo installer -pkg AWSCLIV2.pkg -target /

Linux環境での導入手順

  1. パッケージマネージャーを使用する方法
   # Ubuntu/Debian系
   sudo apt-get update
   sudo apt-get install awscli

   # RedHat/Amazon Linux系
   sudo yum install awscli
  1. 直接インストールする方法
   # インストールスクリプトのダウンロードと実行
   curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
   unzip awscliv2.zip
   sudo ./aws/install

認証情報の設定方法

  1. アクセスキーの準備
  • AWSマネジメントコンソールにログイン
  • IAMユーザー設定からアクセスキーを作成
  • 以下の情報をメモ
    • Access Key ID
    • Secret Access Key
  1. 認証情報の設定
   # aws configureコマンドの実行
   aws configure

   # 以下の情報を順に入力
   AWS Access Key ID [None]: AKIAXXXXXXXXXXXXXXXX
   AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   Default region name [None]: ap-northeast-1
   Default output format [None]: json
  1. プロファイル管理(複数アカウント使用時)
   # 特定のプロファイル用に認証情報を設定
   aws configure --profile prod

   # プロファイルを指定してコマンドを実行
   aws s3 ls --profile prod

動作確認の手順

  1. 基本的な動作確認
   # バージョン確認
   aws --version

   # 設定の確認
   aws configure list

   # S3バケット一覧の取得
   aws s3 ls
  1. よくあるエラーと対処法 エラーメッセージ 考えられる原因 対処法 Unable to locate credentials 認証情報が未設定 aws configureを実行 Invalid access key アクセスキーが間違っている IAMで正しいキーを確認 Connection timed out ネットワーク接続の問題 プロキシ設定を確認
  2. トラブルシューティング用のコマンド
   # 認証情報の保存場所確認
   ls ~/.aws/

   # 詳細なデバッグ情報の表示
   aws s3 ls --debug

   # HTTPプロキシの設定(必要な場合)
   export HTTP_PROXY=http://proxy.example.com:8080
   export HTTPS_PROXY=http://proxy.example.com:8080

この初期設定が完了すれば、AWS CLIを使用して様々なAWSサービスを操作する準備が整います。次のステップでは、実際のコマンド使用例を見ていきましょう。

AWS CLIで覚えておきたい15の基本コマンド

S3操作の必須コマンド5選

  1. バケット一覧の表示
   # 全バケットの一覧表示
   aws s3 ls

   # 特定のバケット内のオブジェクト一覧表示
   aws s3 ls s3://bucket-name/
  1. ファイルのアップロード/ダウンロード
   # ファイルのアップロード
   aws s3 cp local-file.txt s3://bucket-name/

   # フォルダ全体の再帰的アップロード
   aws s3 cp local-folder/ s3://bucket-name/ --recursive

   # ファイルのダウンロード
   aws s3 cp s3://bucket-name/remote-file.txt ./
  1. オブジェクトの削除
   # 単一ファイルの削除
   aws s3 rm s3://bucket-name/file-to-delete.txt

   # フォルダ内のすべてのファイルを削除
   aws s3 rm s3://bucket-name/folder/ --recursive
  1. バケットの作成/削除
   # バケットの作成
   aws s3 mb s3://new-bucket-name

   # バケットの削除(空である必要あり)
   aws s3 rb s3://bucket-to-delete
  1. 同期コマンド
   # ローカルフォルダとS3バケットの同期
   aws s3 sync local-folder/ s3://bucket-name/

   # 削除されたファイルも同期(完全同期)
   aws s3 sync local-folder/ s3://bucket-name/ --delete

EC2管理の重要コマンド5選

  1. インスタンスの一覧表示
   # すべてのインスタンスの表示
   aws ec2 describe-instances

   # 実行中のインスタンスのみ表示
   aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"
  1. インスタンスの起動/停止
   # インスタンスの起動
   aws ec2 start-instances --instance-ids i-1234567890abcdef0

   # インスタンスの停止
   aws ec2 stop-instances --instance-ids i-1234567890abcdef0
  1. インスタンスの作成
   # 基本的なインスタンス作成
   aws ec2 run-instances \
       --image-id ami-12345678 \
       --instance-type t2.micro \
       --key-name my-key-pair
  1. セキュリティグループの管理
   # セキュリティグループの作成
   aws ec2 create-security-group \
       --group-name my-sg \
       --description "My security group"

   # インバウンドルールの追加
   aws ec2 authorize-security-group-ingress \
       --group-name my-sg \
       --protocol tcp \
       --port 22 \
       --cidr 0.0.0.0/0
  1. タグの管理
   # タグの追加
   aws ec2 create-tags \
       --resources i-1234567890abcdef0 \
       --tags Key=Environment,Value=Production

   # タグによるインスタンスの検索
   aws ec2 describe-instances \
       --filters "Name=tag:Environment,Values=Production"

IAM操作の基本コマンド5選

  1. ユーザー管理
   # ユーザーの作成
   aws iam create-user --user-name newuser

   # ユーザーの一覧表示
   aws iam list-users
  1. グループ管理
   # グループの作成
   aws iam create-group --group-name developers

   # ユーザーをグループに追加
   aws iam add-user-to-group \
       --user-name newuser \
       --group-name developers
  1. ポリシー管理
   # カスタムポリシーの作成
   aws iam create-policy \
       --policy-name custompolicy \
       --policy-document file://policy.json

   # ポリシーのアタッチ
   aws iam attach-user-policy \
       --user-name newuser \
       --policy-arn arn:aws:iam::aws:policy/CustomPolicy
  1. アクセスキーの管理
   # アクセスキーの作成
   aws iam create-access-key --user-name newuser

   # アクセスキーの一覧表示
   aws iam list-access-keys --user-name newuser
  1. パスワードポリシーの管理
   # パスワードポリシーの設定
   aws iam update-account-password-policy \
       --minimum-password-length 12 \
       --require-numbers \
       --require-uppercase-characters

   # パスワードポリシーの表示
   aws iam get-account-password-policy

これらのコマンドは、AWS CLIの基本的な操作の中でも特に重要なものです。各コマンドには多くのオプションがあり、aws helpコマンドや公式ドキュメントで詳細を確認できます。

AWS CLIを使った実践的なユースケース

S3バケットの自動バックアップ化

1. 日次バックアップスクリプトの作成

#!/bin/bash

# バックアップ元とバックアップ先のS3バケットを指定
SOURCE_BUCKET="source-bucket"
BACKUP_BUCKET="backup-bucket"
DATE=$(date +%Y%m%d)

# バックアップの実行
aws s3 sync s3://$SOURCE_BUCKET/ s3://$BACKUP_BUCKET/backup-$DATE/ \
    --storage-class STANDARD_IA \
    --delete

# バックアップ完了通知
aws sns publish \
    --topic-arn arn:aws:sns:region:account-id:backup-notification \
    --message "Daily backup completed for $SOURCE_BUCKET to $BACKUP_BUCKET/backup-$DATE/"

2. バックアップの世代管理

#!/bin/bash

# 30日以上前のバックアップを削除
aws s3 ls s3://backup-bucket/ | while read -r line;
do
    # バックアップ日付を取得
    createDate=`echo $line|awk {'print $1'}`
    # 30日以上前のバックアップを特定
    olderThan30Days=$(date -d "-30 days" +%Y-%m-%d)

    if [[ $createDate < $olderThan30Days ]]
    then
        # 古いバックアップを削除
        aws s3 rm s3://backup-bucket/backup-$createDate/ --recursive
    fi
done

EC2インスタンスの一括管理

1. 複数インスタンスの状態管理スクリプト

#!/bin/bash

# 特定のタグを持つインスタンスを一括で起動/停止
function manage_instances() {
    ACTION=$1
    TAG_KEY=$2
    TAG_VALUE=$3

    # タグでインスタンスを検索
    INSTANCES=$(aws ec2 describe-instances \
        --filters "Name=tag:$TAG_KEY,Values=$TAG_VALUE" \
        --query 'Reservations[].Instances[?State.Name!=`terminated`][].InstanceId' \
        --output text)

    # アクションの実行
    if [ ! -z "$INSTANCES" ]; then
        aws ec2 $ACTION-instances --instance-ids $INSTANCES
        echo "$ACTION completed for instances: $INSTANCES"
    fi
}

# 使用例
# 開発環境のインスタンスを停止
manage_instances "stop" "Environment" "Development"

# 本番環境のインスタンスを起動
manage_instances "start" "Environment" "Production"

2. リソース使用状況のモニタリングスクリプト

#!/bin/bash

# インスタンスのCPU使用率を監視
function monitor_cpu_utilization() {
    INSTANCE_ID=$1

    aws cloudwatch get-metric-statistics \
        --namespace AWS/EC2 \
        --metric-name CPUUtilization \
        --dimensions Name=InstanceId,Value=$INSTANCE_ID \
        --statistics Average \
        --start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%S) \
        --end-time $(date -u +%Y-%m-%dT%H:%M:%S) \
        --period 300
}

# メモリ使用率の高いインスタンスを特定
function find_high_memory_instances() {
    aws cloudwatch get-metric-statistics \
        --namespace System/Linux \
        --metric-name MemoryUtilization \
        --statistics Average \
        --period 300 \
        --threshold 80
}

CloudWatchログの効率的な取得

1. ログエクスポートスクリプト

#!/bin/bash

# CloudWatchロググループから特定期間のログを取得
function export_logs() {
    LOG_GROUP=$1
    START_TIME=$2
    END_TIME=$3
    OUTPUT_FILE=$4

    aws logs get-log-events \
        --log-group-name $LOG_GROUP \
        --start-time $START_TIME \
        --end-time $END_TIME \
        --output text > $OUTPUT_FILE
}

# エラーログの抽出
function filter_error_logs() {
    LOG_GROUP=$1

    aws logs filter-log-events \
        --log-group-name $LOG_GROUP \
        --filter-pattern "ERROR" \
        --start-time $(date -u -v-24H +%s000) \
        --end-time $(date -u +%s000)
}

2. ログ分析自動化スクリプト

#!/bin/bash

# 複数のロググループから重要なログを収集
function collect_important_logs() {
    # ロググループのリストを取得
    LOG_GROUPS=$(aws logs describe-log-groups --query 'logGroups[].logGroupName' --output text)

    for LOG_GROUP in $LOG_GROUPS
    do
        # エラーログを抽出
        ERROR_LOGS=$(aws logs filter-log-events \
            --log-group-name $LOG_GROUP \
            --filter-pattern "ERROR" \
            --start-time $(date -u -v-1H +%s000) \
            --end-time $(date -u +%s000))

        # 重要なイベントを通知
        if [ ! -z "$ERROR_LOGS" ]; then
            aws sns publish \
                --topic-arn arn:aws:sns:region:account-id:log-notification \
                --message "Important logs found in $LOG_GROUP: $ERROR_LOGS"
        fi
    done
}

# 使用例
collect_important_logs

これらのスクリプトは、実際の運用環境で使用する際には、エラーハンドリングやログ出力、セキュリティ考慮事項などを追加する必要があります。また、各環境に合わせてパラメータを適切に設定することが重要です。

AWS CLI のトラブルシューティング

認証エラーの対処法

1. よくある認証エラーと解決策

エラーメッセージ原因解決策
Unable to locate credentials認証情報が未設定または見つからないaws configureで認証情報を再設定
Invalid access keyアクセスキーが間違っているIAMコンソールで正しいキーを確認・再発行
ExpiredToken一時認証情報の有効期限切れ新しい認証情報を取得して設定
AccessDenied権限不足IAMポリシーの確認と必要な権限の追加

2. 認証情報のトラブルシューティング手順

# 現在の認証情報を確認
aws configure list

# 認証情報ファイルの確認
cat ~/.aws/credentials

# 環境変数の確認
env | grep AWS

# 認証情報のテスト
aws sts get-caller-identity

パーミッションエラーの解決方法

1. IAMポリシーの確認と修正

# 現在のIAMユーザーの権限を確認
aws iam get-user
aws iam list-attached-user-policies --user-name YOUR_USERNAME

# ポリシーの詳細を確認
aws iam get-policy-version \
    --policy-arn arn:aws:iam::aws:policy/POLICY_NAME \
    --version-id v1

2. 一般的なパーミッションエラーの解決策

エラー種別確認ポイント対処方法
S3アクセス拒否バケットポリシー、IAMポリシーバケットポリシーの確認とIAMポリシーの調整
EC2操作不可EC2関連の権限設定必要なEC2アクションの権限追加
CloudWatch Logs アクセス不可ログ関連の権限設定CloudWatchLogsFullAccessポリシーの確認

よくあるエラーとその解決方法

1. ネットワーク関連のエラー

# プロキシ設定の確認と設定
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080

# DNSの確認
nslookup s3.amazonaws.com

# SSL/TLS証明書の確認
aws s3 ls --debug

2. リージョン関連のエラー

# デフォルトリージョンの確認
aws configure get region

# 特定のリージョンを指定して実行
aws ec2 describe-instances --region ap-northeast-1

# 利用可能なリージョンの一覧表示
aws ec2 describe-regions

3. AWS CLIのバージョン互換性の問題

# バージョンの確認
aws --version

# AWS CLIの更新(環境別)
# Linux/macOS (pip)
pip install --upgrade awscli

# Windows (MSI)
# 新しいインストーラーをダウンロードして実行

4. デバッグモードでの問題解決

# デバッグ出力の有効化
aws s3 ls --debug

# デバッグログの保存
aws s3 ls --debug 2> debug.log

# トレース情報の表示
aws s3 ls --trace

トラブルシューティングのベストプラクティス

  1. 段階的なアプローチ
  • エラーメッセージの正確な記録
  • 環境変数とAWS CLI設定の確認
  • IAM権限の確認
  • ネットワーク接続の確認
  1. ログ収集と分析
  • デバッグモードでのログ収集
  • CloudWatchログの確認
  • エラーパターンの分析
  1. 定期的なメンテナンス
  • AWS CLIの定期的なアップデート
  • 認証情報の定期的な更新
  • 不要な認証情報やプロファイルの削除
  1. セキュリティ考慮事項
  • 認証情報の安全な管理
  • 最小権限の原則の遵守
  • 監査ログの定期的なレビュー

AWS CLI の実践的なTipsと効率化テクニック

プロファイル切り替えのベストプラクティス

1. 複数プロファイルの効率的な管理

# ~/.aws/config の設定例
[default]

region = ap-northeast-1 output = json

[profile dev]

region = ap-northeast-1 output = json

[profile prod]

region = ap-northeast-1 output = json role_arn = arn:aws:iam::123456789012:role/ProductionRole source_profile = default

2. プロファイル切り替えのエイリアス設定

# ~/.bashrc または ~/.zshrc に追加
alias aws-dev='export AWS_PROFILE=dev'
alias aws-prod='export AWS_PROFILE=prod'
alias aws-default='export AWS_PROFILE=default'

# プロファイル一覧表示用エイリアス
alias aws-profiles='cat ~/.aws/config | grep "\[profile"'

出力形式のカスタマイズ方法

1. JMESPathクエリの活用例

# EC2インスタンスの特定情報のみ抽出
aws ec2 describe-instances \
    --query 'Reservations[].Instances[].[InstanceId,State.Name,Tags[?Key==`Name`].Value[]]' \
    --output table

# S3バケットのサイズ集計
aws s3api list-objects-v2 \
    --bucket my-bucket \
    --query 'sum(Contents[].Size)' \
    --output text

# タグ付きリソースの一覧
aws resourcegroupstaggingapi get-resources \
    --query 'ResourceTagMappingList[].{Resource:ResourceARN,Tags:Tags[]}' \
    --output json

2. カスタム出力フォーマット

# テーブル形式でのEC2インスタンス一覧
aws ec2 describe-instances \
    --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value | [0], InstanceId, InstanceType, State.Name]' \
    --output table

# CSV形式での出力
aws ec2 describe-instances \
    --query 'Reservations[].Instances[].[InstanceId,InstanceType,State.Name]' \
    --output text | sed 's/\t/,/g' > instances.csv

自動化スクリプトの作成手順

1. 基本的なシェル関数テンプレート

#!/bin/bash

# エラーハンドリング
set -e
trap 'echo "エラーが発生しました: $?"' ERR

# ログ出力関数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# AWS CLIコマンドのラッパー関数
aws_command() {
    log "実行するコマンド: aws $@"
    aws "$@"
    if [ $? -eq 0 ]; then
        log "コマンドが正常に完了しました"
    else
        log "コマンドが失敗しました"
        return 1
    fi
}

# 使用例
aws_command ec2 describe-instances

2. 高度な自動化スクリプト例

#!/bin/bash

# 設定ファイルの読み込み
CONFIG_FILE="aws-automation-config.json"
if [ -f "$CONFIG_FILE" ]; then
    source <(jq -r 'to_entries | .[] | "export " + .key + "=" + (.value | @sh)' $CONFIG_FILE)
fi

# 並行処理の実装
process_instances() {
    local instances=($@)
    local max_parallel=5
    local running=0

    for instance in "${instances[@]}"; do
        # バックグラウンドでインスタンス処理
        (
            aws_command ec2 describe-instance-status --instance-id "$instance"
        ) &

        # 並行数の制御
        ((running++))
        if ((running >= max_parallel)); then
            wait -n
            ((running--))
        fi
    done

    # 残りのジョブの完了を待機
    wait
}

# リソースのタグ付け自動化
tag_resources() {
    local resource_type=$1
    local tag_key=$2
    local tag_value=$3

    # リソース一覧の取得
    resources=$(aws resourcegroupstaggingapi get-resources \
        --resource-type-filters "$resource_type" \
        --query 'ResourceTagMappingList[].ResourceARN' \
        --output text)

    # タグ付け
    for resource in $resources; do
        aws_command tags tag-resources \
            --resource-arn-list "$resource" \
            --tags "$tag_key"="$tag_value"
    done
}

効率化のためのその他のTips

  1. シェル補完の活用
# Bashの場合
complete -C '/usr/local/bin/aws_completer' aws

# Zshの場合
autoload bashcompinit && bashcompinit
complete -C '/usr/local/bin/aws_completer' aws
  1. 便利なエイリアス設定
# ~/.bashrc または ~/.zshrc に追加
# インスタンス一覧表示
alias aws-instances='aws ec2 describe-instances --query "Reservations[].Instances[].[Tags[?Key==\`Name\`].Value|[0],InstanceId,State.Name,InstanceType]" --output table'

# バケット一覧と合計サイズ
alias aws-buckets='aws s3api list-buckets --query "Buckets[].Name" --output table'

# セキュリティグループの詳細表示
alias aws-sgs='aws ec2 describe-security-groups --query "SecurityGroups[].[GroupName,GroupId,Description]" --output table'
  1. 環境変数の活用
# AWS CLIのデバッグモード
export AWS_DEBUG=true

# デフォルトリージョンの設定
export AWS_DEFAULT_REGION=ap-northeast-1

# 出力形式の設定
export AWS_DEFAULT_OUTPUT=json

# リトライの設定
export AWS_RETRY_MODE=standard
export AWS_MAX_ATTEMPTS=5
  1. スクリプト用のベストプラクティス
  • エラーハンドリングの実装
  • ログ出力の標準化
  • 設定の外部ファイル化
  • 並行処理の適切な利用
  • リソースのクリーンアップ処理

これらのTipsや効率化テクニックを活用することで、AWS CLIを使用した作業の生産性を大幅に向上させることができます。ただし、本番環境で使用する際は、十分なテストと適切なエラーハンドリングを実装することを忘れないようにしましょう。