LambdaでDynamoDBのデータを操作する(Node&Python)

はじめに

最近はもっぱらIoT関連の案件を担当しています。
AWSを使っているので、DynamoDBにデバイスからのデータを溜め込んだり、そのデータを取得して可視化したりなどすることが多く、その際にはLambdaが大活躍しています。
主にNode.jsを使っており、案件に応じてPythonでも実装をしていて、自分の中でテンプレート化してきたなーと思ったのでまとめておこうっとな。

DynamoDBにデータをPutする

主にデバイスから受けとったデータをDynamoDBに書き込みます。
本来であればデータを加工する必要がありますが、そこはデバイスによって多種多様ですので割愛します。
ここで重要なのは、PartitionKeyとSortKeyの指定です。
ここを間違えてしまうとエラーを吐いてきます。(Key情報が間違ってるぜ!的な感じ)

Node.js

const AWS = require("aws-sdk");
const dynamoDB = new AWS.DynamoDB.DocumentClient({
  region: "ap-northeast-1" // DynamoDBのリージョン
});

exports.handler = (event, context, callback) => {
  const params = {
    TableName: "table-name" // DynamoDBのテーブル名
    Item: {
      "PartitionKey": "your-partition-key-data", // Partition Keyのデータ
      "SortKey": "your-sort-key-data", // Sort Keyのデータ
      "OtherKey": "your-other-data"  // その他のデータ
    }
  }

  // DynamoDBへのPut処理実行
  dynamoDB.put(params).promise().then((data) => {
    console.log("Put Success");
    callback(null);
  }).catch((err) => {
    console.log(err);
    callback(err);
  });
}

Python

import boto3

def lambda_handler(event, context):
  try:
    dynamoDB = boto3.resource("dynamodb")
    table = dynamoDB.Table("table-name") # DynamoDBのテーブル名

    # DynamoDBへのPut処理実行
    table.put_item(
      Item = {
        "PartitionKey": "your-partition-key-data", # Partition Keyのデータ
        "SortKey": "your-sort-key-data", # Sort Keyのデータ
        "OtherKey": "your-other-data"  # その他のデータ
      }
    )
  except Exception as e:
        print e

DynamoDBのデータを取得する(query)

主にDynamoDB内のデータを取得する際にはqueryを使います。
PartitionKeyだけでなくSortKeyもDynamoDBにあれば、ScanIndexForwardをfalseにLimitで取得した件数を指定して、降順(最新)のデータから固定の件数を取得することができます。
よく多いパターンとしては、あるDeviceID(PartitionKey)が送信してきたデータを最新から○○件取得したいなどのパターンがあります。

Node.js

const AWS = require("aws-sdk");
const dynamoDB = new AWS.DynamoDB.DocumentClient({
  region: "ap-northeast-1" // DynamoDBのリージョン
});

exports.handler = (event, context, callback) => {
  const params = {
    TableName: "table-name" // DynamoDBのテーブル名
    KeyConditionExpression: "#PartitionKey = :partition-key-data and #SortKey = :sort-key-data", // 取得するKey情報
    ExpressionAttributeNames: {
      "#PartitionKey": "your-partition-key", // PartitionKeyのアトリビュート名
      "#SortKey": "your-sort-key" // SortKeyのアトリビュート名
    },
    ExpressionAttributeValues: {
      ":partition-key-data": "your-partition-key-data", // 取得したいPartitionKey名
      ":sort-key-data": "your-sort-key-data" // 取得したいSortKey名
    }
    ScanIndexForward: false // 昇順か降順か(デフォルトはtrue=昇順)
    Limit: 1 // 取得するデータ件数
  }

  // DynamoDBへのquery処理実行
  dynamoDB.query(params).promise().then((data) => {
    console.log(data);
    callback(data);
  }).catch((err) => {
    console.log(err);
    callback(err);
  });
}

Python

import boto3
from boto3.dynamodb.conditions import Key

