
如果你想在本地摆弄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)
如果你看到这是很简单的,你可以用这个客户端做任何你想做的事情,比如创建表,阅读/扫描表,等等。
希望这对你有帮助!