As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Usando o SDK for Ruby em uma instância Vagrant
Importante
O AWS OpsWorks Stacks serviço chegou ao fim da vida útil em 26 de maio de 2024 e foi desativado para clientes novos e existentes. É altamente recomendável que os clientes migrem suas cargas de trabalho para outras soluções o mais rápido possível. Se você tiver dúvidas sobre migração, entre em contato com a AWS Support equipe no AWS re:POST
Este tópico descreve como uma receita em execução em uma instância do Vagrant pode usar o AWS SDK for Ruby para fazer download de um arquivo do Amazon S3. Antes de começar, você deve primeiro ter um conjunto de AWS credenciais — uma chave de acesso e uma chave de acesso secreta — que permitam que a receita acesse o Amazon S3.
Importante
Recomendamos enfaticamente que você não use credenciais da conta raiz para essa finalidade. Em vez disso, crie um usuário com uma política adequada e forneça essas credenciais à receita.
Tenha cuidado para não colocar credenciais, nem mesmo credenciais de IAM usuário, em um local acessível ao público, por exemplo, fazendo o upload de um arquivo contendo as credenciais para um repositório público ou do Bitbucket. GitHub Isso expõe as credenciais e pode comprometer a segurança da conta.
As receitas executadas em uma EC2Amazon EC2 instância podem usar uma abordagem ainda melhor, uma IAM função, conforme descrito emUsando o SDK for Ruby em uma instância do AWS OpsWorks Stacks Linux.
O conteúdo entregue aos buckets do Amazon S3 pode conter conteúdo do cliente. Para obter mais informações sobre a remoção de dados confidenciais, consulte Como faço para esvaziar um bucket do S3? ou Como faço para excluir um bucket do S3?.
Se você ainda não tem um usuário do apropriado, crie um usuário conforme os procedimentos a seguir. Para obter mais informações, consulte O que é o IAM.
Atenção
IAMos usuários têm credenciais de longo prazo, o que representa um risco de segurança. Para ajudar a reduzir esse risco, recomendamos que você forneça a esses usuários somente as permissões necessárias para realizar a tarefa e que você os remova quando não forem mais necessários.
Para criar um usuário do IAM
Faça login no AWS Management Console e abra o IAM console em https://console.aws.amazon.com/iam/
. -
No painel de navegação, selecione Usuários e, se necessário, escolha Adicionar usuários para criar um novo usuário administrativo.
-
Na página Definir permissões, selecione Anexar políticas diretamente.
-
Digite
S3
na caixa de pesquisa Políticas de permissão para exibir as políticas do Amazon S3.Escolha Amazon ReadOnlyAccess S3. Se preferir, você pode especificar uma política que conceda permissões mais amplas, como o AmazonS3 FullAccess, mas a prática padrão é conceder somente as permissões necessárias. Nesse caso, a receita só baixará um arquivo, portanto, o acesso somente leitura é suficiente.
-
Escolha Próximo.
-
Escolha Criar usuário
-
seguir, crie chaves de acesso para seu usuário. Para obter mais informações sobre a criação de chaves de acesso, consulte Gerenciamento de chaves de acesso para IAM usuários no Guia IAM do usuário.
Em seguida, forneça um arquivo para download. Este exemplo pressupõe que você colocará um arquivo chamado myfile.txt
em um bucket do S3 recém-criado, chamado cookbook_bucket
.
Para fornecer um arquivo para download
-
Crie um arquivo chamado
myfile.txt
com o seguinte texto e salve-o em um local conveniente na sua estação de trabalho.This is the file that you just downloaded from Amazon S3.
-
No console do Amazon S3
, crie um bucket chamado cookbook_bucket
na região Padrão e faça upload demyfile.txt
no bucket.
Defina o livro de receitas da seguinte maneira.
Para configurar o livro de receitas
-
Crie um diretório em
opsworks_cookbooks
chamados3bucket
e navegue até ele. -
Inicialize e configure o Test Kitchen, conforme descrito em Exemplo 1: Instalação de pacotes.
-
Substitua o texto em
.kitchen.yml
pelo seguinte conteúdo.--- driver: name: vagrant provisioner: name: chef_solo environments_path: ./environments platforms: - name: ubuntu-14.04 suites: - name: s3bucket provisioner: solo_rb: environment: test run_list: - recipe[s3bucket::default] attributes:
-
Adicione dois diretórios a
s3bucket
:recipes
eenvironments
. -
Crie um arquivo de ambiente chamado
test.json
em que a seguinte seçãodefault_attributes
substitui os valoresaccess_key
esecret_key
pelas chaves correspondentes para o usuário do . Salve o arquivo na pastaenvironments
do livro de receitas.{ "default_attributes" : { "cookbooks_101" : { "access_key": "
AKIAIOSFODNN7EXAMPLE
", "secret_key" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
" } }, "chef_type" : "environment", "json_class" : "Chef::Environment" }
Há diversas maneiras de fornecer credenciais a uma receita em execução em uma instância. A principal consideração é limitar as chances de expor acidentalmente as chaves e comprometer a segurança de sua conta. Por esse motivo, não recomendamos usar valores de chave explícitos em seu código. O exemplo coloca os valores de chave no objeto de nó, o que permite que a receita faça referência a eles usando a sintaxe de nó em vez de expor valores literais. Você deve ter privilégios de raiz para acessar o objeto de nó, o que limita a possibilidade de que as chaves sejam expostas. Para obter mais informações, consulte Práticas recomendadas para gerenciar chaves de AWS acesso.
nota
Observe que o exemplo usa atributos aninhados, com cookbooks_101
como o primeiro elemento. Essa prática limita a chance de um conflito de nomes caso haja outros atributos access_key
ou secret_key
no objeto de nó.
A receita a seguir faz download de myfile.text
no bucket cookbook_bucket
.
gem_package "aws-sdk ~> 3" do action :install end ruby_block "download-object" do block do require 'aws-sdk' s3 = Aws::S3::Client.new( :access_key_id => "#{node['cookbooks_101']['access_key']}", :secret_access_key => "#{node['cookbooks_101']['secret_key']}") myfile = s3.bucket['cookbook_bucket'].objects['myfile.txt'] Dir.chdir("/tmp") File.open("myfile.txt", "w") do |f| f.write(myfile.read) f.close end end action :run end
A primeira parte da receita instala o SDK for Ruby, que é um pacote de gemas. O recurso gem_package
nota
Em geral, sua instância tem duas instâncias Ruby, que normalmente têm versões diferentes. Uma é uma instância dedicada que é usada pelo cliente do Chef. A outra é usada por aplicativos e receitas em execução na instância. É importante entender essa distinção ao instalar pacotes de gem, porque há dois recursos para instalar gems: gem_packagegem_package
; chef_gem
é apenas para pacotes de gem usados pelo cliente Chef.
O restante da receita é um recurso ruby_blockrequire 'aws-sdk'
antes de executar o recurso gem_package
. Como o SDK for Ruby ainda não foi instalado, a compilação falhará.
O código em um recurso ruby_block
não é compilado até que esse recurso seja executado. Neste exemplo, o ruby_block
recurso é executado após a conclusão da gem_package
instalação do SDK para Ruby, para que o código seja executado com êxito.
O código no ruby_block
funciona da seguinte maneira.
-
Cria um novo objeto
Aws::S3
, que fornece a interface do serviço.As chaves de acesso e as chaves secretas são especificadas por referência aos valores armazenados no objeto de nó.
-
Chama a associação
bucket.objects
do objetoS3
, que retorna um objetoAws::S3::Object
chamadomyfile
que representamyfile.txt
. -
Usa
Dir.chdir
para definir o diretório de trabalho como/tmp
. -
Abre um arquivo chamado
myfile.txt
, grava o conteúdo demyfile
no arquivo e fecha o arquivo.
Para executar a receita
-
Crie um arquivo chamado
default.rb
com a receita de exemplo e salve-o no diretóriorecipes
. -
Executar
kitchen converge
. -
Execute
kitchen login
para fazer login na instância e executels /tmp
. Você deverá vermyfile.txt
, junto com vários arquivos e diretórios do Test Kitchen.vagrant@s3bucket-ubuntu-1204:~$ ls /tmp install.sh kitchen myfile.txt stderr
Você também pode executar
cat /tmp/myfile.txt
para verificar se o conteúdo do arquivo está correto.
Quando terminar, execute kitchen destroy
para encerrar a instância.