Как создать экземпляр DynamoDB-Local Docker с экспортированной таблицей и строками?

Команда Chrome сделала создание метода для всплытия программно, но он включен только как частный API, а планирует сделать его общедоступным, застопорившись из-за безопасности .

Итак, с марта 2018 года по-прежнему вы не можете этого сделать.

0
задан Victor Ferreira 17 March 2019 в 21:11
поделиться

1 ответ

Я не уверен, что официальный DynamoDB-Local поддерживает это по умолчанию, и кажется, что вам нужен собственный скрипт, который импортирует CSV в DynamodB, однако вы можете создать собственное изображение для ваших нужд. Так, например, вы можете начать с простого Dockerfile использования amazon/dynamodb-local, а затем добавить скрипт Python, который будет отвечать за импорт CSV-файлов, поэтому шаги могут выглядеть следующим образом:

  • Смонтировать CSV в контейнер может быть внутри /docker-entrypoint-initdb.d
  • Создайте сценарий entrypoint.sh, чтобы использовать его в качестве точки входа для контейнера, а также он проверит, есть ли какие-либо файлы csv внутри /docker-entrypoint-initdb.d, чтобы передать его в скрипт Python - код , добавленный ниже - который загрузит его в DynamodB, например, как показано ниже (взято из точки входа mongodb ):
        for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                # if csv file pass it to the python script
                *.csv) echo "[110]: running $f"; . "$f" ;;
                *)    echo "[110]: ignoring $f" ;;
            esac
            echo
        done
[ 1120]
  • Следующий код не был протестирован или создан мной, я только что скопировал его по следующей ссылке Импортируйте CSV-файл в таблицу DynamoDB, используя boto (пакет Python) , вы можете изменить его так, как считаете нужным, или создать собственный сценарий. Или, если у вас есть более подходящее предложение, дайте мне знать, чтобы обновить ответ.

  • boto поддерживает DynamodB-Local, как описано в следующем ответе , что означает, что вы можете изменить скрипт, чтобы он работал с DynamodB Local

    • import boto
      
      MY_ACCESS_KEY_ID = 'copy your access key ID here'
      MY_SECRET_ACCESS_KEY = 'copy your secrete access key here'
      
      
      def do_batch_write(items, table_name, dynamodb_table, dynamodb_conn):
          '''
          From https://gist.github.com/griggheo/2698152#file-gistfile1-py-L31
          '''
          batch_list = dynamodb_conn.new_batch_write_list()
          batch_list.add_batch(dynamodb_table, puts=items)
          while True:
              response = dynamodb_conn.batch_write_item(batch_list)
              unprocessed = response.get('UnprocessedItems', None)
              if not unprocessed:
                  break
              batch_list = dynamodb_conn.new_batch_write_list()
              unprocessed_list = unprocessed[table_name]
              items = []
              for u in unprocessed_list:
                  item_attr = u['PutRequest']['Item']
                  item = dynamodb_table.new_item(
                          attrs=item_attr
                  )
                  items.append(item)
              batch_list.add_batch(dynamodb_table, puts=items)
      
      
      def import_csv_to_dynamodb(table_name, csv_file_name, colunm_names, column_types):
          '''
          Import a CSV file to a DynamoDB table
          '''        
          dynamodb_conn = boto.connect_dynamodb(aws_access_key_id=MY_ACCESS_KEY_ID, aws_secret_access_key=MY_SECRET_ACCESS_KEY)
          dynamodb_table = dynamodb_conn.get_table(table_name)     
          BATCH_COUNT = 2 # 25 is the maximum batch size for Amazon DynamoDB
      
          items = []
      
          count = 0
          csv_file = open(csv_file_name, 'r')
          for cur_line in csv_file:
              count += 1
              cur_line = cur_line.strip().split(',')
      
              row = {}
              for colunm_number, colunm_name in enumerate(colunm_names):
                  row[colunm_name] = column_types[colunm_number](cur_line[colunm_number])
      
              item = dynamodb_table.new_item(
                          attrs=row
                  )           
              items.append(item)
      
              if count % BATCH_COUNT == 0:
                  print 'batch write start ... ', 
                  do_batch_write(items, table_name, dynamodb_table, dynamodb_conn)
                  items = []
                  print 'batch done! (row number: ' + str(count) + ')'
      
          # flush remaining items, if any
          if len(items) > 0: 
              do_batch_write(items, table_name, dynamodb_table, dynamodb_conn)
      
      
          csv_file.close() 
      
      
      def main():
          '''
          Demonstration of the use of import_csv_to_dynamodb()
          We assume the existence of a table named `test_persons`, with
          - Last_name as primary hash key (type: string)
          - First_name as primary range key (type: string)
          '''
          colunm_names = 'Last_name First_name'.split()
          table_name = 'test_persons'
          csv_file_name = 'test.csv'
          column_types = [str, str]
          import_csv_to_dynamodb(table_name, csv_file_name, colunm_names, column_types)
      
      
      if __name__ == "__main__":
          main()
          #cProfile.run('main()') # if you want to do some profiling
      

      Содержимое test.csv (должно находиться в той же папке, что и скрипт Python):

      John,Doe
      Bob,Smith
      Alice,Lee
      Foo,Bar
      a,b
      c,d
      e,f
      g,h
      i,j
      j,l
      
    0
    ответ дан Mostafa Hussein 17 March 2019 в 21:11
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: