継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

VPC 内で起動する OpenSearch Serverless を AWS CLI で構築する

タダです.

先日 GA した OpenSearch Serverless を検証する機会があり,そのために AWS CLI で構築作業をやったのでそこで学んだことをこの記事にまとめます.なお,やることのベースは下記ドキュメントを参考にしています.

docs.aws.amazon.com

OpenSearch Serverless を VPC に展開するために必要な作業一覧

OpenSearch Serverless を VPC 内に展開するためには次の作業を行います.

  • VPC エンドポイントの作成・・・ VPC 内に OpenSearch Serverless を展開するのに必要です
  • ネットワークポリシーの作成・・・OpenSearch Serverless やダッシュボードにネットワーク的にアクセスを制御するのに必要です
  • 暗号化ポリシーの作成・・・暗号化をするために必要です
  • OpenSearch Serverless にアクセス可能な IAM ロール及び IAM ポリシーの設定・・・OpenSearch Serverless 似アクセスするAWS リソースに付与する IAM 権限を設定するのに必要です
  • データアクセスポリシーの作成・・・OpenSearch のインデックスやエイリアスなどサーバー内のデータにアクセス制御するのに必要です
  • コレクションの作成・・・OpenSearch Serverless の本体です

また,AWS CLI は次のバージョンを使用します.

$aws --version                                                                                                                                                            
aws-cli/2.11.11 Python/3.11.2 Darwin/22.4.0 source/arm64 prompt/off

VPC エンドポイントの作成

まずは VPC エンドポイントの作成を行います.VPC エンドポイントは VPC につき1つあればよいです.

aws opensearchserverless create-vpc-endpoint \
--name hoge-endpoint \
--subnet-ids "subnet-id-xxx" "subnet-id-xxx" \
--vpc-id vpc-id-xxx \
--security-group-ids sg-xxx

{
    "createVpcEndpointDetail": {
        "id": "vpce-xxxx",
        "name": "hoge-endpoint",
        "status": "PENDING"
    }
}

関連情報

awscli.amazonaws.com

ネットワークポリシーの作成

次にネットワークポリシーを作ります.ここでは1つ前に作った VPC エンドポイント経由での Opensearch Serverlss コレクションとダッシュボードへのアクセス許可し,パブリックからのアクセス許可を拒否するようにしています.

$aws opensearchserverless create-security-policy --name hoge-policy --type network \
  --policy "[{\"Rules\":[{\"ResourceType\":\"dashboard\",\"Resource\":[\"collection\/hoge\"]},{\"ResourceType\":\"collection\",\"Resource\":[\"collection\/hoge\"]}],\"AllowFromPublic\":false, \"SourceVPCEs\":[\"vpce-xxx\"]}]"
{
    "securityPolicyDetail": {
        "createdDate": 1683953455909,
        "lastModifiedDate": 1683953455909,
        "name": "hoge-policy",
        "policy": [
            {
                "Rules": [
                    {
                        "Resource": [
                            "collection/hoge"
                        ],
                        "ResourceType": "dashboard"
                    },
                    {
                        "Resource": [
                            "collection/hoge"
                        ],
                        "ResourceType": "collection"
                    }
                ],
                "AllowFromPublic": false,
                "SourceVPCEs": [
                    "vpce-xxx"
                ]
            }
        ],
        "policyVersion": "MTY4Mzk1MzQ1NTkwOV8x",
        "type": "network"
    }
}

関連情報

awscli.amazonaws.com

暗号化ポリシーの作成

OpenSearch Serverless の保管中のデータを暗号化したいため,KMS による暗号を有効化します.どの OpenSearch Serverless コレクションで暗号化を行うか,どの KMS を使うかをポリシーで制御します.

aws opensearchserverless create-security-policy \
  --name hoge-policy \
  --type encryption --policy "{\"Rules\":[{\"ResourceType\":\"collection\",\"Resource\":[\"collection\/hoge\"]}],\"AWSOwnedKey\":false,\"KmsARN\":\"arn:aws:encryption:ap-northeast-1:123456789012:key\/93fd6da4-a317-4c17-bfe9-382b5d988b36\"}"

{
    "securityPolicyDetail": {
        "createdDate": 1683953801971,
        "lastModifiedDate": 1683953801971,
        "name": "hoge-policy",
        "policy": {
            "KmsARN": "arn:aws:encryption:ap-northeast-1:123456789012:key\/93fd6da4-a317-4c17-bfe9-382b5d988b36",
            "Rules": [
                {
                    "Resource": [
                        "collection/hoge"
                    ],
                    "ResourceType": "collection"
                }
            ],
            "AWSOwnedKey": false
        },
        "policyVersion": "MTY4Mzk1MzgwMTk3MV8x",
        "type": "encryption"
    }
}

関連情報

awscli.amazonaws.com

OpenSearch Serverless にアクセス可能な IAM ロール及び IAM ポリシーの設定

