Table of Contents
AWS公式リファレンスに物申す
Fundastaの社長です。年の瀬ですね、クリスマスイブです。
S3、DynamoDB、Kinesis…
簡単にコマンドラインでいじれる嬉しいツール awscli!
Yeah!
私は初学者というわけではないんですが、awscliでこっちの環境のDynamoDBからデータ引っこ抜いてあっちの環境のDynamoDBに抜いたデータ突っ込もう、とか、エビデンスのためにDynamoDBのデータを保持しておきたいとか、S3のバケットの中身全部欲しい、とか、Kinesisにデータ突っ込んで動作確認したい、とかよくあるシチュエーションで、大体コマンド忘れてます。
プログラムに専念すればするほどたまにやってくるよくあるシチュエーションで記憶がハッキリしません。
どうしよう困った、ググる…
公式リファレンス出る、久しぶり過ぎてオプションがよくわからない…
ダブルクォートってどれをエスケープするんだっけ?
Attributesに指定する値を別ファイル読み込むのどうするんだっけ?
パーティションキーとソートキーが存在するテーブルのデータをパーティションキーだけでひっかけて取得する時どうしたっけ?
S3からディレクトリごと取得するのって確かポータル上じゃできなかったよなぁ…
みたいなことが本当によくある…覚えとけよって話ですが…
そんなわけで、初心者が陥りがちで、公式リファレンスがわかりづらい書き方をちょこっと例を交えて書いていくので、お役に立てれば幸いです。
S3からディレクトリごとローカルに落とす
単一のファイルの取得ならポータルから落とせますが、なぜかポータルからはディレクトリごとダウンロードすることができません…
どうしてもコマンドライン叩くのが嫌な方はS3ファイルマネージャーだったかな?サードパーティ製品使ってください。S3がWindowsのフォルダのように扱えます。
1 |
aws s3 cp s3://[bucket-name]/[directory-name] /mnt/c/Users/user/s3 --recursive --profile hoge |
- [bucket-name]:S3のバケット名を入れてください(”[ ]”はいりませんよ)
- [directory-name]:ダウンロードしたいディレクトリ名(”[ ]”はいりませんよ)
まぁcpしておくのが無難、最後の --profile
は、AWSのアカウントを複数持っている人用です。対象のアカウントへのアクセス情報を以下のように登録しておき、毎回 aws configure
でアクセスするアカウントを指定しなくてもいいようにしておきます。
アクセスするアカウントが1つしかない人はこれはなくても大丈夫です。
1 2 3 4 5 |
aws configure --profile hoge AWS Access Key ID []: AWS Secret Access Key[]: Default region name[]: Default output format[]: |
これでディレクトリごとローカル端末にコピーが完了!
PartitionKeyとSortKeyのあるDynamoDBのテーブルからPartitionKeyだけでレコードリストを取得する
あんまり使わない私にとってこれが本当にわかりにくい…
まぁ結果公式リファレンスから読み取ってやったんだけども…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ATTRIBUTE="{\":p\":{\"S\":\"[sarch-value]\"}}" aws dynamodb query \ --table-name [Table-Name] \ --key-condition-expression "[PartitionKey-Name]=:p" \ --expression-attribute-values "${ATTRIBUTE}" \ --profile hoge > ./dynamodb.json # こういう風にも書ける(ただし、コマンドプロンプトではシングルクォートを認識してくれません) aws dynamodb query \ --table-name [Table-Name] \ --key-condition-expression "[PartitionKey-Name]=:p" \ --expression-attribute-values '{":p":{"S":"[sarch-value]"}}' \ --profile hoge > ./dynamodb.json |
たかだかこんだけのことなのに、このコマンド作るのに小一時間かかってます…
- まずコマンドは
query
です。get-item
では複数レコードの取得はできません - 「Table-Name」:取得したいテーブルのテーブル名です(”[ ]”はいりませんよ)
- 「–key-condition-expression」:どのキーを検索対象とするか(指定できるのはパーティションキーとソートキーのみ)をここで指定します。
- 複数指定する場合は「and」でつなげます。
- 「PartitionKey-Name」:取得したいテーブルのパーティションキーの名称です(”[ ]”はいりませんよ)
- 「=:p」:簡単に言えば変数です。なので値は「p」じゃなくてもなんでも大丈夫です
- この場合、[PartitionKey-Name]を「p」としてこのコマンドの中では扱いますよ、という意味です。
- 「–expression-attribute-values」:「–key-condition-expression」で指定した検索項目で、実際に検索したい値を指定します
- 公式リファレンスには「–key-condition-expression」の途中にスペースが入っていたりしますが、なんだかうまく動かなかったので、スペースを入れないようにしましょう
EX) 以下を検索したい場合
- Table名:UserTransactionTable(ユーザのアクションすべてを管理しているテーブルで、PartitionKeyとSortKeyでテーブルが構成されているとする)
- PartitionKey名:usrId(これに紐づくレコードをすべて取得したい)
- SortKey名:transactionId(この項目は絞り込みの対象とはしない)
- その他絞り込みしたい項目:actionId(ユーザがどういった行動をしたかを管理する項目で、パスワードの変更は1、Profile変更は2、というような管理をしているとする)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 対象のユーザのレコードを全部取得する aws dynamodb query \ --table-name UserTransactionTable \ --key-condition-expression "usrId=:p" \ --expression-attribute-values '{":p":{"S":"10001"}}' \ --profile hoge > ./dynamodb.json # 対象のユーザの特定の行動レコードを全部取得する aws dynamodb query \ --table-name UserTransactionTable \ --key-condition-expression "usrId=:p" \ --filter-expression "#a=:act" \ --expression-attribute-names '{"#a":"actionId"}' \ --expression-attribute-values '{":p":{"S":"10001"},":act":{"N":1}}' \ --profile hoge > ./dynamodb.json |
内容薄いなぁ
もっと濃い内容の記事が書けるように頑張ります。