class Fog::AWS::DynamoDB::Real

Public Class Methods

new(options={}) click to toggle source

Initialize connection to DynamoDB

Notes

options parameter must include values for :aws_access_key_id and :aws_secret_access_key in order to create a connection

Examples

ddb = DynamoDB.new(
  :aws_access_key_id => your_aws_access_key_id,
  :aws_secret_access_key => your_aws_secret_access_key
)

Parameters

  • options<~Hash> - config arguments for connection. Defaults to {}.

Returns

  • DynamoDB object with connection to aws

# File lib/fog/aws/dynamodb.rb, line 74
def initialize(options={})
  @use_iam_profile = options[:use_iam_profile]
  @region = options[:region] || 'us-east-1'

  setup_credentials(options)

  @connection_options     = options[:connection_options] || {}
  @instrumentor           = options[:instrumentor]
  @instrumentor_name      = options[:instrumentor_name] || 'fog.aws.dynamodb'

  @host       = options[:host]        || "dynamodb.#{@region}.amazonaws.com"
  @path       = options[:path]        || '/'
  @persistent = options[:persistent]  || false
  @port       = options[:port]        || '443'
  @scheme     = options[:scheme]      || 'https'

  @connection = Fog::XML::Connection.new("#{@scheme}://#{@host}:#{@port}#{@path}", @persistent, @connection_options)
end

Public Instance Methods

batch_get_item(request_items) click to toggle source

Get DynamoDB items

Parameters

  • 'request_items'<~Hash>:

    • 'table_name'<~Hash>:

      • 'Keys'<~Array>: array of keys

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'Responses'<~Hash>:

        • 'table_name'<~Array> - array of all elements

      • 'UnprocessedKeys':<~Hash> - tables and keys in excess of per request limit, pass this to subsequent batch get for pseudo-pagination

      • 'ConsumedCapacity':<~Hash>:

        • 'TableName'<~String> - the name of the table

        • 'CapacityUnits'<~Float> - Capacity units used in read

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html

# File lib/fog/aws/requests/dynamodb/batch_get_item.rb, line 24
def batch_get_item(request_items)
  body = {
    'RequestItems' => request_items
  }

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.BatchGetItem'},
    :idempotent => true
  )
end
batch_put_item(request_items) click to toggle source
# File lib/fog/aws/requests/dynamodb/batch_write_item.rb, line 5
def batch_put_item(request_items)
  Fog::Logger.deprecation("batch_put_item is deprecated, use batch_write_item instead")
  batch_write_item(request_items)
end
batch_write_item(request_items) click to toggle source

request_items has form:

{“table_name”=>

[{"PutRequest"=>
  {"Item"=>
     {"hi" => {"N" => 99}}
  }
}]

}

See DynamoDB Documentation: docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_BatchWriteItems.html

# File lib/fog/aws/requests/dynamodb/batch_write_item.rb, line 22
def batch_write_item(request_items)
  body = {
    'RequestItems' => request_items
  }

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.BatchWriteItem'}
  )
end
create_table(table_name, key_schema, provisioned_throughput) click to toggle source

Create DynamoDB table

Parameters

  • 'table_name'<~String> - name of table to create

  • 'key_schema'<~Array>:

    * 'AttributeName'<~String> - name of attribute
    * 'KeyType'<~String> - type of attribute, in %w{N NS S SS} for number, number set, string, string set
  • 'ProvisionedThroughput'<~Hash>:

    • 'ReadCapacityUnits'<~Integer> - read capacity for table, in 5..10000

    • 'WriteCapacityUnits'<~Integer> - write capacity for table, in 5..10000

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'TableDescription'<~Hash>

        • 'CreationDateTime'<~Float> - Unix epoch time of table creation

        • 'KeySchema'<~Array> - schema for table

          * 'AttributeName'<~String> - name of attribute
          * 'KeyType'<~String> - type of attribute, in %w{N NS S SS} for number, number set, string, string set
        • 'ProvisionedThroughput'<~Hash>:

          • 'ReadCapacityUnits'<~Integer> - read capacity for table, in 5..10000

          • 'WriteCapacityUnits'<~Integer> - write capacity for table, in 5..10000

        • 'TableName'<~String> - name of table

        • 'TableStatus'<~String> - status of table

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html

