CloudFormationの変更内容をBedrockに要約してもらう

# はじめに

近年生成AIが開発の中でも活用されているケースが多くなってきました。
今回はAWSが提供するBedrockを使って、GitHubで管理しているCloudFormationの変更内容の要約をPull Requestに記載するワークフローを実現したいと思います。

# 対応方法

ここから実際の手順を紹介します。

## Bedrockを有効化

まずはAWSアカウントでBedrockのモデルを有効化します。
今回はそれぞれ以下のモデルをAWSコンソールから有効化します。

- Light Model: Claude 3.5 Haiku(anthropic.claude-3-5-haiku-20241022-v1:0)
- Heavy Model: Claude 3.5 Sonnet v2(anthropic.claude-3-5-sonnet-20241022-v2:0)

## GitHub Actionsから実行できるIAMロールを作成

次にGitHubリポジトリからBedrockのモデルを実行できる（bedrock:InvokeModel）IAMロールを作成します。
CloudFormationテンプレートを記載していますのでぜひ参考にしてください。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'PR Summary by Bedrock'
Parameters:
  GitHubOrganizationName:
    Type: 'String'
    Description: 'GitHub Organization Name'
  GitHubRepositoryName:
    Type: 'String'
    Description: 'GitHub Repository Name'
Resources:
  IAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'pr-summary-by-bedrock-role'
      AssumeRolePolicyDocument:
        Statement:
          - Effect: 'Allow'
            Action: 'sts:AssumeRoleWithWebIdentity'
            Principal:
              Federated: !Sub 'arn:${AWS::Partition}:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com'
            Condition:
              StringLike:
                token.actions.githubusercontent.com:sub: !Sub 'repo:${GitHubOrganizationName}/${GitHubRepositoryName}:*'
      Policies:
        - PolicyName: 'pr-summary-by-bedrock-policy'
          PolicyDocument:
            Statement:
              - Action:
                  - 'bedrock:InvokeModel'
                Effect: 'Allow'
                Resource: '*'
```

## GitHub Actionsのワークフローを追加

次は該当のGitHubリポジトリにGitHub Actionsのワークフローを追加します。
今回は公開されている [tmokmss/bedrock-pr-reviewer](https://github.com/tmokmss/bedrock-pr-reviewer) を利用します。
その際、defaultではyamlファイルは除外されているため、個別での設定が必要となります。
各自のプロジェクトに合わせてpath_filtersの変更をお願いします。

```yaml
name: PR Summary by Bedrock

permissions:
  id-token: write
  contents: read
  pull-requests: write

on:
  pull_request:
  pull_request_review_comment:
    types: [created]

concurrency:
  group:
    ${{ github.repository }}-${{ github.event.number || github.head_ref ||
    github.sha }}-${{ github.workflow }}-${{ github.event_name ==
    'pull_request_review_comment' && 'pr_comment' || 'pr' }}
  cancel-in-progress: ${{ github.event_name != 'pull_request_review_comment' }}

env:
  AWS_IAM_ROLE_ARN: arn:aws:iam::123456789012:role/pr-summary-by-bedrock-role
  AWS_REGION: ap-northeast-1
  CODE_REVIEW_LIGHT_MODEL: anthropic.claude-3-5-haiku-20241022-v1:0
  CODE_REVIEW_HEAVY_MODEL: anthropic.claude-3-5-sonnet-20241022-v2:0

jobs:
  review:
    runs-on: ubuntu-latest
    if: >-
      ${{
        github.event_name != 'pull_request_review_comment' || github.event.comment.in_reply_to_id != null
      }}
    steps:
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ env.AWS_IAM_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}
      - name: PR review
        uses: tmokmss/bedrock-pr-reviewer@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          debug: false
          review_simple_changes: false
          review_comment_lgtm: false
          language: ja-JP
          disable_review: true
          disable_release_notes: false
          bedrock_light_model: ${{ env.CODE_REVIEW_LIGHT_MODEL }}
          bedrock_heavy_model: ${{ env.CODE_REVIEW_HEAVY_MODEL }}
          path_filters: |
            !**/dist/**
            !**/*.tfstate
            !**/package-lock.json
```

# 動作確認

実際にPull Requestをあげると以下のようなリリースノートがDescription欄に自記載されていることを確認します。
![Screenshot 2024-12-04 21.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146076/b3da8e3d-4e21-c8fd-7120-1e7999c74a5d.png)

# おわりに

以上、今回はAmazon Bedrockを使ってCloudFormationの変更内容の要約をPull Requestに記載する仕組みをご紹介しました。
Bedrockでの変更内容の要約検討されている方の参考になれば幸いです。