AWS CLI とは?初心者でもわかる基礎知識
AWS CLI の概要と重要性
AWS CLI(Command Line Interface)は、AWSのサービスをコマンドラインから操作するためのツールです。コマンドを入力することで、AWSの各種サービスを効率的に管理・操作することができます。
AWS CLIの主な特徴:
- クロスプラットフォーム対応: Windows、macOS、Linuxで利用可能
- Python製: Python環境があれば簡単にインストール可能
- 自動化対応: シェルスクリプトやバッチファイルでの自動化が容易
- 最新機能に迅速対応: 新機能のリリースに合わせて迅速にアップデート
AWS CLI を使うメリット 3 選
- 作業の効率化と自動化
- 複数のリソースに対する一括操作が可能
- 定期的な作業を自動化できる
- 複雑な操作をスクリプト化して再利用可能
- 細かな制御とカスタマイズ
- 詳細なパラメータ設定が可能
- 出力形式を自由にカスタマイズ(JSON/YAML/テキスト)
- フィルタリングやクエリ機能で必要な情報のみ抽出可能
- システム管理の効率化
- 複数環境の一元管理が容易
- バージョン管理システムとの連携が可能
- CI/CDパイプラインへの組み込みが容易
AWS CLIとマネジメントコンソールの違い
| 比較項目 | AWS CLI | マネジメントコンソール |
|---|---|---|
| 操作方法 | コマンドライン | GUI(Webブラウザ) |
| 学習曲線 | 最初は急だが、慣れると効率的 | 直感的で学習が容易 |
| 自動化 | 容易(スクリプト化可能) | 困難(手動操作が基本) |
| 操作速度 | 高速(慣れた後) | 比較的遅い(画面遷移が必要) |
| エラー対応 | 詳細なエラーメッセージ | 視覚的なエラー表示 |
| 向いている作業 | 反復作業、大量の操作、自動化 | 視覚的な確認、単発の操作、設定の確認 |
AWS CLIは、特に以下のような場面で威力を発揮します:
- 複数のS3バケット間でのファイル転送
- EC2インスタンスの一括起動/停止
- CloudWatchログの一括取得
- IAMユーザーの一括作成/管理
- バックアップ作業の自動化
これらの作業は、マネジメントコンソールでは手間と時間がかかりますが、AWS CLIを使用することで効率的に実行できます。
AWS CLIのインストールと初期設定(2024年最新版)
環境別インストール手順
Windows環境での導入手順
- MSIインストーラーのダウンロード
- AWS CLI公式ページから64ビット版のMSIインストーラーをダウンロード
- ダウンロードしたファイル名:
AWSCLIV2.msi
- インストールの実行
# インストーラーを実行 msiexec.exe /i AWSCLIV2.msi # バージョン確認 aws --version
macOS環境での導入手順
- Homebrewを使用する方法(推奨)
# Homebrewでインストール brew install awscli # バージョン確認 aws --version
- パッケージインストーラーを使用する方法
# パッケージのダウンロードとインストール curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target /
Linux環境での導入手順
- パッケージマネージャーを使用する方法
# Ubuntu/Debian系 sudo apt-get update sudo apt-get install awscli # RedHat/Amazon Linux系 sudo yum install awscli
- 直接インストールする方法
# インストールスクリプトのダウンロードと実行 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
認証情報の設定方法
- アクセスキーの準備
- AWSマネジメントコンソールにログイン
- IAMユーザー設定からアクセスキーを作成
- 以下の情報をメモ
- Access Key ID
- Secret Access Key
- 認証情報の設定
# 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
- プロファイル管理(複数アカウント使用時)
# 特定のプロファイル用に認証情報を設定 aws configure --profile prod # プロファイルを指定してコマンドを実行 aws s3 ls --profile prod
動作確認の手順
- 基本的な動作確認
# バージョン確認 aws --version # 設定の確認 aws configure list # S3バケット一覧の取得 aws s3 ls
- よくあるエラーと対処法 エラーメッセージ 考えられる原因 対処法
Unable to locate credentials認証情報が未設定aws configureを実行Invalid access keyアクセスキーが間違っている IAMで正しいキーを確認Connection timed outネットワーク接続の問題 プロキシ設定を確認 - トラブルシューティング用のコマンド
# 認証情報の保存場所確認 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選
- バケット一覧の表示
# 全バケットの一覧表示 aws s3 ls # 特定のバケット内のオブジェクト一覧表示 aws s3 ls s3://bucket-name/
- ファイルのアップロード/ダウンロード
# ファイルのアップロード 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 ./
- オブジェクトの削除
# 単一ファイルの削除 aws s3 rm s3://bucket-name/file-to-delete.txt # フォルダ内のすべてのファイルを削除 aws s3 rm s3://bucket-name/folder/ --recursive
- バケットの作成/削除
# バケットの作成 aws s3 mb s3://new-bucket-name # バケットの削除(空である必要あり) aws s3 rb s3://bucket-to-delete
- 同期コマンド
# ローカルフォルダとS3バケットの同期 aws s3 sync local-folder/ s3://bucket-name/ # 削除されたファイルも同期(完全同期) aws s3 sync local-folder/ s3://bucket-name/ --delete
EC2管理の重要コマンド5選
- インスタンスの一覧表示
# すべてのインスタンスの表示 aws ec2 describe-instances # 実行中のインスタンスのみ表示 aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"
- インスタンスの起動/停止
# インスタンスの起動 aws ec2 start-instances --instance-ids i-1234567890abcdef0 # インスタンスの停止 aws ec2 stop-instances --instance-ids i-1234567890abcdef0
- インスタンスの作成
# 基本的なインスタンス作成
aws ec2 run-instances \
--image-id ami-12345678 \
--instance-type t2.micro \
--key-name my-key-pair
- セキュリティグループの管理
# セキュリティグループの作成
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
- タグの管理
# タグの追加
aws ec2 create-tags \
--resources i-1234567890abcdef0 \
--tags Key=Environment,Value=Production
# タグによるインスタンスの検索
aws ec2 describe-instances \
--filters "Name=tag:Environment,Values=Production"
IAM操作の基本コマンド5選
- ユーザー管理
# ユーザーの作成 aws iam create-user --user-name newuser # ユーザーの一覧表示 aws iam list-users
- グループ管理
# グループの作成
aws iam create-group --group-name developers
# ユーザーをグループに追加
aws iam add-user-to-group \
--user-name newuser \
--group-name developers
- ポリシー管理
# カスタムポリシーの作成
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
- アクセスキーの管理
# アクセスキーの作成 aws iam create-access-key --user-name newuser # アクセスキーの一覧表示 aws iam list-access-keys --user-name newuser
- パスワードポリシーの管理
# パスワードポリシーの設定
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
トラブルシューティングのベストプラクティス
- 段階的なアプローチ
- エラーメッセージの正確な記録
- 環境変数とAWS CLI設定の確認
- IAM権限の確認
- ネットワーク接続の確認
- ログ収集と分析
- デバッグモードでのログ収集
- CloudWatchログの確認
- エラーパターンの分析
- 定期的なメンテナンス
- AWS CLIの定期的なアップデート
- 認証情報の定期的な更新
- 不要な認証情報やプロファイルの削除
- セキュリティ考慮事項
- 認証情報の安全な管理
- 最小権限の原則の遵守
- 監査ログの定期的なレビュー
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
- シェル補完の活用
# Bashの場合 complete -C '/usr/local/bin/aws_completer' aws # Zshの場合 autoload bashcompinit && bashcompinit complete -C '/usr/local/bin/aws_completer' aws
- 便利なエイリアス設定
# ~/.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'
- 環境変数の活用
# 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
- スクリプト用のベストプラクティス
- エラーハンドリングの実装
- ログ出力の標準化
- 設定の外部ファイル化
- 並行処理の適切な利用
- リソースのクリーンアップ処理
これらのTipsや効率化テクニックを活用することで、AWS CLIを使用した作業の生産性を大幅に向上させることができます。ただし、本番環境で使用する際は、十分なテストと適切なエラーハンドリングを実装することを忘れないようにしましょう。