# File lib/fog/aws/requests/dynamodb/create_table.rb, line 32
def create_table(table_name, key_schema, provisioned_throughput)
  body = {
    'KeySchema'             => key_schema,
    'ProvisionedThroughput' => provisioned_throughput,
    'TableName'             => table_name
  }

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.CreateTable'},
    :idempotent => true
  )
end
delete_item(table_name, key, options = {}) click to toggle source

Delete DynamoDB item

Parameters

  • 'table_name'<~String> - name of table for item

  • 'key'<~Hash> - hash of attributes

Returns

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html

# File lib/fog/aws/requests/dynamodb/delete_item.rb, line 18
def delete_item(table_name, key, options = {})
  body = {
    'Key'               => key,
    'TableName'         => table_name
  }.merge(options)

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.DeleteItem'},
    :idempotent => true
  )
end
delete_table(table_name) click to toggle source

Delete DynamoDB table

Parameters

  • 'table_name'<~String> - name of table to delete

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'TableDescription'<~Hash>

        • 'ProvisionedThroughput'<~Hash>:

          • 'ReadCapacityUnits'<~Integer> - read capacity for table, in 5..10000

          • 'WriteCapacityUnits'<~Integer> - write capacity for table, in 5..10000

        • 'TableName'<~String> - name of table

        • 'TableStatus'<~String> - status of table

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html

# File lib/fog/aws/requests/dynamodb/delete_table.rb, line 22
def delete_table(table_name)
  body = {
    'TableName' => table_name
  }

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.DeleteTable'},
    :idempotent => true
  )
end
describe_table(table_name) click to toggle source

Describe DynamoDB table

Parameters

  • 'table_name'<~String> - name of table to describe

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'Table'<~Hash>

        • 'CreationDateTime'<~Float> - Unix epoch time of table creation

        • 'KeySchema'<~Array> - schema for table

          • 'AttributeName'<~String> - name of attribute

          • 'KeyType'<~String> - type of attribute, in %w{N NS S SS} for number, number set, string, string set

        • 'ProvisionedThroughput'<~Hash>:

          • 'ReadCapacityUnits'<~Integer> - read capacity for table, in 5..10000

          • 'WriteCapacityUnits'<~Integer> - write capacity for table, in 5..10000

        • 'TableName'<~String> - name of table

        • 'TableSizeBytes'<~Integer> - size of table in bytes

        • 'TableStatus'<~String> - status of table

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html

# File lib/fog/aws/requests/dynamodb/describe_table.rb, line 27
def describe_table(table_name)
  body = {
    'TableName' => table_name
  }

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.DescribeTable'},
    :idempotent => true
  )
end
get_item(table_name, key, options = {}) click to toggle source

Get DynamoDB item

Parameters

  • 'table_name'<~String> - name of table for item

  • 'key'<~Hash>:

    {
      "ForumName": {
        "S": "Amazon DynamoDB"
      }
    }
    
  • 'options'<~Hash>:

    • 'AttributesToGet'<~Array>: list of array names to return, defaults to returning all

    • 'ConsistentRead'<~Boolean>: whether to wait for updates, defaults to false

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'ConsumedCapacityUnits'<~Float> - Capacity units used in read

      • 'Item':<~Hash>:

        • 'AttributeName'<~Hash>: in form of {“type”:value}

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html

# File lib/fog/aws/requests/dynamodb/get_item.rb, line 28
def get_item(table_name, key, options = {})
  body = {
    'Key'               => key,
    'TableName'         => table_name
  }.merge(options)

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.GetItem'},
    :idempotent => true
  )
end
list_tables(options = {}) click to toggle source

List DynamoDB tables

Parameters

  • 'options'<~Hash> - options, defaults to {}

    • 'ExclusiveStartTableName'<~String> - name of table to begin listing with

    • 'Limit'<~Integer> - limit number of tables to return

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'LastEvaluatedTableName'<~String> - last table name, for pagination

      • 'TableNames'<~Array> - table names

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTables.html

# File lib/fog/aws/requests/dynamodb/list_tables.rb, line 20
def list_tables(options = {})
  request(
    :body       => Fog::JSON.encode(options),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.ListTables'},
    :idempotent => true
  )
end
put_item(table_name, item, options = {}) click to toggle source

Update DynamoDB item

Parameters

  • 'table_name'<~String> - name of table for item

  • 'item'<~Hash>: data to update, must include primary key {

    "LastPostDateTime": {"S": "201303190422"}

    }

