はじめに
こんばんは、mirukyです。
今回は、AWS CLIを使いこなすための第一歩として、インストールの方法や実務で使用するコマンドまで、自分がこれまでに使用したものを中心にご紹介します。
目次
1.AWS CLIとは
2.インストール方法
3.初期設定方法
4.S3の操作
5.EC2の操作
6.IAMの操作
7.CloudWatch Logsの確認
8.Lambdaの操作
9.知っておくと便利なテクニック
10.終わりに
AWS CLIとは
AWSのサービスをターミナル(コマンドライン)から操作するためのツールです。
コンソールでやることは基本的に全部CLIでもできます。
加えて、コマンドを組み合わせることでバッチ処理もでき、シェルスクリプトにまとめておくことで同じ作業を何度でも再現できます。
コンソール上での手動に比べて、再現性が高い、という点が個人的にはポイントです。
インフラ作業の自動化の第一歩ですね。
インストール方法
macOS
# Homebrewが入っていれば一発
brew install awscli
# もしくは公式のpkgインストーラーを使う
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
Windows
公式のMSIインストーラーをダウンロードして実行するのが一番楽です。
# wingetが使えるなら
winget install Amazon.AWSCLI
Linux
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 ...
バージョンが表示されればOK。
初期設定方法
IAMユーザーの作成
CLIで使うIAMユーザーをまだ作ってない場合は、マネジメントコンソールで作成してください。この時、アクセスキーIDとシークレットアクセスキーを控えておく必要があります。
注意: ルートアカウントのアクセスキーは絶対に使わないでください。権限が強すぎて危険です。必要な権限だけ付けたIAMユーザーを作りましょう。
AWSの現在のベストプラクティスでは、IAMユーザーの長期アクセスキーよりもIAM Identity Center(旧AWS SSO)による一時的な認証情報の使用が推奨されています。
# IAM Identity Centerを使う場合
aws configure sso
本記事ではわかりやすさを優先してアクセスキー方式を紹介していますが、チームや組織で利用する場合はIAM Identity Centerの導入を検討してください。
aws configure
aws configure
対話形式で聞かれるので、順番に入力します。
AWS Access Key ID [None]: [アクセスキーID]
AWS Secret Access Key [None]:[シークレットアクセスキー]
Default region name [None]: ap-northeast-1
Default output format [None]: json
リージョンは東京リージョン(ap-northeast-1)にしておくのが日本で使う場合は無難です。出力形式はjsonが扱いやすいですが、tableにすると見やすくなるので好みで。
設定した内容は ~/.aws/credentials と ~/.aws/config に保存されます。
# 確認
cat ~/.aws/credentials
cat ~/.aws/config
プロファイルの使い分け
開発環境と本番環境でアカウントが分かれてる場合、プロファイルを使い分けます。
実務ではほぼ必須です。
# 開発用のプロファイルを設定
aws configure --profile dev
# 本番用のプロファイルを設定
aws configure --profile prod
使う時は --profile オプションを付けるか、環境変数で指定します。
# オプションで指定
aws s3 ls --profile dev
# 環境変数で指定(この後のコマンドは全部このプロファイルが使われる)
export AWS_PROFILE=dev
aws s3 ls
自分はシェルの設定ファイルにエイリアスを書いて切り替えてます。
# .bashrc や .zshrc に追記
alias aws-dev='export AWS_PROFILE=dev && echo "Switched to dev"'
alias aws-prod='export AWS_PROFILE=prod && echo "Switched to prod"'
S3の操作
S3はCLIと相性が良く、ファイルの転送は圧倒的にCLIの方が速いです。
バケットの操作
バケット名はAWS全体で一意である必要があります。
my-bucket-20260222は例なので、実際には自分だけのユニークな名前を付けてください。
# バケット一覧を表示
aws s3 ls
# バケットを作成
aws s3 mb s3://my-bucket-20260222
# バケットを削除(中身が空の場合のみ)
aws s3 rb s3://my-bucket-20260222
# バケットを強制削除(中身ごと消える。本番では慎重に!)
aws s3 rb s3://my-bucket-20260222 --force
ファイルのアップロード・ダウンロード
# ファイルをアップロード
aws s3 cp ./myfile.txt s3://my-bucket/myfile.txt
# ファイルをダウンロード
aws s3 cp s3://my-bucket/myfile.txt ./myfile.txt
# ディレクトリごと再帰的にアップロード
aws s3 cp ./local-dir/ s3://my-bucket/remote-dir/ --recursive
# sync(差分だけ転送してくれるので、大量ファイルの時はcpよりこっち)
aws s3 sync ./local-dir/ s3://my-bucket/remote-dir/
# ドライラン(実際には転送せずに、何が転送されるか確認)
aws s3 sync ./local-dir/ s3://my-bucket/remote-dir/ --dryrun
syncコマンドは本当によく使います。
デプロイスクリプトに仕込んだり、バックアップ処理に使ったりしています。
--deleteオプションを付けると、ローカルにないファイルはS3側からも消えるので注意してください。
# ミラーリング(S3側の余分なファイルも消す)
aws s3 sync ./local-dir/ s3://my-bucket/remote-dir/ --delete
バケット内のオブジェクト一覧
# バケットの中身を一覧
aws s3 ls s3://my-bucket/
# 再帰的に全部見る
aws s3 ls s3://my-bucket/ --recursive
# 特定のプレフィックスで絞り込み
aws s3 ls s3://my-bucket/logs/2026/02/
プリサインドURL
一時的にS3のオブジェクトにアクセスさせたい時に使います。有効期限付きのURLを生成できます。
CloudFrontやAPI Gatewayと組み合わせて良く使われている印象があります。
# 1時間有効なダウンロードURLを発行
aws s3 presign s3://my-bucket/secret-file.pdf --expires-in 3600
EC2の操作
インスタンスの一覧表示
# 全インスタンスを表示
aws ec2 describe-instances
# ただしこれだと情報量が多すぎるので、jqで必要な情報だけ抜く
aws ec2 describe-instances \
--query 'Reservations[].Instances[].{
ID: InstanceId,
Type: InstanceType,
State: State.Name,
Name: Tags[?Key==`Name`].Value | [0],
PrivateIP: PrivateIpAddress
}' \
--output table
--queryオプションはJMESPathという構文で、JSONの中から必要な部分だけ抽出できます。
欲しい情報が決まっている時は、ぜひ使ってみてください。
インスタンスの起動・停止
# 停止
aws ec2 stop-instances --instance-ids [インスタンスID]
# 起動
aws ec2 start-instances --instance-ids [インスタンスID]
# 複数台まとめて操作
aws ec2 stop-instances --instance-ids [インスタンスID1] [インスタンスID2] [インスタンスID3]
開発環境のインスタンスを夜間止めてコスト削減、はcronで実行できます。
#!/bin/bash
# stop-dev-instances.sh
# 毎日21時にcronで実行
INSTANCE_IDS=$(aws ec2 describe-instances \
--filters "Name=tag:Environment,Values=dev" "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].InstanceId' \
--output text)
if [ -n "$INSTANCE_IDS" ]; then
aws ec2 stop-instances --instance-ids $INSTANCE_IDS
echo "Stopped: $INSTANCE_IDS"
else
echo "No running dev instances found."
fi
セキュリティグループの確認
# セキュリティグループの一覧
aws ec2 describe-security-groups \
--query 'SecurityGroups[].{
ID: GroupId,
Name: GroupName,
VPC: VpcId
}' \
--output table
# 特定のセキュリティグループのインバウンドルールを確認
aws ec2 describe-security-groups \
--group-ids sg-0123456789abcdef0 \
--query 'SecurityGroups[].IpPermissions[].{
Protocol: IpProtocol,
FromPort: FromPort,
ToPort: ToPort,
Source: IpRanges[].CidrIp
}'
コンソール上で確認するのも良いですが、慣れるとCLIでの確認の方が楽に感じます。
IAMの操作
ユーザー・ロールの確認
# IAMユーザー一覧
aws iam list-users --query 'Users[].{Name: UserName, Created: CreateDate}' --output table
# IAMロール一覧
aws iam list-roles --query 'Roles[].{Name: RoleName, Arn: Arn}' --output table
# 特定のユーザーにアタッチされたポリシーを確認
aws iam list-attached-user-policies --user-name taro
# 特定のユーザーが所属するグループを確認
aws iam list-groups-for-user --user-name taro
アクセスキーのローテーション
セキュリティ的に定期的なローテーションは大事です。
# 現在のアクセスキーを確認
aws iam list-access-keys --user-name [IAMユーザー名]
# 新しいアクセスキーを作成
aws iam create-access-key --user-name [IAMユーザー名]
# 古いアクセスキーを無効化
aws iam update-access-key --user-name [IAMユーザー名] \
--access-key-id [アクセスキーID] \
--status Inactive
# 古いアクセスキーを削除(無効化して問題ないことを確認してから)
aws iam delete-access-key --user-name [IAMユーザー名] \
--access-key-id [アクセスキーID]
CloudWatch Logsの確認
ログの確認もCLIでできます。
特に「直近のエラーログだけ見たい」場合に便利です。
# ロググループ一覧
aws logs describe-log-groups \
--query 'logGroups[].logGroupName'
# 特定のロググループのログストリーム一覧(最新5件)
aws logs describe-log-streams \
--log-group-name /ecs/my-app \
--order-by LastEventTime \
--descending \
--limit 5 \
--query 'logStreams[].logStreamName'
# ログイベントを取得
aws logs get-log-events \
--log-group-name /ecs/my-app \
--log-stream-name "ecs/my-app/abcdef123456" \
--limit 50 \
--query 'events[].{Time: timestamp, Message: message}'
# filter-log-eventsで特定のパターンを検索
# Linux
aws logs filter-log-events \
--log-group-name /ecs/my-app \
--filter-pattern "ERROR" \
--start-time $(date -d '1 hour ago' +%s)000 \
--query 'events[].{Time: timestamp, Message: message}'
# macOS(macOSの date コマンドは -d オプションに対応していないため)
aws logs filter-log-events \
--log-group-name /ecs/my-app \
--filter-pattern "ERROR" \
--start-time $(date -v-1H +%s)000 \
--query 'events[].{Time: timestamp, Message: message}'
Lambdaの操作
# Lambda関数の一覧
aws lambda list-functions \
--query 'Functions[].{Name: FunctionName, Runtime: Runtime, Memory: MemorySize}' \
--output table
# 関数を手動で実行
# --cli-binary-format はAWS CLI v2で必要なオプション(v1では不要)
aws lambda invoke \
--function-name my-function \
--payload '{"key": "value"}' \
--cli-binary-format raw-in-base64-out \
output.json
# 実行結果を確認
cat output.json
# 関数のコードをzipでデプロイ
zip -r function.zip .
aws lambda update-function-code \
--function-name my-function \
--zip-file fileb://function.zip
知っておくと便利なテクニック
--queryと--outputの組み合わせ
# JSONで出力(デフォルト)
aws ec2 describe-instances --output json
# テーブルで出力(見やすい)
aws ec2 describe-instances --output table
# テキストで出力(シェルスクリプトで値を拾いたい時)
aws ec2 describe-instances \
--query 'Reservations[].Instances[].InstanceId' \
--output text
--filtersで絞り込み
# Nameタグが"web-server"のインスタンスだけ表示
aws ec2 describe-instances \
--filters "Name=tag:Name,Values=web-server"
# running状態のインスタンスだけ表示
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running"
# 複数条件のAND
aws ec2 describe-instances \
--filters \
"Name=tag:Environment,Values=production" \
"Name=instance-state-name,Values=running"
jqとの組み合わせ
--queryでも十分ですが、複雑な加工をしたい時はjqの方が柔軟に使えます。
# jqで整形
aws ec2 describe-instances | jq '.Reservations[].Instances[] | {
id: .InstanceId,
type: .InstanceType,
state: .State.Name,
name: (.Tags // [] | map(select(.Key == "Name")) | .[0].Value // "N/A")
}'
waiterで待機
「インスタンスが起動するまで待ちたい」みたいな時に使います。
# インスタンスがrunningになるまで待機
aws ec2 start-instances --instance-ids i-0123456789abcdef0
aws ec2 wait instance-running --instance-ids i-0123456789abcdef0
echo "インスタンスが起動しました"
スクリプトの中で「次の処理に進む前にリソースが準備できるのを待つ」みたいな時に役立ちます。
STSで現在の認証情報を確認
「今使っているアカウント」を確認する際に使います。
実務では非常に良く使います。
事故防止のために、定期的に実行することをおすすめします。
aws sts get-caller-identity
{
"UserId": "AIDAIOSFODNN7EXAMPLE",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/taro"
}
終わりに
AWS CLIは最初とっつきにくいかもしれませんが、一度覚えてしまうとかなり効率よく作業できるようになります。
特にS3のファイル操作と、EC2のインスタンス管理は、CLIの方が圧倒的に効率が良いと思います。
最初は aws s3 ls であったり、 aws ec2 describe-instances 辺りから試してみて、徐々にスクリプトに組み込んでいく、みたいな流れで進めると良いと思います。
全部のコマンドを覚える必要はないです。困った時に公式リファレンスを引ける力があれば十分だと思います。
自分も全ては覚えていられないので、毎回ドキュメントを確認しています(笑)。
英語なので、Chromeの自動翻訳機能などを使って見ると良いです。
この記事が誰かの役に立てば嬉しいです。
では、またお会いしましょう。