🔐
AWS IAM権限の確認方法:デプロイ前に必ずチェックすべきポイント
はじめに
AWSでインフラをデプロイする際、最も重要なのは適切なIAM権限があることを事前に確認することです。権限不足でデプロイが失敗すると、時間の無駄になるだけでなく、セキュリティリスクにも繋がります。
本記事では、実際のプロジェクト(Slack AI Email Assistant)での経験を基に、IAM権限の確認方法を実践的に解説します。
なぜIAM権限の事前確認が重要なのか
よくある失敗パターン
# Terraformデプロイ中に発生する典型的なエラー
Error: creating Lambda Function: AccessDenied: User: arn:aws:iam::123456789012:user/developer is not authorized to perform: lambda:CreateFunction
このようなエラーが発生すると:
- デプロイが途中で止まる
- 部分的に作成されたリソースのクリーンアップが必要
- 時間とコストの無駄
事前確認のメリット
- ✅ デプロイ時間の短縮
- ✅ セキュリティリスクの軽減
- ✅ コストの最適化
- ✅ チーム開発での権限問題の早期発見
IAM権限確認の実践手順
1. 現在の認証情報の確認
まず、どのユーザーでAWSにアクセスしているかを確認します。
aws sts get-caller-identity
期待される出力例:
{
"UserId": "AIDARLWERPWG5TQK572GV",
"Account": "093827726733",
"Arn": "arn:aws:iam::093827726733:user/YourUsername"
}
確認ポイント:
- 正しいアカウントIDか
- 期待するユーザー名か
- リージョンが適切か
2. アタッチされたポリシーの確認
ユーザーにアタッチされているポリシーを確認します。
aws iam list-attached-user-policies --user-name YourUsername
出力例:
{
"AttachedPolicies": [
{
"PolicyName": "AdministratorAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
},
{
"PolicyName": "IAMFullAccess",
"PolicyArn": "arn:aws:iam::aws:policy/IAMFullAccess"
}
]
}
確認ポイント:
- 必要な権限が含まれているか
- 過剰な権限がないか(セキュリティ観点)
3. AWS設定の確認
AWS CLIの設定を確認します。
aws configure list
出力例:
Name Value Type Location
---- ----- Type Location
profile <not set> None None
access_key ****************GH5X shared-credentials-file
secret_key ****************VRJK shared-credentials-file
region ap-northeast-1 config-file ~/.aws/config
確認ポイント:
- 正しいリージョンが設定されているか
- プロファイルが適切に設定されているか
4. サービス別アクセステスト
実際に各AWSサービスにアクセスできるかテストします。
S3アクセステスト
aws s3 ls
DynamoDBアクセステスト
aws dynamodb list-tables
Lambdaアクセステスト
aws lambda list-functions --max-items 5
Secrets Managerアクセステスト
aws secretsmanager list-secrets --max-items 5
SESアクセステスト
aws ses describe-configuration-set --configuration-set-name test
各テストで確認すべきこと:
- エラーが発生しないか
- 期待するリソースが表示されるか
- 権限不足のエラーがないか
プロジェクト別の必要権限
Terraformプロジェクトの場合
Terraformでデプロイする場合、以下の権限が必要です:
必須権限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*",
"dynamodb:*",
"lambda:*",
"iam:*",
"apigateway:*",
"ses:*",
"secretsmanager:*",
"cloudwatch:*",
"sqs:*"
],
"Resource": "*"
}
]
}
最小権限(推奨)
本番環境では、最小権限の原則に従い、必要な権限のみを付与します:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::your-terraform-state-bucket",
"arn:aws:s3:::your-terraform-state-bucket/*"
]
},
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:region:account:table/your-terraform-locks-table"
}
]
}
権限確認の自動化
スクリプト化による効率化
権限確認を自動化するスクリプトを作成しましょう:
#!/bin/bash
# check-iam-permissions.sh
set -e
echo "🔍 AWS IAM権限確認を開始します..."
# 1. 認証情報確認
echo "📋 認証情報を確認中..."
aws sts get-caller-identity
# 2. 設定確認
echo "⚙️ AWS設定を確認中..."
aws configure list
# 3. サービスアクセステスト
echo "🧪 サービスアクセステストを実行中..."
services=("s3" "dynamodb" "lambda" "secretsmanager" "ses" "iam")
for service in "${services[@]}"; do
echo " - $service をテスト中..."
case $service in
"s3")
aws s3 ls > /dev/null 2>&1 && echo " ✅ S3: OK" || echo " ❌ S3: NG"
;;
"dynamodb")
aws dynamodb list-tables > /dev/null 2>&1 && echo " ✅ DynamoDB: OK" || echo " ❌ DynamoDB: NG"
;;
"lambda")
aws lambda list-functions --max-items 1 > /dev/null 2>&1 && echo " ✅ Lambda: OK" || echo " ❌ Lambda: NG"
;;
"secretsmanager")
aws secretsmanager list-secrets --max-items 1 > /dev/null 2>&1 && echo " ✅ Secrets Manager: OK" || echo " ❌ Secrets Manager: NG"
;;
"ses")
aws ses get-send-quota > /dev/null 2>&1 && echo " ✅ SES: OK" || echo " ❌ SES: NG"
;;
"iam")
aws iam list-users --max-items 1 > /dev/null 2>&1 && echo " ✅ IAM: OK" || echo " ❌ IAM: NG"
;;
esac
done
echo "🎉 IAM権限確認が完了しました!"
CI/CDパイプラインでの権限確認
GitHub Actionsで権限確認を自動化:
name: Check IAM Permissions
on:
pull_request:
branches: [main, develop]
jobs:
check-permissions:
runs-on: ubuntu-latest
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Check IAM permissions
run: |
echo "🔍 Checking AWS IAM permissions..."
# 認証情報確認
aws sts get-caller-identity
# サービスアクセステスト
aws s3 ls
aws dynamodb list-tables
aws lambda list-functions --max-items 1
aws secretsmanager list-secrets --max-items 1
echo "✅ All permission checks passed!"
トラブルシューティング
よくあるエラーと対処法
1. AccessDenied エラー
Error: AccessDenied: User is not authorized to perform: lambda:CreateFunction
対処法:
- IAMポリシーに必要な権限が含まれているか確認
- リソースのARNが正しいか確認
- 条件付きポリシーがないか確認
2. InvalidUserID.NotFound エラー
Error: InvalidUserID.NotFound: The user with name YourUsername cannot be found
対処法:
- ユーザー名が正しいか確認
- 正しいAWSアカウントにアクセスしているか確認
3. TokenExpired エラー
Error: The security token included in the request is expired
対処法:
- AWS認証情報を更新
- 一時的な認証情報の場合は再取得
権限不足の解決方法
1. 管理者に権限追加を依頼
# 必要な権限を明確に伝える
echo "以下の権限が必要です:"
echo "- lambda:CreateFunction"
echo "- lambda:UpdateFunctionCode"
echo "- iam:CreateRole"
echo "- iam:AttachRolePolicy"
2. 最小権限ポリシーの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:CreateFunction",
"lambda:UpdateFunctionCode",
"lambda:GetFunction"
],
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:your-function-name"
}
]
}
セキュリティのベストプラクティス
1. 最小権限の原則
- 必要最小限の権限のみを付与
- 定期的な権限の見直し
- 不要な権限の削除
2. 権限の分離
- 開発環境と本番環境で異なる権限
- ロールベースのアクセス制御
- 一時的な権限の使用
3. 監査とログ
- CloudTrailでのアクセスログ監視
- 定期的な権限の監査
- 異常なアクセスパターンの検出
まとめ
IAM権限の事前確認は、AWSでの開発・運用において必須の作業です。本記事で紹介した手順に従うことで:
- ✅ デプロイ失敗のリスクを大幅に削減
- ✅ セキュリティリスクの軽減
- ✅ 開発効率の向上
- ✅ チーム開発での権限問題の早期発見
が実現できます。
特に、TerraformなどのInfrastructure as Codeを使用する場合は、権限確認を自動化することで、より安全で効率的な開発が可能になります。
参考リンク
この記事が役に立ったら、ぜひいいねやフォローをお願いします!
Discussion