Returns

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html

# File lib/fog/aws/requests/dynamodb/put_item.rb, line 21
def put_item(table_name, item, options = {})
  body = {
    'Item'      => item,
    'TableName' => table_name
  }.merge(options)

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.PutItem'}
  )
end
query(table_name, options = {}, hash_key_deprecated = nil) click to toggle source

Query DynamoDB items

Parameters

  • 'table_name'<~String> - name of table to query

  • options<~Hash>:

    • 'AttributesToGet'<~Array> - Array of attributes to get for each item, defaults to all

    • 'ConsistentRead'<~Boolean> - Whether to wait for consistency, defaults to false

    • 'Count'<~Boolean> - If true, returns only a count of such items rather than items themselves, defaults to false

    • 'Limit'<~Integer> - limit of total items to return

    • 'KeyConditionExpression'<~String> - the condition elements need to match

    • 'ExpressionAttributeValues'<~Hash> - values to be used in the key condition expression

    • 'ScanIndexForward'<~Boolean>: Whether to scan from start or end of index, defaults to start

    • 'ExclusiveStartKey'<~Hash>: Key to start listing from, can be taken from LastEvaluatedKey in response

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'ConsumedCapacityUnits'<~Integer> - number of capacity units used for query

      • 'Count'<~Integer> - number of items in response

      • 'Items'<~Array> - array of items returned

      • 'LastEvaluatedKey'<~Hash> - last key scanned, can be passed to ExclusiveStartKey for pagination

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

# File lib/fog/aws/requests/dynamodb/query.rb, line 29
def query(table_name, options = {}, hash_key_deprecated = nil)
  if hash_key_deprecated || (options.keys.length == 1 && [:S, :N, :B].include?(options.keys.first.to_sym))
    Fog::Logger.deprecation("The `20111205` API version is deprecated. You need to use `KeyConditionExpression` instead of `HashKey`.")
    apiVersion = '20111205'
    hash_key = options
    options = hash_key_deprecated
  end

  body = {
    'TableName'     => table_name,
    'HashKeyValue'  => hash_key
  }.merge(options)

  request(
    :body     => Fog::JSON.encode(body),
    :headers  => {'x-amz-target' => "DynamoDB_#{apiVersion || '20120810'}.Query"}
  )
end
scan(table_name, options = {}) click to toggle source

Scan DynamoDB items

Parameters

  • 'table_name'<~String> - name of table to query

  • options<~Hash>:

    • 'AttributesToGet'<~Array> - Array of attributes to get for each item, defaults to all

    • 'ConsistentRead'<~Boolean> - Whether to wait for consistency, defaults to false

    • 'Count'<~Boolean> - If true, returns only a count of such items rather than items themselves, defaults to false

    • 'Limit'<~Integer> - limit of total items to return

    • 'KeyConditionExpression'<~String> - the condition elements need to match

    • 'ExpressionAttributeValues'<~Hash> - values to be used in the key condition expression

    • 'ScanIndexForward'<~Boolean>: Whether to scan from start or end of index, defaults to start

    • 'ExclusiveStartKey'<~Hash>: Key to start listing from, can be taken from LastEvaluatedKey in response

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'ConsumedCapacityUnits'<~Integer> - number of capacity units used for scan

      • 'Count'<~Integer> - number of items in response

      • 'Items'<~Array> - array of items returned

      • 'LastEvaluatedKey'<~Hash> - last key scanned, can be passed to ExclusiveStartKey for pagination

      • 'ScannedCount'<~Integer> - number of items scanned before applying filters

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html

# File lib/fog/aws/requests/dynamodb/scan.rb, line 30
def scan(table_name, options = {})
  body = {
    'TableName'     => table_name
  }.merge(options)

  request(
    :body     => Fog::JSON.encode(body),
    :headers  => {'x-amz-target' => 'DynamoDB_20120810.Scan'},
    :idempotent => true
  )
end
update_item(table_name, key, options = {}, deprecated_attribute_updates = nil) click to toggle source

Update DynamoDB item

Parameters

  • 'table_name'<~String> - name of table for item

  • 'key'<~Hash> - list of Key attributes {

    "ForumName": {"S": "Amazon DynamoDB"},
    "Subject": {"S": "Maximum number of items?"}

    }

  • 'options'<~Hash>:

    • 'UpdateExpression'<~String> - the expression that will update the item

    • 'ExpressionAttributeValues'<~Hash> - values to be used in the update expression

    • 'ReturnValues'<~String> - data to return in %w{ALL_NEW ALL_OLD NONE UPDATED_NEW UPDATED_OLD}, defaults to NONE

