AWS CLI とは?初心者にもわかりやすく解説
コマンドラインからAWSを操作できる便利ツール
AWS CLI(Command Line Interface)は、AWSのサービスをコマンドラインから操作するためのツールです。AWSマネジメントコンソール(ブラウザベースのインターフェース)では実現できない複雑な操作や自動化を可能にする、強力なツールとして知られています。
AWS CLIを使用することで、以下のような利点が得られます:
- 複数のAWSサービスを一貫した方法で操作可能
- スクリプトによる自動化が容易
- バッチ処理による大量のタスク実行が可能
- バージョン管理システムとの親和性が高い
- CI/CDパイプラインへの組み込みが容易
AWS CLIのインストール方法と初期設定
インストール手順
- Windowsの場合:
# MSIインストーラーをダウンロードして実行 # 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
初期設定手順
- アクセスキーの準備
IAMユーザーのセキュリティ認証情報から、以下の情報を取得します:
- アクセスキーID
- シークレットアクセスキー
- 設定コマンドの実行
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 list # 認証情報の確認 aws sts get-caller-identity
重要な設定ファイル
AWS CLIの設定は以下の場所に保存されます:
~/.aws/credentials
:認証情報~/.aws/config
:リージョンや出力形式などの設定
セキュリティのため、以下の点に注意が必要です:
- アクセスキーは定期的なローテーションを行う
- 必要最小限の権限を持つIAMユーザーを使用する
- 認証情報ファイルのパーミッションを適切に設定する(600推奨)
- 本番環境の認証情報は慎重に管理する
これでAWS CLIのインストールと初期設定は完了です。次のセクションでは、具体的なコマンドの使用方法について解説していきます。
よく使うAWS CLIコマンド 57選
EC2関連の基本コマンド12選
EC2インスタンスの管理で頻繁に使用する基本的なコマンドをご紹介します。
1. インスタンス操作の基本コマンド
# インスタンス一覧の取得 aws ec2 describe-instances # 特定のインスタンスの詳細情報取得 aws ec2 describe-instances --instance-ids i-1234567890abcdef0 # インスタンスの起動 aws ec2 start-instances --instance-ids i-1234567890abcdef0 # インスタンスの停止 aws ec2 stop-instances --instance-ids i-1234567890abcdef0 # インスタンスの再起動 aws ec2 reboot-instances --instance-ids i-1234567890abcdef0
2. インスタンス作成と削除
# 新規インスタンスの作成 aws ec2 run-instances \ --image-id ami-12345678 \ --instance-type t2.micro \ --key-name MyKeyPair \ --security-group-ids sg-903004f8 \ --subnet-id subnet-6e7f829e # インスタンスの削除(終了) aws ec2 terminate-instances --instance-ids i-1234567890abcdef0
3. インスタンス監視とメタデータ
# インスタンスのステータスチェック aws ec2 describe-instance-status --instance-ids i-1234567890abcdef0 # インスタンスタイプの変更 aws ec2 modify-instance-attribute \ --instance-id i-1234567890abcdef0 \ --instance-type t2.small # タグの追加 aws ec2 create-tags \ --resources i-1234567890abcdef0 \ --tags Key=Environment,Value=Production
S3を操作する必須コマンド10選
S3バケットとオブジェクトを操作する上で重要なコマンドを解説します。
1. バケット操作
# バケット一覧の取得 aws s3 ls # バケットの作成 aws s3 mb s3://my-new-bucket # バケットの削除 aws s3 rb s3://my-bucket # バケットの中身を再帰的に削除 aws s3 rb s3://my-bucket --force
2. オブジェクト操作
# ファイルのアップロード aws s3 cp local-file.txt s3://my-bucket/ # ファイルのダウンロード aws s3 cp s3://my-bucket/remote-file.txt ./ # ディレクトリの同期 aws s3 sync ./local-dir s3://my-bucket/remote-dir # オブジェクトの削除 aws s3 rm s3://my-bucket/unnecessary-file.txt
IAM管理に使うコマンド8選
IAMユーザー、グループ、ロールの管理に必要なコマンドです。
# ユーザー一覧の取得 aws iam list-users # ユーザーの作成 aws iam create-user --user-name NewUser # グループの作成 aws iam create-group --group-name Developers # ユーザーをグループに追加 aws iam add-user-to-group \ --user-name NewUser \ --group-name Developers # ポリシーのアタッチ aws iam attach-user-policy \ --user-name NewUser \ --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess # ロールの作成 aws iam create-role \ --role-name MyRole \ --assume-role-policy-document file://trust-policy.json # アクセスキーの作成 aws iam create-access-key --user-name NewUser # パスワードポリシーの設定 aws iam update-account-password-policy \ --minimum-password-length 12 \ --require-symbols
CloudWatch監視用コマンド7選
システム監視とログ管理に関する重要なコマンドです。
# メトリクスの取得 aws cloudwatch get-metric-statistics \ --namespace AWS/EC2 \ --metric-name CPUUtilization \ --dimensions Name=InstanceId,Value=i-1234567890abcdef0 \ --start-time 2024-01-27T00:00:00 \ --end-time 2024-01-28T00:00:00 \ --period 3600 \ --statistics Average # アラームの作成 aws cloudwatch put-metric-alarm \ --alarm-name cpu-high \ --metric-name CPUUtilization \ --namespace AWS/EC2 \ --statistic Average \ --period 300 \ --threshold 70 \ --comparison-operator GreaterThanThreshold \ --evaluation-periods 2 \ --alarm-actions arn:aws:sns:region:account-id:topic-name # ロググループの作成 aws logs create-log-group --log-group-name my-logs # ログストリームの作成 aws logs create-log-stream \ --log-group-name my-logs \ --log-stream-name stream1 # ログイベントの取得 aws logs get-log-events \ --log-group-name my-logs \ --log-stream-name stream1 # メトリクスフィルターの作成 aws logs put-metric-filter \ --log-group-name my-logs \ --filter-name errors \ --filter-pattern "ERROR" \ --metric-transformations \ metricName=ErrorCount,metricNamespace=MyApp,metricValue=1 # ダッシュボードの作成 aws cloudwatch put-dashboard \ --dashboard-name my-dashboard \ --dashboard-body file://dashboard.json
その他の重要なAWSサービスのコマンド20選
VPC関連
# VPCの作成 aws ec2 create-vpc --cidr-block 10.0.0.0/16 # サブネットの作成 aws ec2 create-subnet \ --vpc-id vpc-12345678 \ --cidr-block 10.0.1.0/24 # インターネットゲートウェイの作成 aws ec2 create-internet-gateway # ルートテーブルの作成 aws ec2 create-route-table --vpc-id vpc-12345678
RDS関連
# DBインスタンスの作成 aws rds create-db-instance \ --db-instance-identifier mydb \ --db-instance-class db.t3.micro \ --engine mysql # スナップショットの作成 aws rds create-db-snapshot \ --db-instance-identifier mydb \ --db-snapshot-identifier mydb-snapshot # パラメータグループの変更 aws rds modify-db-parameter-group \ --db-parameter-group-name myparamgroup \ --parameters "ParameterName=max_connections,ParameterValue=250,ApplyMethod=immediate"
Lambda関連
# 関数の作成 aws lambda create-function \ --function-name my-function \ --runtime python3.9 \ --role arn:aws:iam::123456789012:role/lambda-role \ --handler index.handler \ --zip-file fileb://function.zip # 関数の呼び出し aws lambda invoke \ --function-name my-function \ --payload '{"key1": "value1"}' \ output.txt # 関数の更新 aws lambda update-function-code \ --function-name my-function \ --zip-file fileb://function.zip
ECSとEKS関連
# ECSクラスターの作成 aws ecs create-cluster --cluster-name my-cluster # タスク定義の登録 aws ecs register-task-definition \ --cli-input-json file://task-definition.json # サービスの作成 aws ecs create-service \ --cluster my-cluster \ --service-name my-service \ --task-definition my-task:1 \ --desired-count 2 # EKSクラスターの作成 aws eks create-cluster \ --name my-cluster \ --role-arn arn:aws:iam::123456789012:role/eks-cluster-role \ --resources-vpc-config subnetIds=subnet-12345678,subnet-87654321
各コマンドの詳細なオプションや使用例については、aws help
コマンドまたは各サービスのヘルプ(例:aws ec2 help
)で確認できます。また、より詳細な情報はAWS CLIのドキュメントを参照することをお勧めします。
AWS CLIコマンドの基本的な使い方
コマンドの基本構文を理解しよう
AWS CLIのコマンドは、以下の基本構文に従って構築されています:
aws <サービス名> <コマンド> [オプション] [引数]
基本構文の要素
- サービス名:
- EC2、S3、IAMなどのAWSサービスを指定
- 例:
aws ec2
、aws s3
、aws iam
- コマンド:
- 実行したい操作を指定
- 例:
describe-instances
、create-bucket
、list-users
- オプション:
- コマンドの動作をカスタマイズ
- 例:
--region
、--profile
、--output
- 引数:
- コマンドに必要なパラメータや値
- 例:インスタンスID、バケット名など
実践的な例
# EC2インスタンスの一覧を取得(東京リージョン指定) aws ec2 describe-instances --region ap-northeast-1 # 特定のプロファイルを使用してS3バケットを一覧表示 aws s3 ls --profile development # JSONフォーマットで出力を指定 aws iam list-users --output json
オプションとパラメータの指定方法
1. グローバルオプション
すべてのAWS CLIコマンドで使用できる主要なオプション:
# リージョンの指定 --region <リージョン名> # プロファイルの指定 --profile <プロファイル名> # 出力形式の指定 --output <json|yaml|text|table> # デバッグモード --debug # クエリ --query "<JMESPath式>"
2. パラメータの指定方法
- コマンドライン引数として指定:
# 単一の値 aws ec2 describe-instances --instance-ids i-1234567890abcdef0 # 複数の値 aws ec2 describe-instances --instance-ids i-1234567890abcdef0 i-abcdef1234567890 # キーと値のペア aws ec2 create-tags \ --resources i-1234567890abcdef0 \ --tags Key=Environment,Value=Production
- JSONファイルを使用:
# JSON形式のパラメータファイル(params.json) { "InstanceIds": ["i-1234567890abcdef0"], "DryRun": false } # ファイルを使用してコマンドを実行 aws ec2 describe-instances --cli-input-json file://params.json
- シェル変数の使用:
# 変数に値を格納 INSTANCE_ID="i-1234567890abcdef0" REGION="ap-northeast-1" # 変数を使用してコマンドを実行 aws ec2 describe-instances \ --instance-ids $INSTANCE_ID \ --region $REGION
出力形式の制御方法
AWS CLIは4つの出力形式をサポートしています:
1. JSON形式(デフォルト)
aws ec2 describe-instances --output json
出力例:
{ "Reservations": [ { "Instances": [ { "InstanceId": "i-1234567890abcdef0", "InstanceType": "t2.micro" } ] } ] }
2. YAML形式
aws ec2 describe-instances --output yaml
出力例:
Reservations: - Instances: - InstanceId: i-1234567890abcdef0 InstanceType: t2.micro
3. テキスト形式
aws ec2 describe-instances --output text
出力例:
INSTANCES i-1234567890abcdef0 t2.micro
4. テーブル形式
aws ec2 describe-instances --output table
出力例:
--------------------------------- | DescribeInstances | +---------------+---------------+ | InstanceId | InstanceType | +---------------+---------------+ | i-1234567890a | t2.micro | +---------------+---------------+
JMESPathを使用した出力のフィルタリング
--query
オプションを使用して、必要な情報のみを抽出できます:
# インスタンスIDとタイプのみを取得 aws ec2 describe-instances \ --query 'Reservations[].Instances[].[InstanceId,InstanceType]' \ --output table # 特定のタグを持つインスタンスのみをフィルタリング aws ec2 describe-instances \ --query 'Reservations[].Instances[?Tags[?Key==`Environment` && Value==`Production`]]' \ --output json
これらの基本的な使い方を理解することで、AWS CLIを効率的に活用できるようになります。次のセクションでは、より高度なテクニックについて解説します。
AWS CLI のプロテクニック
条件切り替えで複数環境を管理
1. プロファイルを使用した環境分離
# 開発環境用のプロファイル設定 aws configure --profile development # 本番環境用のプロファイル設定 aws configure --profile production # ~/.aws/config の設定例[profile development]
region = ap-northeast-1 output = json
[profile production]region = ap-northeast-1 output = json mfa_serial = arn:aws:iam::123456789012:mfa/user # プロファイル切り替えの使用例 aws s3 ls –profile development aws ec2 describe-instances –profile production
2. 環境変数による制御
# AWS認証情報の環境変数設定 export AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXX" export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" export AWS_DEFAULT_REGION="ap-northeast-1" export AWS_PROFILE="development" # シェルスクリプトでの環境切り替え例 #!/bin/bash if [ "$ENV" = "prod" ]; then export AWS_PROFILE="production" else export AWS_PROFILE="development" fi aws ec2 describe-instances
3. assumes(AWS認証情報の切り替えツール)の活用
# assumes のインストール pip install assumes # assumes の設定例[profile prod-admin]
role_arn = arn:aws:iam::123456789012:role/AdminRole source_profile = default mfa_serial = arn:aws:iam::123456789012:mfa/user # assumes を使用したロールの切り替え assumes prod-admin
JMESPathを使った出力の絞り込み
1. 基本的なフィルタリング
# 特定の属性の抽出 aws ec2 describe-instances \ --query 'Reservations[].Instances[].[InstanceId,State.Name,InstanceType]' \ --output table # 条件付きフィルタリング aws ec2 describe-instances \ --query 'Reservations[].Instances[?State.Name==`running`].[InstanceId,InstanceType]' \ --output json
2. 複雑な条件での絞り込み
# タグとステータスの組み合わせ aws ec2 describe-instances \ --query 'Reservations[].Instances[?Tags[?Key==`Environment` && Value==`Production`] && State.Name==`running`].[InstanceId,InstanceType]' \ --output table # ネストされた配列の処理 aws ec2 describe-security-groups \ --query 'SecurityGroups[].IpPermissions[?FromPort==`80` || FromPort==`443`].IpRanges[*].CidrIp' \ --output text
3. データ集計とソート
# インスタンスタイプごとの集計 aws ec2 describe-instances \ --query 'Reservations[].Instances[].InstanceType' \ --output text | sort | uniq -c # EBSボリュームのサイズ順ソート aws ec2 describe-volumes \ --query 'sort_by(Volumes, &Size)[*].[VolumeId,Size]' \ --output table
シェルスクリプトでの活用方法
1. 基本的なスクリプティング
#!/bin/bash # インスタンスの一括起動スクリプト INSTANCE_IDS=$(aws ec2 describe-instances \ --filters "Name=tag:Environment,Values=Production" \ --query 'Reservations[].Instances[?State.Name==`stopped`].[InstanceId]' \ --output text) for id in $INSTANCE_IDS; do echo "Starting instance: $id" aws ec2 start-instances --instance-ids "$id" done
2. エラーハンドリングの実装
#!/bin/bash # エラーハンドリング関数 handle_error() { echo "Error: $1" >&2 exit 1 } # S3バケットのバックアップスクリプト backup_bucket() { local source_bucket="$1" local backup_bucket="$2" # バケットの存在確認 aws s3 ls "s3://$source_bucket" &>/dev/null || \ handle_error "Source bucket does not exist: $source_bucket" # バックアップの実行 aws s3 sync "s3://$source_bucket" "s3://$backup_bucket" || \ handle_error "Backup failed" echo "Backup completed successfully" } backup_bucket "source-bucket" "backup-bucket"
3. 並列処理の実装
#!/bin/bash # 並列処理数の設定 MAX_PROCS=5 # インスタンスの一括処理 process_instance() { local instance_id="$1" echo "Processing instance: $instance_id" # インスタンス情報の取得 aws ec2 describe-instances --instance-ids "$instance_id" # タグの更新 aws ec2 create-tags \ --resources "$instance_id" \ --tags Key=LastChecked,Value="$(date +%Y-%m-%d)" } # インスタンスIDの取得 INSTANCE_IDS=$(aws ec2 describe-instances \ --query 'Reservations[].Instances[].[InstanceId]' \ --output text) # 並列処理の実行 for id in $INSTANCE_IDS; do ((i=i%MAX_PROCS)); ((i++==0)) && wait process_instance "$id" & done wait
これらのプロテクニックを活用することで、AWS CLIをより効率的に使用できます。次のセクションでは、トラブルシューティングについて解説します。
トラブルシューティング
よくあるエラーと対処法
1. 認証関連のエラー
- 認証情報が見つからない
# エラーメッセージ Unable to locate credentials. You can configure credentials by running "aws configure" # 対処方法 # 1. 認証情報の設定確認 aws configure list # 2. 環境変数の確認 echo $AWS_ACCESS_KEY_ID echo $AWS_SECRET_ACCESS_KEY echo $AWS_PROFILE # 3. 認証情報ファイルの確認 cat ~/.aws/credentials cat ~/.aws/config
- アクセス権限エラー
# エラーメッセージ An error occurred (AccessDenied) when calling the XXX operation: User is not authorized # 対処方法 # 1. 現在の認証情報で利用可能な権限を確認 aws iam get-user aws iam list-attached-user-policies --user-name YourUsername # 2. IAMポリシーシミュレータでの権限チェック aws iam simulate-principal-policy \ --policy-source-arn arn:aws:iam::123456789012:user/YourUsername \ --action-names s3:ListBucket
2. リージョン関連のエラー
# エラーメッセージ An error occurred (InvalidClientTokenId) when calling the XXX operation: The security token included in the request is invalid # 対処方法 # 1. 現在のリージョン設定の確認 aws configure get region # 2. リージョンの明示的な指定 aws ec2 describe-instances --region ap-northeast-1 # 3. デフォルトリージョンの設定 aws configure set region ap-northeast-1
3. パラメータ関連のエラー
# エラーメッセージ Parameter validation failed: Missing required parameter in input # 対処方法 # 1. ヘルプの確認 aws ec2 run-instances help # 2. 必須パラメータの確認 aws ec2 describe-instances --filters \ "Name=instance-type,Values=t2.micro" \ --query 'Reservations[].Instances[].InstanceId' # 3. JSON入力の検証 aws ec2 run-instances \ --cli-input-json file://params.json \ --debug
デバッグモードを使った問題解決
1. デバッグモードの基本
# デバッグモードの有効化 aws ec2 describe-instances --debug # デバッグ情報の出力先変更 aws ec2 describe-instances --debug 2>debug.log # 詳細なログレベルの設定 export AWS_DEBUG=true export AWS_CLI_DEBUG_COMMAND=true
2. デバッグ出力の解析
デバッグ出力には以下の重要な情報が含まれます:
- API呼び出しの詳細
2024-01-28 10:00:00,123 - MainThread - botocore.endpoint - DEBUG - Making request for OperationName with params: {parameters}
- リクエストヘッダー
2024-01-28 10:00:00,234 - MainThread - botocore.hooks - DEBUG - Event request-created.aws.ec2: { "request": { "url": "https://ec2.ap-northeast-1.amazonaws.com", "method": "POST", "headers": { "Authorization": "AWS4-HMAC-SHA256 ...", "X-Amz-Date": "20240128T100000Z" } } }
- レスポンス内容
2024-01-28 10:00:00,345 - MainThread - botocore.parsers - DEBUG - Response headers: { "x-amzn-RequestId": "12345678-1234-5678-1234-567812345678", "Content-Type": "application/xml", "Content-Length": "1234", "Date": "Sun, 28 Jan 2024 10:00:00 GMT" }
3. 問題解決のステップバイステップ
- エラーの特定
# エラーの再現と詳細な情報収集 aws ec2 describe-instances --debug 2>error.log # エラーメッセージの抽出 grep "ERROR" error.log
- リクエストの検証
# リクエストの詳細確認 grep "Making request" error.log # 認証情報の確認 grep "Authentication" error.log
- レスポンスの分析
# レスポンスコードの確認 grep "HTTP/1.1" error.log # エラーレスポンスの詳細確認 grep "Error Response" error.log
参考になるAWS公式ドキュメント
- AWS CLIドキュメント
- AWS APIリファレンス
- ベストプラクティス
これらのトラブルシューティング手法を活用することで、AWS CLIの問題を効率的に解決できます。