def lambda_handler(event, context):
  try:
    dynamoDB = boto3.resource("dynamodb")
    table = dynamoDB.Table("table-name") # DynamoDBのテーブル名

    # DynamoDBへのquery処理実行
    queryData = table.query(
      KeyConditionExpression = Key("your-partition-key").eq("your-partition-key-data") & Key("your-sort-key").eq("your-sort-key-data"), # 取得するKey情報
      ScanIndexForward = false, # 昇順か降順か(デフォルトはtrue=昇順)
      Limit: 1 # 取得するデータ件数
    )
    return queryData
  except Exception as e:
        print e

さいごに

DynamoDBにはよくPutとqueryでデータを扱うことが多いので二つの方法についてまとめました。
場合によってはPutじゃなくてUpdateでなければならなかったり、とりあえず全件取得したいということきはscanを使ったりします。
ちゃんとLambdaにDynamoDBを操作できるポリシーを持たせておくのを忘れずに!
またquery実行時にときたま発生するのですが、「エラーが吐かれずに処理が完了したように見えるのに、DynamoDBにデータが入ってない!」見たいなことがあります。そんなときはタイムアウトを疑ってください。デフォルトでは3秒なので、queryで取得するデータの件数が多い場合はタイムアウトしてしまいます。
これはLambdaの中で使うように書きましたが、普通にSDKを使っているだけなので、WebアプリケーションやSDKを積めるデバイスからデータを扱う場合でも、上記のソースコードを改造すれば使えると思います。

余談ですが、Node書いて、Python書いてとしていると文法等がこんがらがってしまうのが最近の悩みのひとつです・・・

(ソースコードに汚い部分がありましたらご容赦ください・・・)

ではまた!

続きを読む

NW X Security JAWS勉強会 #1レポート

こんにちは、ひろかずです。
今日は、NW-JAWSとSecurity-JAWSの合同勉強会に行ってきたので、一筆書きます。

例によって、リアルタイムで執筆しているので、表記ゆれ、誤字、脱字等はご容赦ください。

会場は、トレンドマイクロさん(新宿)
大きい部屋並べた椅子120脚がみるみる埋まる状況でした。

今回はOSI7階層になぞらえてのセッションとのことです!

お品書き

  • L1&L2 日本一AWSに近い場所。独自に進化を遂げたエクイニクス・ジャパンの現状(仮)
  • L3&L4 AWSにおけるIPv6対応状況
  • L5&L6&L7 AWS WAF の話とSecurity Automation の紹介
  • L7+:AWSユーザー向けサイバーリスク保険の概要および活用方法
  • L0:絶対に覚えておきたい物理的標的型攻撃対策10+3のコツ

