0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[AWS] DynamoDBとOpenSearch Serverlessを連携する

Posted at

事前準備

  1. DynamoDBテーブルの作成

    • オンデマンドのテーブルを作成しておきます。テーブル名をopensearch-sampleパーティションキー名はpkとしました
    • DynamoDBのインテグレーションというメニューを開き、そこからポイントインタイムリカバリ (PITR) と DynamoDB ストリーム を有効にします
      image.png
  2. S3バケットの作成

    • テーブルの内容をExportするためのS3バケットを用意しておきます。バケット名をopensearch-sample-20240409としました

本作業

  1. IAM Policyの作成
    公式ドキュメントを参考にPolicyを作ります。アカウントID、DynamoDBテーブル名およびS3バケット名を先ほど作成したものに差し替えてください。ポリシー名はopensearch-dynamodb-pipelineとしました

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "allowRunExportJob",
                "Effect": "Allow",
                "Action": [
                    "dynamodb:DescribeTable",
                    "dynamodb:DescribeContinuousBackups",
                    "dynamodb:ExportTableToPointInTime"
                ],
                "Resource": [
                    "arn:aws:dynamodb:us-east-1:{account-id}:table/opensearch-sample"
                ]
            },
            {
                "Sid": "allowCheckExportjob",
                "Effect": "Allow",
                "Action": [
                    "dynamodb:DescribeExport"
                ],
                "Resource": [
                    "arn:aws:dynamodb:us-east-1:{account-id}:table/opensearch-sample/export/*"
                ]
            },
            {
                "Sid": "allowReadFromStream",
                "Effect": "Allow",
                "Action": [
                    "dynamodb:DescribeStream",
                    "dynamodb:GetRecords",
                    "dynamodb:GetShardIterator"
                ],
                "Resource": [
                    "arn:aws:dynamodb:us-east-1:{account-id}:table/opensearch-sample/stream/*"
                ]
            },
            {
                "Sid": "allowReadAndWriteToS3ForExport",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:AbortMultipartUpload",
                    "s3:PutObject",
                    "s3:PutObjectAcl"
                ],
                "Resource": [
                    "arn:aws:s3:::opensearch-sample-20240409/export/*"
                ]
            }
        ]
    }
    
  2. IAM Roleの作成

    • 信頼されたエンティティからカスタム信頼ポリシーを選択し、以下の内容をコピペします
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "osis-pipelines.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      
    • 先ほど作成したポリシーopensearch-dynamodb-pipelineをアタッチしてロールを作成します。ロール名はopensearch-serverless-roleとしました
  3. OpenSearch Serverless コレクションの作成

    • コレクションの作成
      コレクション名はopensearch-serverlessとしました
      image.png

    • IAM Policyの作成
      公式ドキュメントを参考にPipelineが後で作成するOpenSearch ServerlessコレクションにアクセスするためのPolicyを作成します。ポリシー名はopensearch-accessとしました

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Action": [
                      "aoss:BatchGetCollection",
                      "aoss:APIAccessAll"
                  ],
                  "Effect": "Allow",
                  "Resource": "arn:aws:aoss:ap-northeast-1:{your-account-id}:collection/*"
              },
              {
                  "Action": [
                      "aoss:CreateSecurityPolicy",
                      "aoss:GetSecurityPolicy",
                      "aoss:UpdateSecurityPolicy"
                  ],
                  "Effect": "Allow",
                  "Resource": "*",
                  "Condition": {
                      "StringEquals": {
                          "aoss:collection": "opensearch-serverless-sample"
                      }
                  }
              }
          ]
      }
      
    • IAMロールopensearch-dynamodb-pipelineへのポリシーopensearch-accessのアタッチ

  4. データアクセスポリシーの設定
    データアクセスポリシーが自動作成されるため、プリンシパルに今回作成したIAMロールを追加する必要があります
    データアクセスポリシーにopensearch-serverless-roleを追加して保存してください

  5. Pipelineの構築
    AWS-DynamoDBChangeDataCapturePipelineをブループリントに組み立てていきます

    version: "2"
    dynamodb-pipeline:
      source:
        dynamodb:
          acknowledgments: true
          tables:
            - table_arn: "arn:aws:dynamodb:ap-northeast-1:{account-id}:table/opensearch-sample"
              stream:
                start_position: "LATEST"
              export:
                s3_bucket: "opensearch-sample-20240409"
                s3_region: "ap-northeast-1"
                s3_prefix: "export/"
          aws:
             sts_role_arn: "arn:aws:iam::{account-id}:role/opensearch-serverless-role"
             region: "ap-northeast-1"
      sink:
        - opensearch:
            # 先ほど作成したOpenSearch Serverless コレクションのEndopoint
            hosts: [ "<<https://search-mydomain-1a2a3a4a5a6a7a8a9a0a9a8a7a.us-east-1.es.amazonaws.com>>" ]
            index: "table-index"
            index_type: custom
            document_id: "${getMetadata(\"primary_key\")}"
            action: "${getMetadata(\"opensearch_action\")}"
            document_version: "${getMetadata(\"document_version\")}"
            document_version_type: "external"
            aws:
              sts_role_arn: "arn:aws:iam::{account-id}:role/opensearch-serverless-role"
              region: "ap-northeast-1"
              # サーバーレスの場合の設定
              serverless: true
    
    
  6. 作成完了まで待ちます
    image.png

  7. Indexができています
    image.png

ハマりポイント

  • IAMの権限設定が難しいです。とくにS3の出力先フォルダ(Prefix)名、リージョンを確認する。
  • aoss:BatchGetCollectionはcollectionのIDを指定してもだめなので、*でリソースを限定しない
  • パイプラインの設定を変えた後反映されない場合、一度停止してから再開する(時間はかかる)
  • Dashboardにアクセスできない場合、ネットワークポリシーからダッシュボードアクセスに許可を与える
  • CloudWatchに出力されるログが読みにくいが、どのリソースでエラーがでているかはわかるので、都度IAMまわり見直す
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?