Returns

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html

# File lib/fog/aws/requests/dynamodb/update_item.rb, line 28
def update_item(table_name, key, options = {}, deprecated_attribute_updates = nil)
  if deprecated_attribute_updates
    raise DeprecatedAttributeUpdates, "The `20111205` DynamoDB API is deprecated. You need to use `ExpressionAttributeValues` instead of `AttributeUpdates`."
    attribute_updates = options
    options = deprecated_attribute_updates.merge(
      'AttributeUpdates'  => attribute_updates,
    )
  end

  body = {
    'Key'               => key,
    'TableName'         => table_name,
  }.merge(options)

  request(
    :body     => Fog::JSON.encode(body),
    :headers  => {'x-amz-target' => 'DynamoDB_20120810.UpdateItem'}
  )
end
update_table(table_name, provisioned_throughput) click to toggle source

Update DynamoDB table throughput

Parameters

  • 'table_name'<~String> - name of table to describe

  • 'provisioned_throughput'<~Hash>:

    • 'ReadCapacityUnits'<~Integer> - read capacity for table, in 5..10000

    • 'WriteCapacityUnits'<~Integer> - write capacity for table, in 5..10000

Returns

  • response<~Excon::Response>:

    • body<~Hash>:

      • 'Table'<~Hash>

        • 'KeySchema'<~Array> - schema for table

          * 'AttributeName'<~String> - name of attribute
          * 'KeyType'<~String> - type of attribute, in %w{N NS S SS} for number, number set, string, string set
        • 'ProvisionedThroughput'<~Hash>:

          • 'ReadCapacityUnits'<~Integer> - read capacity for table, in 5..10000

          • 'WriteCapacityUnits'<~Integer> - write capacity for table, in 5..10000

        • 'TableName'<~String> - name of table

        • 'TableStatus'<~String> - status of table

See DynamoDB Documentation: docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html

# File lib/fog/aws/requests/dynamodb/update_table.rb, line 28
def update_table(table_name, provisioned_throughput)
  body = {
    'ProvisionedThroughput' => provisioned_throughput,
    'TableName'             => table_name
  }

  request(
    :body       => Fog::JSON.encode(body),
    :headers    => {'x-amz-target' => 'DynamoDB_20120810.UpdateTable'},
    :idempotent => true
  )
end

Private Instance Methods

_request(params) click to toggle source
# File lib/fog/aws/dynamodb.rb, line 137
def _request(params)
  response = @connection.request(params)

  unless response.body.empty?
    response.body = Fog::JSON.decode(response.body)
  end

  response
end
reload() click to toggle source
# File lib/fog/aws/dynamodb.rb, line 104
def reload
  @connection.reset
end
request(params) click to toggle source
# File lib/fog/aws/dynamodb.rb, line 108
def request(params)
  refresh_credentials_if_expired

  # defaults for all dynamodb requests
  params.merge!({
    :expects  => 200,
    :method   => :post,
    :path     => '/'
  })

  # setup headers and sign with signature v4
  date = Fog::Time.now
  params[:headers] = {
    'Content-Type'  => 'application/x-amz-json-1.0',
    'Date'          => date.to_iso8601_basic,
    'Host'          => @host,
  }.merge!(params[:headers])
  params[:headers]['x-amz-security-token'] = @aws_session_token if @aws_session_token
  params[:headers]['Authorization'] = @signer.sign(params, date)

  if @instrumentor
    @instrumentor.instrument("#{@instrumentor_name}.request", params) do
      _request(params)
    end
  else
    _request(params)
  end
end
setup_credentials(options) click to toggle source
# File lib/fog/aws/dynamodb.rb, line 95
def setup_credentials(options)
  @aws_access_key_id          = options[:aws_access_key_id]
  @aws_secret_access_key      = options[:aws_secret_access_key]
  @aws_session_token          = options[:aws_session_token]
  @aws_credentials_expire_at  = options[:aws_credentials_expire_at]

  @signer = Fog::AWS::SignatureV4.new(@aws_access_key_id, @aws_secret_access_key, @region, 'dynamodb')
end