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を使用した作業の生産性を大幅に向上させることができます。ただし、本番環境で使用する際は、十分なテストと適切なエラーハンドリングを実装することを忘れないようにしましょう。