📝

CDK で Kendra 入門してみた

に公開

aws-cdk-lib.aws_kendra module · AWS CDK
CDK で以下を作成して Kendra で検索を試してみました。

  • S3 バケット
  • Kendra インデックス
  • Kendra の S3 コネクター

前提

  • 開発環境: Cloud9 (Amazon Linux 2023)

1. CDK プロジェクト作成

$ mkdir -p ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
$ npm install -g typescript
$ mkdir kendra-learning-project
$ cd kendra-learning-project
$ cdk init app --language typescript

2. コード作成

kendra-learning-project-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as kendra from 'aws-cdk-lib/aws-kendra';
import * as iam from 'aws-cdk-lib/aws-iam';

export class KendraLearningProjectStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const documentBucket = new s3.Bucket(this, 'KendraDocumentBucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      autoDeleteObjects: true,
    });

    const kendraIndexRole = new iam.Role(this, 'KendraIndexRole', {
      assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'),
    });

    kendraIndexRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['cloudwatch:PutMetricData'],
      resources: ['*'],
      conditions: {
        StringEquals: {
          'cloudwatch:namespace': 'AWS/Kendra'
        }
      }
    }));

    kendraIndexRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['logs:DescribeLogGroups'],
      resources: ['*'],
    }));

    kendraIndexRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['logs:CreateLogGroup'],
      resources: [`arn:aws:logs:${this.region}:${this.account}:log-group:/aws/kendra/*`],
    }));

    kendraIndexRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: [
        'logs:DescribeLogStreams',
        'logs:CreateLogStream',
        'logs:PutLogEvents'
      ],
      resources: [`arn:aws:logs:${this.region}:${this.account}:log-group:/aws/kendra/*:log-stream:*`],
    }));

    const kendraIndex = new kendra.CfnIndex(this, 'KendraIndex', {
      name: 'my-kendra-index',
      edition: 'DEVELOPER_EDITION',
      roleArn: kendraIndexRole.roleArn,
    });

    const kendraDataSourceRole = new iam.Role(this, 'KendraDataSourceRole', {
      assumedBy: new iam.ServicePrincipal('kendra.amazonaws.com'),
    });

    kendraDataSourceRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['s3:GetObject'],
      resources: [`${documentBucket.bucketArn}/*`],
    }));

    kendraDataSourceRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: ['s3:ListBucket'],
      resources: [documentBucket.bucketArn],
    }));

    kendraDataSourceRole.addToPolicy(new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: [
        'kendra:BatchPutDocument',
        'kendra:BatchDeleteDocument'
      ],
      resources: [kendraIndex.attrArn],
    }));

    const kendraDataSource = new kendra.CfnDataSource(this, 'KendraS3DataSource', {
      name: 'my-s3-data-source',
      indexId: kendraIndex.attrId,
      type: 'S3',
      roleArn: kendraDataSourceRole.roleArn,
      dataSourceConfiguration: {
        s3Configuration: {
          bucketName: documentBucket.bucketName,
        },
      },
    });
  }
}

3. デプロイ

$ cdk deploy

4. S3 バケットにドキュメントをアップロード

CDK で作成した S3 バケットに以下のテキストファイルをアップロードしました。

document01.txt
Amazon Kendra is an intelligent search service powered by machine learning.
Kendra enables developers to add search capabilities to their applications.

5. Kendra で同期

Kendra コンソールのデータソースから Sync now をクリックして S3 バケットのドキュメントを取り込みます。

6. Kendra で検索

同期が完了すれば検索できます。

AWS CLI では以下のコマンドで検索可能です。

$ aws kendra query --index-id your-index-id --query-text "machine learning"

Kendra コンソールでは Search indexed content から検索可能です。

料金に関する注意点

Amazon Kendra の料金 - Amazon Web Services
Amazon Kendra のインデックスでは Basic Developer Edition でも 1 時間あたり 1.125 USD の料金が発生します。
そのため、検証が完了したら削除することをおすすめします。

CDK で作成した場合には以下のコマンドで削除可能です。

$ cdk destroy

まとめ

今回は CDK で Kendra 入門してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion