| name | aws-cli-expert |
| description | AWS CLIの専門家スキル。EC2, S3, IAM, Lambda, RDS, ECS等の主要サービスのCLI操作を支援。IAMポリシー設計、クロスアカウント運用、セキュリティ設定、コスト最適化のベストプラクティスを提供。Use when working with AWS services via CLI, designing IAM policies, managing infrastructure, or automating cloud operations. |
AWS CLI Expert
Overview
AWS CLIは、Amazon Web Servicesの200以上のサービスをコマンドラインから操作するための公式ツールです。このスキルは、企業環境で頻出するサービスのCLI操作、IAMポリシー設計、セキュリティベストプラクティスを提供します。
When to Use This Skill
このスキルを使用するタイミング:
- AWS CLIコマンドの構文を知りたい
- IAMポリシーやロールを設計・確認したい
- EC2、S3、Lambdaなどのリソースを管理したい
- クロスアカウントアクセスを設定したい
- セキュリティ設定を確認・強化したい
- AWS操作を自動化したい
Example triggers:
- "EC2インスタンスの一覧を取得するコマンドは?"
- "S3バケットのパブリックアクセスを確認したい"
- "IAMロールでクロスアカウントアクセスを設定したい"
- "Lambda関数のログを確認したい"
- "セキュリティグループのインバウンドルールを確認したい"
Output
このスキルは会話形式のガイダンスを提供します。ファイル生成は行いません。
- AWS CLIコマンドの構文と使用例
- IAMポリシー/ロールの設計アドバイス
- セキュリティ設定の推奨事項
- トラブルシューティングの手順
Workflow
- 要件の確認: ユーザーが実行したい操作を特定
- 認証状態の確認: 必要に応じて
aws sts get-caller-identity で確認を推奨
- コマンド提供: 目的に応じたCLIコマンドを提示
- オプション説明: --query, --output, --profile などのオプションを解説
- セキュリティ考慮: 必要に応じてセキュリティベストプラクティスを提示
Prerequisites
Installation
brew install awscli
pip install awscli
aws --version
Authentication Setup
aws configure
aws configure --profile <profile-name>
Profile Management
aws s3 ls
aws s3 ls --profile production
export AWS_PROFILE=production
aws s3 ls
Core Services
1. IAM (Identity and Access Management)
ユーザー管理:
aws iam list-users
aws iam get-user --user-name <username>
aws iam create-user --user-name <username>
aws iam create-access-key --user-name <username>
aws iam list-access-keys --user-name <username>
aws iam list-mfa-devices --user-name <username>
ロール管理:
aws iam list-roles
aws iam get-role --role-name <role-name>
aws iam get-role --role-name <role-name> --query 'Role.AssumeRolePolicyDocument'
aws iam list-attached-role-policies --role-name <role-name>
ポリシー管理:
aws iam list-policies --scope Local
aws iam get-policy-version --policy-arn <arn> --version-id v1
aws iam attach-user-policy --user-name <user> --policy-arn <arn>
aws iam attach-role-policy --role-name <role> --policy-arn <arn>
AssumeRole (クロスアカウント/ロール切り替え):
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/RoleName \
--role-session-name MySession
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/RoleName \
--role-session-name MySession \
--serial-number arn:aws:iam::111111111111:mfa/user \
--token-code 123456
eval $(aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/RoleName \
--role-session-name MySession \
--query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
--output text | \
awk '{print "export AWS_ACCESS_KEY_ID="$1" AWS_SECRET_ACCESS_KEY="$2" AWS_SESSION_TOKEN="$3}')
2. EC2 (Elastic Compute Cloud)
インスタンス管理:
aws ec2 describe-instances \
--query 'Reservations[].Instances[].[InstanceId,State.Name,InstanceType,Tags[?Key==`Name`].Value|[0]]' \
--output table
aws ec2 describe-instances \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].[InstanceId,PrivateIpAddress,Tags[?Key==`Name`].Value|[0]]' \
--output table
aws ec2 start-instances --instance-ids i-1234567890abcdef0
aws ec2 stop-instances --instance-ids i-1234567890abcdef0
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0
セキュリティグループ:
aws ec2 describe-security-groups \
--query 'SecurityGroups[].[GroupId,GroupName,Description]' \
--output table
aws ec2 describe-security-groups \
--group-ids sg-12345678 \
--query 'SecurityGroups[].IpPermissions'
aws ec2 describe-security-groups \
--query 'SecurityGroups[?IpPermissions[?IpRanges[?CidrIp==`0.0.0.0/0`]]].[GroupId,GroupName]' \
--output table
aws ec2 authorize-security-group-ingress \
--group-id sg-12345678 \
--protocol tcp \
--port 443 \
--cidr 10.0.0.0/8
VPC:
aws ec2 describe-vpcs \
--query 'Vpcs[].[VpcId,CidrBlock,Tags[?Key==`Name`].Value|[0]]' \
--output table
aws ec2 describe-subnets \
--query 'Subnets[].[SubnetId,VpcId,CidrBlock,AvailabilityZone]' \
--output table
3. S3 (Simple Storage Service)
基本操作:
aws s3 ls
aws s3 ls s3://bucket-name/
aws s3 ls s3://bucket-name/ --recursive --human-readable --summarize
aws s3 cp file.txt s3://bucket-name/
aws s3 sync ./local-dir s3://bucket-name/prefix/
aws s3 rm s3://bucket-name/file.txt
aws s3 rm s3://bucket-name/ --recursive
バケットポリシー・セキュリティ:
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-public-access-block --bucket <bucket-name>
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-bucket-encryption --bucket <bucket-name>
aws s3api get-bucket-versioning --bucket <bucket-name>
aws s3api put-public-access-block \
--bucket <bucket-name> \
--public-access-block-configuration \
"BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true"
4. Lambda
関数管理:
aws lambda list-functions \
--query 'Functions[].[FunctionName,Runtime,LastModified]' \
--output table
aws lambda get-function --function-name <function-name>
aws lambda get-function-configuration --function-name <function-name>
aws lambda invoke \
--function-name <function-name> \
--payload '{"key": "value"}' \
output.json
aws lambda invoke \
--function-name <function-name> \
--invocation-type Event \
--payload '{"key": "value"}' \
output.json
ログ確認:
aws logs describe-log-groups \
--query 'logGroups[].[logGroupName,storedBytes]' \
--output table
aws logs tail /aws/lambda/<function-name> --follow
aws logs tail /aws/lambda/<function-name> --since 1h
aws logs filter-log-events \
--log-group-name /aws/lambda/<function-name> \
--filter-pattern "ERROR"
5. RDS (Relational Database Service)
aws rds describe-db-instances \
--query 'DBInstances[].[DBInstanceIdentifier,DBInstanceClass,Engine,DBInstanceStatus]' \
--output table
aws rds describe-db-instances --db-instance-identifier <instance-id>
aws rds describe-db-snapshots \
--query 'DBSnapshots[].[DBSnapshotIdentifier,DBInstanceIdentifier,SnapshotCreateTime]' \
--output table
aws rds create-db-snapshot \
--db-instance-identifier <instance-id> \
--db-snapshot-identifier <snapshot-name>
6. ECS (Elastic Container Service)
aws ecs list-clusters
aws ecs list-services --cluster <cluster-name>
aws ecs list-tasks --cluster <cluster-name>
aws ecs describe-services \
--cluster <cluster-name> \
--services <service-name>
aws ecs list-task-definitions
aws ecs update-service \
--cluster <cluster-name> \
--service <service-name> \
--force-new-deployment
7. CloudWatch
メトリクス:
aws cloudwatch list-metrics --namespace AWS/EC2
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-02T00:00:00Z \
--period 3600 \
--statistics Average
アラーム:
aws cloudwatch describe-alarms \
--query 'MetricAlarms[].[AlarmName,StateValue,MetricName]' \
--output table
aws cloudwatch describe-alarms --state-value ALARM
8. CloudFormation
aws cloudformation list-stacks \
--query 'StackSummaries[?StackStatus!=`DELETE_COMPLETE`].[StackName,StackStatus,CreationTime]' \
--output table
aws cloudformation describe-stacks --stack-name <stack-name>
aws cloudformation describe-stack-events \
--stack-name <stack-name> \
--query 'StackEvents[].[Timestamp,ResourceStatus,ResourceType,LogicalResourceId]' \
--output table
aws cloudformation create-stack \
--stack-name <stack-name> \
--template-body file://template.yaml \
--capabilities CAPABILITY_IAM
aws cloudformation update-stack \
--stack-name <stack-name> \
--template-body file://template.yaml \
--capabilities CAPABILITY_IAM
aws cloudformation delete-stack --stack-name <stack-name>
Authentication Patterns
1. Profile-based (開発環境)
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[production]
aws_access_key_id = AKIAYYYYYYYYYYYYYYYY
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
[default]
region = ap-northeast-1
output = json
[profile production]
region = us-east-1
output = json
2. SSO / IAM Identity Center
aws configure sso
aws sso login --profile <sso-profile>
[profile sso-dev]
sso_start_url = https://my-company.awsapps.com/start
sso_region = us-east-1
sso_account_id = 123456789012
sso_role_name = DeveloperAccess
region = ap-northeast-1
3. AssumeRole (クロスアカウント)
[profile cross-account]
role_arn = arn:aws:iam::123456789012:role/CrossAccountRole
source_profile = default
region = ap-northeast-1
[profile cross-account-mfa]
role_arn = arn:aws:iam::123456789012:role/CrossAccountRole
source_profile = default
mfa_serial = arn:aws:iam::111111111111:mfa/username
region = ap-northeast-1
4. 環境変数
export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_SESSION_TOKEN=xxxxxxxx
Common Patterns
JSON Output with jq
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[].InstanceId'
aws iam list-users --output json | jq '.Users[] | select(.UserName | startswith("admin"))'
aws lambda list-functions --output json | jq '.Functions[] | {name: .FunctionName, runtime: .Runtime}'
Batch Operations
aws ec2 stop-instances --instance-ids i-111 i-222 i-333
aws ec2 describe-instances \
--filters "Name=tag:Environment,Values=development" \
--query 'Reservations[].Instances[].InstanceId' \
--output text | xargs aws ec2 stop-instances --instance-ids
Pagination
aws s3api list-objects-v2 --bucket <bucket>
aws s3api list-objects-v2 --bucket <bucket> --max-items 100 --starting-token <token>
Troubleshooting
認証エラー
aws sts get-caller-identity
aws configure list-profiles
aws configure list
アクセス拒否
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:user/username \
--action-names s3:GetObject \
--resource-arns arn:aws:s3:::bucket-name/*
デバッグ
aws s3 ls --debug
aws s3 ls --debug 2>&1 | grep -A 5 "Response body"
Resources
詳細なガイドは以下のリファレンスを参照:
references/aws_cli_essentials.md - CLIの基本操作とベストプラクティス
references/iam_guide.md - IAMの詳細ガイド
references/security_best_practices.md - セキュリティベストプラクティス
Tips
- --query を活用: JMESPathで必要なフィールドだけ抽出
- --output table: 人間が読むときはtable形式が見やすい
- --dry-run: EC2操作は --dry-run で事前確認
- プロファイル分離: 本番/開発環境はプロファイルで分離
- MFA必須: 本番環境へのアクセスはMFA必須に
- CloudTrail確認: 操作ログはCloudTrailで監査可能