AWS CLIとは?CLIを使うメリットを解説
AWSマネジメントコンソール(GUI)でポチポチと操作するのに慣れている方も多いと思います。しかし、AWS CLIを使いこなせるようになると、作業効率が劇的に向上し、自動化の可能性も広がります。このセクションでは、AWS CLIの基本概念とそのメリットについて詳しく解説します。
GUIよりも作業が最大3倍速になる理由
AWS CLI(Command Line Interface)は、AWSのサービスをコマンドライン上で操作するためのツールです。GUIと比べて作業が格段に速くなる理由は以下の3つです:
- キーボードだけで完結する操作
- マウス操作が不要で、キーボードショートカットを活用できる
- コマンド履歴を使って過去の操作を素早く再実行できる
- タブ補完機能で長いコマンドも瞬時に入力可能
- 複数の操作を一括実行
- 1つのコマンドで複数のリソースを同時に操作
- シェルスクリプトと組み合わせて連続した操作を自動化
- バッチ処理による大量のリソース操作が可能
- APIレベルでの直接操作
- GUIの画面遷移が不要で、APIを直接呼び出せる
- レスポンスが早く、操作結果がすぐに確認できる
- 詳細なパラメータ設定が1行で可能
自動化で効率化できる5つの作業
AWS CLIを使うことで、以下の作業を自動化できます:
- リソースの一括作成・削除
- 開発環境のセットアップ
- テスト環境の構築と破棄
- 大量のIAMユーザーの一括作成
- 定期的なバックアップ
- EC2スナップショットの自動取得
- RDSのバックアップスケジュール設定
- S3バケット間のデータ同期
- リソースの状態監視
- EC2インスタンスの稼働状況確認
- CloudWatchメトリクスの取得
- セキュリティグループの設定確認
- コスト管理作業
- 未使用リソースの検出と削除
- 請求情報の定期的なエクスポート
- タグベースのコスト分析
- セキュリティ関連の作業
- セキュリティグループの一括更新
- IAMポリシーの監査
- アクセスログの定期的な分析
これらの自動化により、人的ミスを減らし、一貫性のある運用が可能になります。また、退屈な定型作業から解放されることで、より創造的な業務に時間を使えるようになります。
次のセクションでは、この強力なツールのインストール方法と初期設定について詳しく解説していきます。
AWS CLIのインストールと初期設定(5分で完了)
AWS CLIのインストールは、使用しているOSに応じて異なる手順となりますが、いずれも簡単に完了できます。このセクションでは、各OSでのインストール方法と、その後の重要な初期設定について説明します。
Windows/Mac/Linuxへのインストール手順
Windowsの場合
- MSIインストーラーを使用する方法(推奨)
- AWS CLIの公式ページから64ビット版のMSIインストーラーをダウンロード
- ダウンロードしたMSIファイルをダブルクリックして実行
- インストールウィザードの指示に従って進める
- インストールの確認
aws --version # AWS CLI/2.x.x Python/3.x.x Windows/10 executable/x86_64
Macの場合
- homebrewを使用する方法(推奨)
brew install awscli
- pkgインストーラーを使用する方法
- AWS CLIの公式サイトからmacOS用pkgファイルをダウンロード
- ダウンロードしたpkgファイルをダブルクリックして実行
- インストールの確認
aws --version # AWS CLI/2.x.x Python/3.x.x Darwin/x.x.x
Linuxの場合
- パッケージマネージャーを使用する方法(Ubuntu/Debian)
sudo apt update sudo apt install awscli
- 直接インストールする方法(全てのディストリビューション)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
- インストールの確認
aws --version # AWS CLI/2.x.x Python/3.x.x Linux/x.x
認証情報の設定方法と注意点
1. アクセスキーの準備
- AWSマネジメントコンソールにログイン
- IAMユーザーの詳細画面で「認証情報」タブを選択
- 「アクセスキーの作成」をクリック
- アクセスキーIDとシークレットアクセスキーを安全に保管
2. 認証情報の設定
- aws configureコマンドを使用(推奨)
aws configure AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY Default region name [None]: ap-northeast-1 Default output format [None]: json
- 手動で設定ファイルを編集
# ~/.aws/credentials[default]
aws_access_key_id = AKIAIOSFODNN7EXAMPLE aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY # ~/.aws/config
[default]region = ap-northeast-1 output = json
重要な注意点
- セキュリティに関する注意点
- アクセスキーは定期的にローテーション(90日推奨)
- アクセスキーをソースコードやGitにコミットしない
- 必要最小限の権限を持つIAMユーザーを使用
- 複数プロファイルの管理
# 新しいプロファイルの作成 aws configure --profile prod aws configure --profile dev # プロファイルの使用 aws s3 ls --profile prod
- 環境変数による一時的な設定
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY export AWS_DEFAULT_REGION=ap-northeast-1
これで基本的なインストールと設定は完了です。次のセクションでは、実際のAWS CLIコマンドの使い方について詳しく解説していきます。
基本的なAWS CLIコマンド集
実際の運用で頻繁に使用する基本的なAWS CLIコマンドを、サービスごとにまとめて解説します。これらのコマンドを覚えることで、日常的な運用作業の多くをカバーできます。
S3の基本操作コマンド一覧
- バケット操作
# バケット一覧の表示 aws s3 ls # バケットの作成 aws s3 mb s3://my-bucket-name # mb = make bucket の略 # バケットの削除(空の場合のみ) aws s3 rb s3://my-bucket-name # rb = remove bucket の略 # バケットの強制削除(中身ごと) aws s3 rb s3://my-bucket-name --force
- オブジェクト操作
# ファイルのアップロード aws s3 cp local-file.txt s3://my-bucket/ # フォルダごとアップロード aws s3 cp my-folder s3://my-bucket/folder --recursive # ファイルのダウンロード aws s3 cp s3://my-bucket/file.txt ./ # フォルダごとダウンロード aws s3 cp s3://my-bucket/folder ./ --recursive # ファイルの移動(バケット間コピー) aws s3 mv s3://source-bucket/file.txt s3://dest-bucket/ # バケット内のファイル一覧表示 aws s3 ls s3://my-bucket/ # サブフォルダも含めて表示 aws s3 ls s3://my-bucket/ --recursive
- 同期コマンド
# ローカルフォルダとS3の同期 aws s3 sync local-folder s3://my-bucket/folder # S3からローカルへの同期 aws s3 sync s3://my-bucket/folder local-folder # 削除されたファイルも同期 aws s3 sync local-folder s3://my-bucket/folder --delete
EC2インスタンスの操作方法
- インスタンス情報の取得
# 全インスタンスの一覧表示 aws ec2 describe-instances # 特定の状態のインスタンスのみ表示 aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=running" # インスタンスIDのみを取得(よく使う形式) aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].[InstanceId]' \ --output text
- インスタンスの制御
# インスタンスの起動 aws ec2 start-instances --instance-ids i-1234567890abcdef0 # インスタンスの停止 aws ec2 stop-instances --instance-ids i-1234567890abcdef0 # インスタンスの再起動 aws ec2 reboot-instances --instance-ids i-1234567890abcdef0 # インスタンスの終了(削除) aws ec2 terminate-instances --instance-ids i-1234567890abcdef0
- インスタンスの作成と管理
# 新規インスタンスの作成 aws ec2 run-instances \ --image-id ami-1234567890abcdef0 \ --instance-type t2.micro \ --key-name my-key-pair \ --security-group-ids sg-1234567890abcdef0 \ --subnet-id subnet-1234567890abcdef0 # タグの追加 aws ec2 create-tags \ --resources i-1234567890abcdef0 \ --tags Key=Name,Value=MyServer
IAMユーザー管理の基本コマンド
- ユーザー操作
# ユーザー一覧の表示 aws iam list-users # 新規ユーザーの作成 aws iam create-user --user-name john.doe # ユーザーの削除 aws iam delete-user --user-name john.doe # パスワードの設定(コンソールアクセス用) aws iam create-login-profile \ --user-name john.doe \ --password MyP@ssw0rd123 \ --password-reset-required
- グループ操作
# グループの作成 aws iam create-group --group-name Developers # グループへのユーザー追加 aws iam add-user-to-group \ --user-name john.doe \ --group-name Developers # グループからのユーザー削除 aws iam remove-user-from-group \ --user-name john.doe \ --group-name Developers
- ポリシー操作
# ポリシーの一覧表示 aws iam list-policies # ユーザーへのポリシーアタッチ aws iam attach-user-policy \ --user-name john.doe \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess # グループへのポリシーアタッチ aws iam attach-group-policy \ --group-name Developers \ --policy-arn arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess
これらのコマンドは、AWS CLIの基本的な操作の一部です。実際の使用時には、--help
オプションを使用することで、各コマンドの詳細なヘルプを確認できます。次のセクションでは、これらのコマンドをより効率的に使用するためのテクニックについて解説します。
AWS CLIの実践的な使い方テクニック
AWS CLIをより効率的に使いこなすために、実践的なテクニックを紹介します。これらのテクニックを習得することで、コマンドライン操作の生産性が大幅に向上します。
出力形式の変更とJQの活用法
- 基本的な出力形式
# JSON形式(デフォルト) aws ec2 describe-instances --output json # テキスト形式(タブ区切り) aws ec2 describe-instances --output text # テーブル形式(見やすい表形式) aws ec2 describe-instances --output table
- queryパラメータの活用
# 特定のフィールドのみを抽出 aws ec2 describe-instances \ --query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value[]]' \ --output table # フィルタリングと値の抽出 aws ec2 describe-instances \ --query 'Reservations[*].Instances[?State.Name==`running`].InstanceId' \ --output text
- jqコマンドとの連携
# インスタンスの詳細情報を整形して表示 aws ec2 describe-instances | jq '.Reservations[].Instances[] | {ID: .InstanceId, State: .State.Name, Type: .InstanceType}' # 特定の条件に合致するリソースの抽出 aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(.State.Name == "running")' # CSV形式への変換 aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name] | @csv'
プロファイル切り替えのベストプラクティス
- 複数プロファイルの効率的な管理
# ~/.aws/config の設定例[profile dev]
region = ap-northeast-1 output = json
[profile stg]region = ap-northeast-1 output = json
[profile prod]region = ap-northeast-1 output = json mfa_serial = arn:aws:iam::123456789012:mfa/user.name
- 環境変数による一時的な切り替え
# シェルスクリプトでプロファイル切り替え switch_aws_profile() { export AWS_PROFILE=$1 export AWS_DEFAULT_PROFILE=$1 aws configure list } # エイリアスとして設定 alias awsdev='switch_aws_profile dev' alias awsstg='switch_aws_profile stg' alias awsprod='switch_aws_profile prod'
- MFAを使用する場合の認証情報管理
# MFAトークンを使用して一時認証情報を取得 aws sts get-session-token \ --serial-number arn:aws:iam::123456789012:mfa/user.name \ --token-code 123456 # 取得した認証情報を環境変数にセット export AWS_ACCESS_KEY_ID=ASIA... export AWS_SECRET_ACCESS_KEY=.... export AWS_SESSION_TOKEN=....
エイリアスを使った作業効率化
- よく使うコマンドのエイリアス設定
# ~/.bashrc または ~/.zshrc に追加 alias awsls='aws s3 ls' alias awscp='aws s3 cp' alias awssync='aws s3 sync' alias awsec2='aws ec2 describe-instances --query "Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value[]]" --output table'
- シェル関数による高度なエイリアス
# S3バケット内の検索を簡単に s3find() { aws s3 ls s3://$1 --recursive | grep $2 } # EC2インスタンスの簡易検索 ec2find() { aws ec2 describe-instances \ --filters "Name=tag:Name,Values=*$1*" \ --query 'Reservations[*].Instances[*].[InstanceId,State.Name,Tags[?Key==`Name`].Value[]]' \ --output table }
- 複雑な操作のワンライナー化
# 全リージョンのEC2インスタンス一覧を取得 alias awsec2all='for region in $(aws ec2 describe-regions --query "Regions[].RegionName" --output text); do echo "=== $region ==="; aws ec2 describe-instances --region $region --query "Reservations[*].Instances[*].[InstanceId,State.Name]" --output table; done' # 未使用のEBSボリュームを検索 alias awsebs='aws ec2 describe-volumes --filters Name=status,Values=available --query "Volumes[*].[VolumeId,Size,CreateTime]" --output table'
これらのテクニックを組み合わせることで、AWS CLIの操作がより効率的になり、日常的な運用作業の時間を大幅に削減できます。次のセクションでは、トラブルシューティングについて解説します。
AWS CLIのトラブルシューティング
AWS CLIを使用していると、様々なエラーに遭遇することがあります。このセクションでは、一般的なエラーの解決方法と、効果的なデバッグ手法について解説します。
よくあるエラーと解決方法
- 認証関連のエラー
# エラー例1: 認証情報が見つからない An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation. # 解決方法 # 認証情報の確認 aws configure list # または cat ~/.aws/credentials # 環境変数の確認 echo $AWS_ACCESS_KEY_ID echo $AWS_SECRET_ACCESS_KEY
- パーミッション関連のエラー
# エラー例2: IAMポリシーの権限不足 An error occurred (AccessDenied) when calling the CreateBucket operation: Access Denied # 解決方法 # 現在の権限を確認 aws iam get-user aws iam list-attached-user-policies --user-name your-username # ポリシーシミュレータでの権限チェック aws iam simulate-principal-policy \ --policy-source-arn arn:aws:iam::123456789012:user/your-username \ --action-names s3:CreateBucket
- リソース制限関連のエラー
# エラー例3: リソース制限到達 An error occurred (InstanceLimitExceeded) when calling the RunInstances operation # 解決方法 # 現在の使用状況確認 aws service-quotas list-service-quotas --service-code ec2 # 制限緩和のリクエスト aws service-quotas request-service-quota-increase \ --service-code ec2 \ --quota-code L-1216C47A \ --desired-value 20
- ネットワーク関連のエラー
# エラー例4: タイムアウト Unable to connect to the endpoint URL: "https://s3.amazonaws.com/" # 解決方法 # ネットワーク接続確認 ping s3.amazonaws.com # プロキシ設定の確認と設定 export HTTP_PROXY=http://proxy.example.com:8080 export HTTPS_PROXY=http://proxy.example.com:8080
- 入力パラメータのエラー
# エラー例5: 無効なパラメータ Parameter validation failed: Invalid id: "i-12345" for parameter InstanceId # 解決方法 # パラメータの形式確認 aws ec2 describe-instances help # 有効な値の確認 aws ec2 describe-instances \ --filters "Name=instance-id,Values=*" \ --query 'Reservations[*].Instances[*].[InstanceId]' \ --output text
デバッグモードを使ったエラー解析
- デバッグモードの有効化
# 方法1: コマンドラインで指定 aws s3 ls --debug # 方法2: 環境変数で指定 export AWS_DEBUG=true # 方法3: 設定ファイルで指定 # ~/.aws/config[default]
cli_global_args = –debug
- デバッグ出力の解析ポイント
- API呼び出し情報
# リクエストURL、HTTP メソッド、ヘッダー情報 2024-01-28 10:00:00,123 - MainThread - botocore.endpoint - DEBUG - Making request for OperationName with params: ...
- 認証情報の解決プロセス
# 認証情報がどこから取得されているか 2024-01-28 10:00:00,234 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: ...
- エラーレスポンスの詳細
# エラーの完全なスタックトレース 2024-01-28 10:00:00,345 - MainThread - botocore.parsers - DEBUG - Error response: ...
- 高度なデバッグテクニック
# HTTPリクエストの詳細確認 aws s3 ls --debug 2>&1 | grep 'HTTP' # 特定のエラーメッセージの抽出 aws s3 ls --debug 2>&1 | grep 'ERROR' # デバッグログのファイル出力 aws s3 ls --debug 2> debug.log
- デバッグ結果の活用
- エラーメッセージの完全な内容を確認
- APIリクエストの詳細な内容を検証
- 認証情報の解決プロセスを追跡
- ネットワークの問題を特定
- リクエストの実行時間を分析
これらのトラブルシューティング手法を理解しておくことで、問題が発生した際に効率的に原因を特定し、解決することができます。次のセクションでは、これらの知識を活用した具体的なユースケースについて解説します。
AWS CLI実践演習:具体的なユースケース
ここまで学んできたAWS CLIの知識を実践的なシナリオで活用する方法を紹介します。以下のユースケースは、実務でよく遭遇する場面を想定しています。
複数のS3バケットを一括操作する方法
- バケット間でのデータ同期スクリプト
#!/bin/bash # バケット間同期スクリプト sync_buckets() { local source_bucket="$1" local dest_bucket="$2" local prefix="$3" # 同期前の容量確認 echo "Source bucket size:" aws s3 ls s3://${source_bucket}/${prefix} --recursive --human-readable --summarize | grep "Total Size" # 同期実行 aws s3 sync s3://${source_bucket}/${prefix} s3://${dest_bucket}/${prefix} \ --only-show-errors \ --no-progress # 同期後の確認 echo "Sync completed. Verifying..." aws s3api list-objects-v2 \ --bucket ${dest_bucket} \ --prefix ${prefix} \ --query 'length(Contents)' \ --output text } # 使用例 sync_buckets "source-bucket" "backup-bucket" "data/2024/"
- 古いバージョンのクリーンアップ
#!/bin/bash # バージョニング有効なバケットの古いバージョンを削除 cleanup_versions() { local bucket_name="$1" local days_old="$2" # 削除対象の日付を計算 cutoff_date=$(date -d "${days_old} days ago" +%Y-%m-%d) # 古いバージョンを検索して削除 aws s3api list-object-versions \ --bucket ${bucket_name} \ --query "Versions[?LastModified<='${cutoff_date}'].[Key,VersionId]" \ --output text | while read key version; do echo "Deleting: ${key} (${version})" aws s3api delete-object \ --bucket ${bucket_name} \ --key ${key} \ --version-id ${version} done } # 使用例 cleanup_versions "my-bucket" 30
EC2インスタンスの定期的なバックアップ設定
- 自動スナップショット作成スクリプト
#!/bin/bash # EC2インスタンスの自動バックアップ backup_instances() { # タグで特定のインスタンスを選択 instance_ids=$(aws ec2 describe-instances \ --filters "Name=tag:Backup,Values=true" \ --query 'Reservations[*].Instances[*].[InstanceId]' \ --output text) # 現在の日時をタグ用に整形 timestamp=$(date +%Y%m%d-%H%M) for instance_id in ${instance_ids}; do # インスタンス名を取得 instance_name=$(aws ec2 describe-tags \ --filters "Name=resource-id,Values=${instance_id}" "Name=key,Values=Name" \ --query 'Tags[0].Value' \ --output text) # スナップショット作成 echo "Creating snapshot for ${instance_name} (${instance_id})" aws ec2 create-image \ --instance-id ${instance_id} \ --name "${instance_name}-backup-${timestamp}" \ --description "Automated backup of ${instance_name}" \ --no-reboot done } # 古いAMIの削除 cleanup_old_amis() { local days_to_keep="$1" local retention_date=$(date -d "${days_to_keep} days ago" +%Y-%m-%d) # 自動バックアップで作成したAMIを検索 ami_ids=$(aws ec2 describe-images \ --owners self \ --filters "Name=name,Values=*-backup-*" \ --query "Images[?CreationDate<='${retention_date}'].[ImageId]" \ --output text) for ami_id in ${ami_ids}; do echo "Deregistering AMI: ${ami_id}" aws ec2 deregister-image --image-id ${ami_id} # 関連するスナップショットも削除 snapshot_ids=$(aws ec2 describe-snapshots \ --owner self \ --filters "Name=description,Values=*${ami_id}*" \ --query 'Snapshots[*].[SnapshotId]' \ --output text) for snapshot_id in ${snapshot_ids}; do echo "Deleting snapshot: ${snapshot_id}" aws ec2 delete-snapshot --snapshot-id ${snapshot_id} done done } # cronで実行する例 # 0 1 * * * /path/to/backup_script.sh backup_instances # 0 2 * * * /path/to/backup_script.sh cleanup_old_amis 30
CloudWatchアラームの一括設定方法
- 複数リソースへのアラーム設定スクリプト
#!/bin/bash # EC2インスタンスのCPU使用率アラーム設定 setup_cpu_alarms() { local sns_topic_arn="$1" local threshold="$2" # 監視対象のインスタンスを取得 instance_ids=$(aws ec2 describe-instances \ --filters "Name=instance-state-name,Values=running" \ --query 'Reservations[*].Instances[*].[InstanceId]' \ --output text) for instance_id in ${instance_ids}; do # インスタンス名を取得 instance_name=$(aws ec2 describe-tags \ --filters "Name=resource-id,Values=${instance_id}" "Name=key,Values=Name" \ --query 'Tags[0].Value' \ --output text) # アラームの作成 aws cloudwatch put-metric-alarm \ --alarm-name "${instance_name}-CPU-Utilization" \ --alarm-description "CPU utilization check for ${instance_name}" \ --metric-name CPUUtilization \ --namespace AWS/EC2 \ --dimensions Name=InstanceId,Value=${instance_id} \ --period 300 \ --evaluation-periods 2 \ --threshold ${threshold} \ --comparison-operator GreaterThanThreshold \ --statistic Average \ --alarm-actions ${sns_topic_arn} echo "Created CPU alarm for ${instance_name}" done } # メモリ使用率モニタリングの設定 setup_memory_monitoring() { local instance_id="$1" # CloudWatchエージェント設定 aws ssm send-command \ --document-name "AWS-ConfigureAWSPackage" \ --targets "Key=InstanceIds,Values=${instance_id}" \ --parameters '{"Action":["Install"],"Name":["AmazonCloudWatchAgent"]}' \ --output text # エージェント設定ファイルの作成 cat << EOF > cwagent-config.json { "metrics": { "append_dimensions": { "InstanceId": "\${aws:InstanceId}" }, "metrics_collected": { "mem": { "measurement": [ "mem_used_percent" ], "metrics_collection_interval": 60 } } } } EOF # 設定の適用 aws ssm put-parameter \ --name "CWAgentConfig-${instance_id}" \ --type "String" \ --value file://cwagent-config.json # エージェントの起動 aws ssm send-command \ --document-name "AmazonCloudWatch-ManageAgent" \ --targets "Key=InstanceIds,Values=${instance_id}" \ --parameters '{"Action":["configure"],"Mode":["ec2"],"Configuration":[{"InstanceId":"'${instance_id}'"}]}' \ --output text } # 使用例 setup_cpu_alarms "arn:aws:sns:region:account-id:topic-name" 80 setup_memory_monitoring "i-1234567890abcdef0"
これらのスクリプトは実際の運用シーンですぐに活用できます。必要に応じて環境やニーズに合わせてカスタマイズしてください。また、本番環境で使用する前に必ずテスト環境で動作確認を行うことをお勧めします。