マルチサービスアプリケーションロールのIAMポリシー

S3、DynamoDB、SQS、Secrets Manager、CloudWatch Logsにアクセスする典型的なサーバーレスアプリケーション向けの包括的なIAMポリシーを作成します。

Advanced Patterns

詳細な説明

マルチサービスアプリケーションロール

実際のアプリケーションが1つのAWSサービスだけを必要とすることはまれです。典型的なサーバーレスバックエンドはDynamoDBへの読み書き、S3へのファイルアップロード、SQSへのメッセージ送信、シークレットの読み取り、ログの書き込みを行うかもしれません。このポリシーは複数のサービス権限を単一のロールポリシーに統合します。

ポリシーJSON

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DynamoDBAccess",
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:UpdateItem",
        "dynamodb:DeleteItem",
        "dynamodb:Query"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/users",
        "arn:aws:dynamodb:us-east-1:123456789012:table/users/index/*"
      ]
    },
    {
      "Sid": "S3ObjectAccess",
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": "arn:aws:s3:::myapp-uploads/*"
    },
    {
      "Sid": "SQSSendMessages",
      "Effect": "Allow",
      "Action": ["sqs:SendMessage", "sqs:GetQueueUrl"],
      "Resource": "arn:aws:sqs:us-east-1:123456789012:myapp-processing-queue"
    },
    {
      "Sid": "SecretsRead",
      "Effect": "Allow",
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:myapp/*"
    },
    {
      "Sid": "CloudWatchLogs",
      "Effect": "Allow",
      "Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/myapp-*:*"
    }
  ]
}

設計原則

  1. サービスごとに1つのSid — どのサービスにアクセスしているかを監査しやすくします。
  2. 特定のリソースARN — AWSが必要とする場合を除き"*"ワイルドカードなし。
  3. 最小限のアクション — アプリケーションが実際に使用する操作のみ。
  4. 管理アクションなし — インフラ自体のCreateDeleteDescribeなし。

ユースケース

サーバーレスバックエンド(Lambda + API Gateway)、コンテナ化されたマイクロサービス(ECS/EKS)、単一の実行コンテキストで複数のAWSサービスと対話するアプリケーション。

試してみる — AWS IAM Policy Generator

フルツールを開く