👥

AWS CDKでBedrockにアクセスできるIAMグループを作成する

に公開

Claude for Workに移行して使わなくなりましたが、以前はBedrock経由でClaudeにアクセスできるようにAWS CDKでIAMグループを作成していたのでその設定を備忘録として残しておきます。
現時点で最新のClaude Sonnet 4.5のモデルに対応しています。

モデルアクセスの有効化

前提としてAWSコンソールでバージニア北部リージョンに移動し、BedrockのモデルカタログからClaude Sonnet 4.5のモデルアクセスを有効化しておきます。

ちなみにモデルアクセスは将来的に廃止されるのでそのうちここの手順は不要になると思います。

IAMグループの作成

下記のスタックを定義してデプロイし、AWSコンソールでIAMユーザーにIAMグループをアタッチします。
これでIAMユーザーはBedrockにアクセスできるようになります。
管理が面倒なので使用モデルは縛っていませんが、IAMユーザーが自分でアクセスキーを発行することを想定したIAMポリシーとなっています。
MFA設定しないと自身のIAM設定以外アクセスできないようになっているのでご注意ください。

iam-group.ts
import { Stack, StackProps } from 'aws-cdk-lib'
import { Effect, Group, ManagedPolicy, PolicyStatement } from 'aws-cdk-lib/aws-iam'
import { Construct } from 'constructs'

interface IamGroupStackProps extends StackProps {}

export class IamGroupStack extends Stack {
  readonly selfManagePolicy: ManagedPolicy
  readonly bedrockExecutePolicy: ManagedPolicy
  readonly bedrockExecuteGroup: Group

  constructor(scope: Construct, id: string, props: IamGroupStackProps) {
    super(scope, id, props)

    // IAMユーザー自身の操作を許可するIAMポリシー
    this.selfManagePolicy = new ManagedPolicy(this, 'SelfManagePolicy', {
      statements: [
        // IAMユーザー自身を設定するアクションを許可する。
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: [
            'iam:GetUser',
            'iam:ChangePassword',
            'iam:GetLoginProfile',
            'iam:UpdateLoginProfile',
            'iam:CreateAccessKey',
            'iam:UpdateAccessKey',
            'iam:DeleteAccessKey',
            'iam:ListAccessKeys',
            'iam:GetAccessKeyLastUsed',
            'iam:TagUser',
            'iam:UntagUser',
          ],
          resources: ['arn:aws:iam::*:user/${aws:username}'],
        }),
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: ['iam:ListUsers'],
          resources: ['*'],
        }),
        // MFAデバイスを設定するアクションを許可する。
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: ['iam:CreateVirtualMFADevice'],
          resources: ['arn:aws:iam::*:mfa/*'],
        }),
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: ['iam:EnableMFADevice', 'iam:GetMFADevice', 'iam:ListMFADevices', 'iam:ResyncMFADevice'],
          resources: ['arn:aws:iam::*:user/${aws:username}'],
        }),
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: ['iam:DeactivateMFADevice'],
          resources: ['arn:aws:iam::*:user/${aws:username}'],
          conditions: {
            BoolIfExists: {
              'aws:MultiFactorAuthPresent': 'true',
            },
          },
        }),
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: ['iam:ListVirtualMFADevices'],
          resources: ['*'],
        }),
        // MFAが設定されていない場合は、一部例外を除き全てのアクションを拒否する。
        new PolicyStatement({
          effect: Effect.DENY,
          notActions: [
            'iam:GetUser',
            'iam:ChangePassword',
            'iam:GetLoginProfile',
            'iam:UpdateLoginProfile',
            'iam:ListUsers',
            'iam:CreateVirtualMFADevice',
            'iam:EnableMFADevice',
            'iam:GetMFADevice',
            'iam:ListMFADevices',
            'iam:ListVirtualMFADevices',
            'iam:ResyncMFADevice',
            'bedrock:InvokeModel',
            'bedrock:InvokeModelWithResponseStream',
          ],
          resources: ['*'],
          conditions: {
            BoolIfExists: {
              'aws:MultiFactorAuthPresent': 'false',
            },
          },
        }),
      ],
    })

    // Bedrockの実行を許可するIAMポリシー
    this.bedrockExecutePolicy = new ManagedPolicy(this, 'BedrockExecutePolicy', {
      statements: [
        new PolicyStatement({
          effect: Effect.ALLOW,
          actions: ['bedrock:InvokeModel', 'bedrock:InvokeModelWithResponseStream'],
          resources: ['*'],
        }),
      ],
    })

    // Bedrock実行用のIAMグループ
    this.bedrockExecuteGroup = new Group(this, 'BedrockExecuteGroup', {
      managedPolicies: [
        ManagedPolicy.fromAwsManagedPolicyName('ReadOnlyAccess'),
        this.selfManagePolicy,
        this.bedrockExecutePolicy,
      ],
    })
  }
}

Claude CodeをBedrock経由で使用する

Claude Codeで使用する人が多いと思うので記載しておきます。
AWSのプロファイル設定が前提ですが、direnvもしくはシェルの設定ファイルなどで下記の環境変数を読みこめばClaude CodeをBedrock経由で使用できるようになります。

export AWS_PROFILE='xxxxx' # AWSのプロファイル名
export AWS_REGION='us-east-1' # AWSのリージョン
export CLAUDE_CODE_USE_BEDROCK=1 # Bedrock経由で使用するフラグ
export ANTHROPIC_MODEL='anthropic.claude-sonnet-4-5-20250929-v1:0' # 使用するモデル

statusコマンドを実行し、API Providerが「AWS Bedrock」になっていれば認証OKです。

ラッコ株式会社

Discussion