L1&L2 日本一AWSに近い場所。独自に進化を遂げたエクイニクス・ジャパンの現状(仮

エクイニクス・ジャパン
グローバル・ソリューション・アーキテクト 内田 武志さん

エクイニクス・ジャパンとは

国内600名
世界中でデータセンターを保有
データセンターとの相互接続
国内で11か所。東京10、大阪1
ダイレクトコネクトの接続拠点(世界で15か所)
接続状況はまさに小宇宙

今日の試み

DXロケーションに深堀りしていく

  • L1:光ファイバ、物理IF、DWDM
  • L2:イーサネット、VLAN

ダイレクトロケーションの構成のうち、ダイレクトコネクトルーターとカスタマーゲートウェイ間の話

LOA-CFAに従って、エクイニクスエンジニアがラック内を配線する

  • クロスコネクト構内接続:24h以内に提供
  • キャンパス内接続:24h以内に提供
  • メトロコネクト:10営業日以内に提供

ケーブルはシングルモードファイバ

ルータなどのネットワーク危機への接続
お客持ち込みから、エクイニクスレンタルまで

TY2の中にAWSDXロケーションがある(檻に入っている)
お客様ラックからTY2基幹配線を通じて接続
プレミアムロケーション(なかなか取れない!)

PeeringDBを見ると、エクイニクス内の利用ユーザーが分かる。

TY2に在庫がないので、ビットアイルを買収(TY678)
地下ケーブルを張ったので、パッチパネルを繋ぐだけで接続できる
1GB、10GB問わず

DWDM(高密度波長分割多重)とは

  • 1波長に80の通信を詰め込む。
  • 波長ごとに帯域を設定
  • もはやネットワークをスヌーピングするのは不可能
  • TY2~TY4の間は、機械的に終端しないで光信号のまま通信させる。
  • 光信号のルーティングが、鏡のようなもので行う(!)

ルーターの貸し出しや設定支援もしているよ!

L2

ダイレクトコネクトの価格表は2種類のみ1GB、10GB

サブ1G

  • レイヤ2を50MB~500MBまで分割するサービス
  • 50MBはお小遣いでDXできるレベル
  • 利用開始、停止は15分以内で行える(使わないときは止められる!)
  • ただインターネットを迂回したいのであれば50MB
  • 季節変動的なワークロードや、PoC、データ移行なら500MBという使い分けができる

まとめ

エクイニクスは、まじめに基礎的な技術を積み上げてパフォーマンスを提供できるようにしている
ダイレクトコネクトのデフォルトスペックをなるべく妨げないのが、エクイニクスのいいところ
Software制御でクラウド接続を制御していく流れ

QA

エクイニクスがデータセンターを繋ぐときは、自社持ちの伝送路?
– 複数のダークファイバをっ持つキャリアから借りている
– 伝送装置は自社
電気通信事業者?
– 電気通信事業者のライセンスは持っているけど、キャリアサービスをやってしまうとキャリアと仲良くできないので、中立的は接続の場を提供している
データセンターのテロ対策の公開情報は?
– ロケーションによる。
– 米国では、立ち入り禁止の場所に立ち入ったら、武装警官が駆けつける。
– データセンターを繋ぐブリッジなので、利用者は一つのロケーションが落ちても大丈夫な構成にしているはず。

よもやま

AWSはデータセンターの場所は公開していない。
TY2は、データが素通りするだけで、データやストレージはそこにはない。

L3&L4 AWSにおけるIPv6対応状況

アマゾンウェブサービスジャパン 
荒木 靖宏さん

最新ネタ
VPCのCIDERが編集できるようになったよ!(ipv6は未対応)

IPv6は世界中で使える

冗長化した100GbEのネットわーkうが張り巡らされた
ファイバ切られても大丈夫!
中国は除く(大変・・・)

AWSサービスは諸説あるが、ipv6
利用者は普通、VPCでv6を使いたい。
パブリック利用するサービスは、大体v6対応している。

v6の歴史

AWSはお客からサービスを考える

CLB

  • 一番先に対応したのはELB(CLB@VPCクラシックのみ)
  • CLBのインターネット側をv6で受けて、v4に変換する方式
  • v6利用はオプトイン(任意利用)
  • 2011年5月から

AWS IoT

  • ローンチ時からv6対応
  • 想定デバイス数は1億とかザラなので、スケールできるように。

s3

  • 対応時全く反響なかった
  • v6ネットワークは早いのでおススメ

CloudFront

  • 対応してます!

AWS WAF

  • ローンチ時からv6対応
  • ALBはv6対応してないので、CFのみで利用可能
  • ブラックリストIPは10000かけるけどv6からしたら少ないよね

Route53

  • NSでv6書ける
  • v4死んでもサービス継続!

ALB

  • CLBより早くて安い(ほとんどの場合)
  • これからのメインストリームなので、CLBから乗り換え推奨

VPC

  • ヂュアルスタックで利用可能
  • v4はデフォ、v6はオプトイン
  • 時々は、マネコンで表示してあげて!
  • グローバルユニキャストアドレスを使う
  • 1:1のNATは存在しない
  • 従来のプライベート安全神話は存在しない。
  • Egress Only Internet Gateway
  • 外からアクセスできないことを保証
  • GUAは、ルートテーブル、NACL、SGは自分で別途設定

ダイレクトコネクト

  • BGPでもv6対応しているので覚えてね

全体として

  • Amazon保有のv6アドレスだけで、提供している。

セキュリティの話

VPC Flow Logsもv6対応している。
s3料金のみ
kibanaで可視化するのがいいかな

L5&L6&L7 AWS WAF の話とSecurity Automation の紹介

アマゾンウェブサービスジャパン 
桐山 隼人さん

AWSは、データ領域のセキュリティはユーザー責任範囲としていたが、その領域のセキュリティを語るのは感慨深い
上司の前でのプレゼン。。。
今日のテーマは、AWS WAF
生まれたばかりのサービス
会場の半数が利用している
今日の回でWAF好きを増やしたい

いいところ

脅威から保護
API連携
簡単デプロイ
トラフィック可視化
従量課金

最近のアップデート

HIPAA準拠
レートベースルール

  • 大量リクエスト送信元IPを検知
  • 5分間隔
  • CloudWatchやLamdaのカスタム呼び出しも可能

OWASP Top10対応

  • 推奨WebACLとルールを含むCFnテンプレートあり
  • ホワイトペーパー出てる

AWS WAF Security Automation

  • つい1-2か月前にアップデートされてる(!)
  • デプロイ、アナライズ、プロテクトの自動化

デプロイの自動化

  • CFとALBむけスタックがそれぞれ用意されている。

アナライズの自動化

  • トラフィックの振る舞いから不正なアクセスの自動解析
  • ハニーポット的なAPIGatewayを用意して、にアクセスしてきているスクレイバやボットを引き寄せ
  • ログをLambdaで解析
  • IPブラックリストをダウンロードしてIPリストに登録するスクリプト(Lambdaで定期実行)

プロテクションの自動化

  • 解析結果に基づいたWAFルールの自動作成と適用

今までのインシデントレスポンス

  • これまでは、セキュリティエンジニアが手で行っていたことを代替

もう一歩先

Domain Generation Algorithmsによるドメイン名からの通信をブロックしたい

  • リファラにあるドメイン名から、DGAによるものかを自動判定するアプローチはどうか

機械学習を使う

  • 教師データ:Alexa Top 10,000, 既知のフィッシングサイト
  • 評価データ:CFのログをパース

PoCの結果は、1%の誤検知だったが、まだ進化できる。

QA

DDoS対策はどうなの?
– 来週ブラックベルトありますよ!
– L7向けの対策にはなる

L7+:AWSユーザー向けサイバーリスク保険の概要および活用方法

東京海上日動火災保険
上田 哲也さん

商品公開した瞬間に賛否分かれた
否側は、AWSは安全だという論調(リスク商品は営業妨害)
最終的にAWSのお墨付きを貰った。
クラウド推進のための商品

変遷

2016年の販売開始から、クラスメソッド、サーバーワークス、NECと事業者との業務提携

概要

AWSに障害が発生した際、AWSウーザーが被る損害を補償する
損害賠償請求・弁護士費用の他に、調査対応費用(超過人件費、情報漏えい見舞金、お詫び広告費用)も補償範囲

  • ユーザー責任部分に起因して発生した損害の補償は、個別設計が必要
  • アプリケーションの種類でりすくが全く異なるので個別になる。

QA

加入単位は?

  • アカウント単位で加入可能
  • アカウントごとに明確に業務を区分できる場合に限る

発生時手続き

  • 利用者による原因の証明が必要

支払い

  • 一括でも分割でも

購入方法

個別契約モデル

  • ユーザーが代理店を通じて契約

パートナー連携モデル

  • パートナーのサービスに入ってもらえると、自動適用されるモデル

活用方法

リスクの移転手段としての活用が有効

  • 発生時の影響が大きいリスクには移転という考え方が有効(地震や火災)

社内調整時の活用

  • クラウド使いたいけど心配対策
  • 情報漏えいなどセキュリティに不安、ネットワーク安定性に不安 など
  • 利用開始前の法務、上席対策に活用

付加価値として既存サービスに組み込む

  • サービスに入ったら、無料でついてくるよ!という見せ方
  • 無料で保険を配る場合は、免許は不要(保険募集的な説明をパートナーが行うことも可能)

プロジェクトごとに個別付保

  • 保険が必要なプロジェクトやユーザーごとに付保する。
  • 無料配布はできない。
  • 保険販売の資格を持っている人が説明しないといけない。

宣伝

プロジェクトリスク保険

  • 自社の業海洲等によって発生する損害をカバー
  • 事故が多いので、保険料が高くなってきている
  • TeamSpiritさんのサービスでは、サービス料に混ぜ込むものもある

QA

AWS障害を証明するのはユーザーだが、証明は調査料は支払われるのか?

  • 支払われる

証明できなければ?

  • 支払われない

支払いの実績はあるの?
– 守秘義務に抵触。。。

DNS障害でAPIを引けないことに起因する障害では、保険料請求はあったか?

  • なかった
  • 損害賠償請求と調査対応費用がかからないと支払われない
  • 日本はリスクが低い

対応費用の上限は?

  • デフォルト:損害賠償は1億~10億、自社対応費用は1億限定
  • 使った額が支払われる

Azure、GCPは?

  • 対応しました。
  • 名称は別で用意してます

L0:絶対に覚えておきたい物理的標的型攻撃対策10+3のコツ

Works Mobile Japan
伊藤 成幸さん

全員起立でセッション参加!
スライドの1/3が自己紹介
元陸自、海自
きりしまでソナー担当
20ミリ機関砲 アンチウェポンシステム(AWS)

呼ばれた経緯

  • 怖いお兄さんからLT依頼

レイヤ0

金曜夜に起きること

  • 酔っ払いとコリジョン
  • 同による標的型攻撃
  • 同DoS

今日は標的型

都内犯罪について

東京は日中と夜間の人口の差が激しい
無事に帰るための心構え

脅威の発見:監視振る舞い検知

  • 脅威はいきなり現れない
  • だんだん近づいてくる
  • 歩きスマホは危ない!
  • 周りをよく見て、違う動きをしている人を検出

脅威の評価:見た目、距離、火力、つよそう

  • 銃を持っている人は、時間と距離をゼロにする

脅威への対処:落ち着く、排除、離隔

  • 大声を出す(声を出して落ち着く)

通報

  • 正当防衛でも、警察は先に110番されると通報者を被害者として扱う
  • 倒したらすぐに110番!

準備

時計を外す、ヒールを脱ぐ
準備体操
元気よく!

想定シチュエーション:金曜夜に新宿駅で酔っ払いに絡まれたら

足を一歩前にして、押されても倒れないように
重心を少し下げる(少し腰を落とす)
ちょっと頭を下げる(顔を守る:ディフェンス重視)
ファイティングポーズを構えると開戦するので、ごめんなさい(手を前に)
重心がある足を意識して、ピボット(どこでも正面にできるように)

腕をつかまれたら

  • 手を開く
  • 腕が少し太くなるので、指の隙間から抜けやすくなる
  • 重心が低くないと、腕が抜けない。重心を意識!
  • 抜けたら逃げる!

抜けなかったら小手返し

  • 利き手で相手の手首を取る
  • 相手の親指の付け根を取って、そのまま捻る(手の甲にもう片方の手を添えるだけで極まる)

胸ぐらをつかまれたら

  • 半身ごめんなさいの体勢から(とにかく顔は守る)
  • 距離を詰めて、相手の顎を掌底で突きあげて、そのまま倒す

羽交い締めされたら

  • 左足を相手の足の間に入れながら、体ごと捻りかえる。
  • 相手の重心が崩れるので、後はやり放題

モノ(女性向け)

防犯ブザー
催涙スプレー

  • 最近のは麻薬中毒者にも効く
  • 護身で持っていても大丈夫との最高裁判決

ライト

  • 200ルーメンの強力なやつ
  • 押し付ければ痛い
  • 暗い場所なら、めくらましに使える。
  • フラッシュモードで相手の距離感を殺す
  • 車内では天井にバウンスさせれば書類も見える
  • ハイボールに入れればキレイ(バーで使えば女子ウケ抜群!)

素晴らしいライフハックでした!

今日はここまでです。
お疲れさまでした!

続きを読む