GAS(Google Apps Script)でAWS Bedrockを使ってみる

先日、AWS Bedrockの正式リリースが行われました🎉。現在、多数の企業がGoogle Workspaceを導入しているため、GAS(Google Apps Script)が業務プロセスにおいて頻繁に利用されていることでしょう。その中で、GASとAWS Bedrockの連携を希望する声もあるのではないでしょうか。実際、弊社でも「GASからBedrockを活用したい」との意見が出ていましたが、「具体的な利用方法が不明」という課題も浮上していました。それに対応するため、利用方法に関する調査を進めてみました。

前提

既にBedrockのBase modelsを使用することが出来る状態であることを想定しています。設定の変更はAmazon Bedrock Model accessから行えます。また使用するregionはus-west-2(オレゴン)、モデルはClaude v2です。


IAMユーザの作成

まずは、Bedrockを使用することのできるユーザを作成していきます。

まだAWS管理のポリシーは用意されていないので、以下のポリシーを作成してユーザに追加します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BedrockInvokeModel",
            "Effect": "Allow",
            "Action": "bedrock:InvokeModel",
            "Resource": "arn:aws:bedrock:*::foundation-model/*"
        }
    ]
}
ユーザが作成できたら[セキュリティ認証情報]タブから、アクセスキーを作成ボタンを押して、アクセスキーとシークレットアクセスキーを取得します。ここで取得したキーは後程使いますので、メモ帳にメモをするなり、csvファイルをダウンロードするなりして忘れないようにしてください。



GASプロジェクトの作成

GASプロジェクトを新規に作成します。作成後は左のバーにある設定からスクリプトプロパティの設定を行っていきます。そして、先ほど取得したキーをそれぞれ、「ACCESS_KEY」と「SECRET_ACCESS_KEY」という名前で保存します。


aws-apps-script

AWSが提供しているサービスのAPIを叩く際に必要な認証周りを自前で実装するのは骨が折れるので、いい感じのライブラリを探していた所、[GitHub]aws-apps-scriptのレポジトリを見つけました。

READMEを読んだところ、aws.jsをGASのプロジェクト内に設置し、AWS.init()でアクセスキーとシークレットアクセスキーを設定した後、AWS.request()でAWSのAPIを呼べるようです。request関数に渡す引数は以下のようなものとなっています。

AWS.request(
  service,
  region,
  action,
  params={},
  method='GET',
  payload='',
  headers={"Host": GeneratedHost, "X-Amz-Date": GeneratedX-Amz-Date, "X-Amz-Target": action},
  uri='/'
)

これとaws.jsのソースコード、Bedrock API Referenceを参考にした結果、以下のような引数を渡せば良いということが分かりました。

AWS.request(
  'bedrock',
  'us-west-2',
  '',
  {},
  'POST',
  {
    "prompt": "Human: s3について説明して\nAssistant:",
    "max_tokens_to_sample": 500,
    "temperature": 1,
    "top_k": 250,
    "top_p": 0.999,
    "stop_sequences": ["\n\nHuman:"],
    "anthropic_version": "bedrock-2023-05-31"
  },
  { 'Content-Type': 'application/json' },
  uri='/model/anthropic.claude-v2/invoke'
)

動作確認

最終的な全体のコードは以下の通りです。

const ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('ACCESS_KEY')
const SECRET_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('SECRET_ACCESS_KEY')

function awsBedrockTest() {
  AWS.init(ACCESS_KEY, SECRET_ACCESS_KEY)

  const body = {
    "prompt": "Human: s3について説明して\nAssistant:",
    "max_tokens_to_sample": 500,
    "temperature": 1,
    "top_k": 250,
    "top_p": 0.999,
    "stop_sequences": ["\n\nHuman:"],
    "anthropic_version": "bedrock-2023-05-31"
  }

  const res = AWS.request(
    'bedrock',
    'us-west-2',
    '',
    {},
    'POST',
    body,
    { 'Content-Type': 'application/json' },
    uri='/model/anthropic.claude-v2/invoke'
  )

  console.log(JSON.parse(res.getContentText())['completion'])
}

実際にGASで実行した結果が以下のものです。正常に実行できており、S3についての説明を返してくれています。



Bedrockが正式にリリースされたとのことで、GASからの利用方法を検証してみました。結果として、無事に使えることが確認でき、安心しました。BedrockではFine-tuningしたカスタムモデルも利用可能とのことなので、次にはBedrockでのFine-tuningに挑戦しようと思っています。
また、これまでGASからS3以外のAWSサービスを使った経験がなかったのですが、今回の経験を通じて、GASから各種AWSサービスをどのように利用するかの手がかりが得られて良かったです。
Next Post Previous Post