Amazon DynamoDB用 NoSQL Workbenchでsession tokenを使って接続してみた

2020.03.27

Amazon DynamoDB用 NoSQL Workbenchが、先日一般公開(GA)されたので色々試しています。

Amazon DynamoDB 用 NoSQL Workbench が一般公開されます。

個人的にはスイッチロールしてアクセスできるのかがすごく気になったので試してみました。

できます。

ただそれだけの話なのですがw、試す過程で全部CLIでテスト環境を用意できるようにしていて、せっかくなのでやったことを公開します。一部でも全部でも読者様(と、しばらく後に忘れかけるであろう自分)の参考になれば嬉しいです。

単純にツールの使い方だけ知りたい場合には「作成したロールにスイッチロールしてNoSQL Workbenchへ接続確認」のセクションから見ていただければと思います。

Amazon DynamoDB 用 NoSQL Workbenchとは

DynamoDB用の開発ツールです。テーブルの設計・作成・クエリ実行・データモデリング、データ可視化、クエリ開発機能を提供しています。

現在macOS用とWindows用が提供されています。

環境

macOS版で検証しています。

また、IAMユーザから別なアカウントのIAMロールにスイッチロールしてスイッチロール先のDynamoDBテーブルを参照できることを確認するため、AWSアカウントを2つ用意しています

やってみたこと

概要

2つのアカウント(A、B)を用意し、Aに作成したBobユーザがBのBob-Roleロールを引き受けてBのDynamoDB上にテストで作成したMusicテーブルを参照する検証をしてみました。

インストール

こちらからNoSQL Workbenchをダウンロードしてインストールしました。

NoSQL Workbench のダウンロード - Amazon DynamoDB

検証用のテーブルとデータの作成

こちらの公式記事を参考に、検証用のテーブルとデータの作成を行いました。 なお一部を除き、基本的に記事のコマンドをそのまま流用しています。

AWS CLI の使用 - Amazon DynamoDB

Musicテーブルの作成

アカウントAでDynamoDBのテーブルを作成します
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
作成したテーブルに対してテストデータを追加します
aws dynamodb put-item \
--table-name Music  \
--item \
    '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}}' \
--return-consumed-capacity TOTAL
aws dynamodb put-item \
    --table-name Music \
    --item '{ "Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}, "AlbumTitle": {"S": "Songs About Life"} }' \
    --return-consumed-capacity TOTAL
※補足

先程紹介した記事のとおりですと、私の環境では次のようにエラーになってしまいましたので、内容は変えずにコマンドを1行に修正しています

aws dynamodb put-item \
    --table-name Music \
    --item '{ \
        "Artist": {"S": "Acme Band"}, \
        "SongTitle": {"S": "Happy Day"}, \
        "AlbumTitle": {"S": "Songs About Life"} }' \
    --return-consumed-capacity TOTAL
Error parsing parameter '--item': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
JSON received: { \
        "Artist": {"S": "Acme Band"}, \
        "SongTitle": {"S": "Happy Day"}, \
        "AlbumTitle": {"S": "Songs About Life"} }
クエリを実行してみる
  • クエリを実行する前にkey-conditionsをセットするためのjsonファイルを用意します
{
    "Artist": {
        "AttributeValueList": [
            {   
                "S": "No One You Know"
            }   
        ],  
        "ComparisonOperator": "EQ"
    },  
    "SongTitle": {
        "AttributeValueList": [
            {   
                "S": "Call Me Today"
            }   
        ],  
        "ComparisonOperator": "EQ"
    }
}
  • クエリを実行して結果を確認します
$ aws dynamodb query --table-name Music --key-conditions file://key-conditions.json
{
    "Items": [
        {
            "AlbumTitle": {
                "S": "Somewhat Famous"
            },
            "Artist": {
                "S": "No One You Know"
            },
            "SongTitle": {
                "S": "Call Me Today"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

検証用のユーザとロールの作成

アカウントAにIAMユーザ作成・ポリシーアタッチ

ユーザ作成
aws iam create-user --user-name Bob
ポリシー作成

vim example-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "iam:ListRoles",
                "sts:AssumeRole"
            ],
            "Resource": "*"
        }
    ]
}
aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json
ポリシーのアタッチ
aws iam attach-user-policy \
--user-name Bob \
--policy-arn "arn:aws:iam::xxxxxxxxxxxx:policy/example-policy"

※create-policyの表示結果を参考にarnを指定します。

信頼関係設定用のjsonを作成
vim example-role-trust-policy.json
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": { "AWS": "arn:aws:iam::xxxxxxxxxxxx:root" },
        "Action": "sts:AssumeRole"
    }
}

※xxxxxxxxxxxxにはアカウントAのIDが入ります

アカウントBにロール作成・ポリシーアタッチ・信頼関係設定

注:アカウントBで操作します(CLIの環境変数を切り替えてください)

aws iam create-role \
--role-name example-role \
--assume-role-policy-document file://example-role-trust-policy.json

aws iam attach-role-policy \
--role-name example-role \
--policy-arn "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess"

作成したロールにスイッチロールしてNoSQL Workbenchへ接続確認

一時クレデンシャルの取得

注:アカウントAで操作します(CLIの環境変数を切り替えてください)
aws sts assume-role \
--role-arn arn:aws:iam::xxxxxxxxxxxx:role/Bob-role \
--role-session-name Bob

※role-arnにはアカウントBに作成したBob-Roleロールのarnを設定します

接続設定

  1. [Operation builder]→[Add connection]と辿り「Add a new database connection」のダイアログを表示します
  2. Connection name、Default AWS Region、Access key ID、Secret access key、Session tokenにassume-roleの実行結果を入力します

なお、Operation builderの画面は~/.aws/credentialsで定義されているプロファイルと連動していますので、すでにプロファイルを定義済の場合には「Open」を押すだけで接続できます。

表示確認

前の手順で作成した「Music」テーブルが表示されれば成功です

 

さいごに

現在はCLIとマネジメントコンソールを併用してDynamoDBの設計・実装・参照などを行っていますが、このツールを利用すればより開発がやりやすくなりそうだと期待しています。

ひとまずはsession tokenを用いて接続できることを確認しましたが、引き続き色々と試してみて便利な使い方を探っていこうと思っています。