後述するデータアクセスポリシーで,インデックスやエイリアスにアクセスできる IAM ロールを制御します.そのための IAM ロールと OpenSearch Severless 自体に対する IAM ポリシーを設定します.ドキュメントに最低限の IAM ポリシーがあったので基本はこれでいいと思うんですが,検証を進めていくと1つエラーが発生して追加して次のようなポリシーにしました.

IAM ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Resource": "*",
            "Effect": "Allow",
            "Action": [
                "aoss:ListCollections",
                "aoss:BatchGetCollection",
                "aoss:ListAccessPolicies",
                "aoss:ListSecurityConfigs",
                "aoss:ListSecurityPolicies",
                "aoss:ListTagsForResource",
                "aoss:APIAccessAll",
                "aoss:ListVpcEndpoints",
                "aoss:GetAccessPolicy",
                "aoss:GetAccountSettings",
                "aoss:GetSecurityConfig",
                "aoss:GetSecurityPolicy"
            ]
        }
    ]
}

発生したエラー文

{"status":403,"request-id":"xxx-xxx-xxx-xxx-xxxxxx","error":{"reason":"User: arn:aws:sts::123456789012:assumed-role/EC2Role/i-xxx is not authorized to perform: aoss:APIAccessAll because no identity-based policy allows the aoss:APIAccessAll action","type":"AccessDenied"}}

それを AWS CLI で実行すると以下のようになります.この例では EC2 の IAM ロールに作ったポリシーをアタッチしています.

aws iam create-policy \
  --policy-name hogePolicy \
  --policy-document "{\"Version\": \"2012-10-17\",\"Statement\": [{\"Action\": [\"aoss:ListCollections\",\"aoss:BatchGetCollection\",\"aoss:CreateCollection\",\"aoss:CreateSecurityPolicy\",\"aoss:GetSecurityPolicy\",\"aoss:ListSecurityPolicies\",\"aoss:CreateAccessPolicy\",\"aoss:GetAccessPolicy\",\"aoss:APIAccessAll\",\"aoss:ListAccessPolicies\"],\"Effect\": \"Allow\",\"Resource\": \"*\"}]}"

aws iam attach-role-policy \
  --role-name EC2Role \
  --policy-arn arn:aws:iam::123456789012:policy/hogePolicy

データアクセスポリシーの作成

そしてデータアクセスポリシーを作っていきます.個人的に OpenSearch Serverless を使う上で一番制御をこだわる設定と思います.中のデータへのアクセス制御になるためです.今回はドキュメントにあるデータ書き込みにおける最低限の権限をつけました.hoge コレクションのhoge-index というインデックス に対する書き込み権限です.他にもドキュメントに細かな OpenSearch への操作ごとの権限が載っているので,必要なものを適宜を足しましょう.

aws opensearchserverless create-access-policy \
  --name hoge-policy \
  --type data \
  --policy "[{\"Rules\":[{\"ResourceType\":\"index\",\"Resource\":[\"index\/hoge\/hoge-index\"],\"Permission\":[\"aoss:CreateIndex\",\"aoss:WriteDocument\",\"aoss:UpdateIndex\"]}],\"Principal\":[\"arn:aws:iam::123456789012:role\/EC2Role\"]}]"

{
    "accessPolicyDetail": {
        "createdDate": 1683956136929,
        "lastModifiedDate": 1683956136929,
        "name": "hoge-policy",
        "policy": [
            {
                "Rules": [
                    {
                        "Resource": [
                            "index/hoge/hoge-index"
                        ],
                        "Permission": [
                            "aoss:CreateIndex",
                            "aoss:WriteDocument",
                            "aoss:UpdateIndex"
                        ],
                        "ResourceType": "index"
                    }
                ],
                "Principal": [
                    "arn:aws:iam::130459222683:role/EC2Role"
                ]
            }
        ],
        "policyVersion": "MTY4Mzk1NjEzNjkyOV8x",
        "type": "data"
    }
}

関連情報

docs.aws.amazon.com

docs.aws.amazon.com

コレクションの作成

最期に OpenSearch Severless 本体を作ります.コマンドはシンプルなものですが,これまで作ってきた各種アクセスポリシー制御で指定したコレクションの設定を見て,自動で当ててくれるためその点は楽です.

aws opensearchserverless create-collection --name hoge --type SEARCH

    "createCollectionDetail": {
        "arn": "arn:aws:aoss:ap-northeast-1:130459222683:collection/xxx",
        "createdDate": 1683956357789,
        "id": "d94lmt0suxz525b4g2n2",
        "kmsKeyArn": "arn:aws:kms:ap-northeast-1:130459222683:key/037ba436-3ce5-4258-8738-b6f14c3bc740",
        "lastModifiedDate": 1683956357789,
        "name": "hoge",
        "status": "CREATING",
        "type": "SEARCH"
    }
}

まとめ

OpenSearch Severless を構築すrの2本記事では AWS CLI で構築を行いましたが,CloudFormation の対応はされており,Terraform は2023年5月13日時点で対応しておらず,issue や PR は出ているがマージされてない状況です.マージされるのを心待ちにしています...!

docs.aws.amazon.com

github.com