本地环境中的Ruby+ Dynamodb的运行方法

113 阅读2分钟

如果你想在本地摆弄Dynamodb,而不必做所有麻烦的AWS签名,这里有最快的方法可以做到。

使用Docker Compose在本地主机中运行Dynamodb

要在localhost运行dynamodb,你可以使用docker和docker-compose。创建一个名为docker-compose.yml的文件

touch docker-compose.yml

粘贴以下内容到其中。

version: '3.8'
services:
  dynamodb-local:
    command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
    image: "amazon/dynamodb-local:latest"
    container_name: dynamodb-local
    ports:
      - "8000:8000"
    volumes:
      - "./docker/dynamodb:/home/dynamodblocal/data"
    working_dir: /home/dynamodblocal

一旦完成这些,你所要做的就是运行以下命令

-> docker-compose up
Starting dynamodb-local ... done
Attaching to dynamodb-local
dynamodb-local    | Initializing DynamoDB Local with the following configuration:
dynamodb-local    | Port: 8000
dynamodb-local    | InMemory: false
dynamodb-local    | DbPath: ./data
dynamodb-local    | SharedDb: true
dynamodb-local    | shouldDelayTransientStatuses: false
dynamodb-local    | CorsParams: *
dynamodb-local    |

我们就完成了!

连接到本地Dynamodb

在你的Gemfile中包含以下gem。

gem 'aws-sdk-dynamodb'

我将为单子实例类编写完整的代码。一开始可能看起来很吓人,但不要担心,我将为你分解它。

class Ddb
    include Singleton
   def client
      if ENV['ENDPOINT_URL'].blank?
        creds = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
        sts = Aws::STS::Client.new(credentials: creds, region: ENV['AWS_REGION'])
        role_credentials = Aws::AssumeRoleCredentials.new(client: sts, role_arn: ENV['AWS_ROLE_ARN'], role_session_name: 'random_ddb_session')
        dynamodb_client = Aws::DynamoDB::Client.new(region: ENV['AWS_REGION'], credentials: role_credentials)
        return dynamodb_client
      else
        Aws::DynamoDB::Client.new(endpoint: ENV['ENDPOINT_URL'])
      end
    end
  end

好了,让我们来看看其他部分。这是localhost的配置。上一步中你的ENPOINT_URL将是

ENDPOINT_URL="http://localhost:8000"

现在你可以得到一个dynamodb客户端的实例,并在上面做一些测试操作,如下所示

puts Ddb.instance.client.list_tables.table_names.count

当一切看起来不错时,代码将返回你刚运行的Dynamodb模型中的表的数量。

连接到AWS Dynamodb

现在我们深入了解一下上述代码中的if部分。如果没有定义endpoint_url,这意味着我们正试图连接到AWS Dynamodb。这里我们要利用基于角色的配置文件访问。

第一行创建凭证对象。这应该有access_key_id和你的secret_access_key。

creds = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])

然后,我们创建一个STS对象,如下所示

sts = Aws::STS::Client.new(credentials: creds, region: ENV['AWS_REGION'])

确保AWS_REGION已经通过,否则会导致错误。之后,我们用角色ARN和随机会话名称创建一个角色凭证。

role_credentials = Aws::AssumeRoleCredentials.new(client: sts, role_arn: ENV['AWS_ROLE_ARN'], role_session_name: 'random_ddb_session')

一旦你有了一切,你就可以创建一个客户端,并返回dynamodb客户端

dynamodb_client = Aws::DynamoDB::Client.new(region: ENV['AWS_REGION'], credentials: role_credentials)

如果你看到这是很简单的,你可以用这个客户端做任何你想做的事情,比如创建表,阅读/扫描表,等等。

希望这对你有帮助!