🔐

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