Amazon NeptuneでJupyterNotebookを利用したいときの権限等まとめ

記事タイトルとURLをコピーする

こんにちは、篠﨑です。

これまでAmazon Neptuneでデータの操作をするブログを書いてきましたが、 今回は、Amazon Neptuneでデータ操作をする際に必要な権限とセキュリティグループについてまとめていきたいと思います。

はじめに

今回やりたいことは以下2点です。

  • JupyterNotebookを利用してAmazon Neptuneに接続すること
  • Amazon NeptuneにS3からデータをロードすること

基本的に最小権限での操作権限で設定しますが、できるだけAWS Managed Policyを利用していきます。

必要なポリシー

JupyterNotebookを開く

読み込み権限

今回はAWS Managed Policyを利用するため、以下ポリシーを選択します。

  • NeptuneReadOnlyAccess

また、上記ポリシーではNotebookInstanceのリストができないため、下記権限を持つポリシーを作成します。

  • ListNotebookInstances

以下ポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListNotebookInstances",
            "Effect": "Allow",
            "Action": "sagemaker:ListNotebookInstances",
            "Resource": "*"
        }
    ]
}

書き込み権限

次にJupyterNotebookのノートブックを開く権限を付与します。 NotebookはAmazon Sagemakerのサービスのため、下記アクションの権限を探す際にはAmazon Sagemakerから探してください。

  • CreatePresignedNotebookInstanceUrl

S3からデータをロードする

EC2を用いてS3からAmazon Neptuneにデータをロードする場合、以下三点に注意します。

  • Amazon Neptuneに付与するセキュリティグループ
  • Amazon Neptuneに付与するIAM Role
  • S3バケットにデータを入れるIAM ユーザー

尚、S3バケットにEC2からアクセスするため、インターネット利用ができない場合はS3のVPC Endpointを利用してください。

Amazon Neptuneに付与するセキュリティグループ

EC2から以下のようなコマンドを利用してAmazon Neptuneにデータをロードします。

curl -X POST \
    -H 'Content-Type: application/json' \
    https://{database_identifier}-instance-1.*********.{region_id}.neptune.amazonaws.com:8182/loader -d '
    {
      "source" : "s3://{bucket_name}/sample/Data.csv",
      "format" : "csv",
      "iamRoleArn" : "arn:aws:iam::999999999999:role/RoleArn",
      "region" : "{region_id}",
      "failOnError" : "FALSE",
      "parallelism" : "MEDIUM",
      "updateSingleCardinalityProperties" : "FALSE",
      "queueRequest" : "TRUE"
    }'

そのため、Amazon Neptune側でアクセス許可をするセキュリティグループを作成します。

セキュリティグループで開けるポートは8182ポートです。 Amazon NeptuneにアクセスするEC2等のIPアドレスもしくはセキュリティグループを許可してください。

Amazon Neptuneに付与するIAM Role

S3の閲覧権限が必要となります。 そのため、AWSマネージドのAmazonS3ReadOnlyAccessポリシーを付与したロールを準備します。

また、利用するサービスはAmazon Neptuneなのですが、信頼関係はRDSを選択します

信頼関係のポリシーは以下の通りです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

S3バケットにデータを入れるIAM ユーザー

特定のバケット「sample_bucket」にデータを入れることとし、オブジェクトの配置、削除、オブジェクトの取得、オブジェクトの閲覧を許可します。 今回はAWSマネジメントコンソールからデータの挿入することも考慮し、以下のように設定しています。

以下ポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::sample_bucket/*",
                "arn:aws:s3:::sample_bucket"
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        }
    ]
}

おわりに

以上がAmazon Neptuneを使うときの権限等のまとめかなと思います。 Amazon Neptuneに付与するロールがRDSなのが驚きでした。

また何かあれば書こうと思います!

篠﨑 勇輔(書いた記事を見る)

クラウドインテグレーション部 SRE2課

入社2年目