Preciso armazenar chaves de API e outras informações confidenciais app.yaml
como variáveis de ambiente para implantação no GAE. O problema com isso é que se eu enviar app.yaml
para o GitHub, essa informação se tornará pública (não é boa). Não quero armazenar as informações em um armazenamento de dados, pois não se adequa ao projeto. Em vez disso, gostaria de trocar os valores de um arquivo que está listado em .gitignore
cada implantação do aplicativo.
Aqui está meu arquivo app.yaml:
application: myapp
version: 3
runtime: python27
api_version: 1
threadsafe: true
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
handlers:
- url: /static
static_dir: static
- url: /.*
script: main.application
login: required
secure: always
# auth_fail_action: unauthorized
env_variables:
CLIENT_ID: ${CLIENT_ID}
CLIENT_SECRET: ${CLIENT_SECRET}
ORG: ${ORG}
ACCESS_TOKEN: ${ACCESS_TOKEN}
SESSION_SECRET: ${SESSION_SECRET}
Alguma ideia?
Respostas:
Se forem dados confidenciais, você não deve armazená-los no código-fonte, pois eles serão verificados no controle de origem. As pessoas erradas (dentro ou fora da sua organização) podem encontrá-lo lá. Além disso, seu ambiente de desenvolvimento provavelmente usa valores de configuração diferentes de seu ambiente de produção. Se esses valores forem armazenados no código, você terá que executar códigos diferentes no desenvolvimento e na produção, o que é uma prática confusa e inadequada.
Em meus projetos, coloco dados de configuração no armazenamento de dados usando esta classe:
Seu aplicativo faria isso para obter um valor:
Se houver um valor para essa chave no armazenamento de dados, você o obterá. Se não houver, um registro de espaço reservado será criado e uma exceção será lançada. A exceção o lembrará de ir para o Developers Console e atualizar o registro de espaço reservado.
Acho que isso elimina a suposição de definir valores de configuração. Se você não tiver certeza de quais valores de configuração definir, apenas execute o código e ele lhe dirá!
O código acima usa a biblioteca ndb que usa memcache e o armazenamento de dados por baixo do capô, por isso é rápido.
Atualizar:
jelder perguntou como encontrar os valores do Datastore no console do App Engine e defini-los. Aqui está como:
Acesse https://console.cloud.google.com/datastore/
Selecione seu projeto no topo da página se ainda não estiver selecionado.
Na caixa suspensa Tipo , selecione Configurações .
Se você executou o código acima, suas chaves aparecerão. Todos eles terão o valor NOT SET . Clique em cada um e defina seu valor.
Espero que isto ajude!
fonte
Esta solução é simples, mas pode não se adequar a todas as equipes diferentes.
Primeiro, coloque as variáveis de ambiente em env_variables.yaml , por exemplo,
Então, inclua isso
env_variables.yaml
noapp.yaml
Finalmente, adicione o
env_variables.yaml
a.gitignore
, de modo que as variáveis secretas não existam no repositório.Neste caso, o
env_variables.yaml
precisa ser compartilhado entre os gerenciadores de implementação.fonte
process.env.MY_SECRET_KEY
e se você precisar dessas variáveis de ambiente em seu ambiente de desenvolvimento local, você pode usar odotenv
pacote de nóenv_variables.yaml
conseguiria todas as instâncias é uma peça que faltava no quebra-cabeça.gcloud app deploy
como você normalmente faz para implantar no Google Cloud. 2. Como definir variáveis de ambiente secretas localmente? Existem muitos caminhos. Você pode apenas usarexport
no prompt de comando ou usar qualquer ferramenta como @DaveKiss sugerido.os.environ.get('SECRET')
.Minha abordagem é armazenar os segredos do cliente apenas no próprio aplicativo do App Engine. Os segredos do cliente não estão no controle de origem nem em nenhum computador local. Isso tem a vantagem de que qualquer colaborador do App Engine pode implantar alterações de código sem ter que se preocupar com os segredos do cliente.
Eu armazeno os segredos do cliente diretamente no Datastore e uso o Memcache para melhorar a latência ao acessar os segredos. As entidades do Datastore precisam ser criadas apenas uma vez e persistirão em implantações futuras. é claro que o console do App Engine pode ser usado para atualizar essas entidades a qualquer momento.
Existem duas opções para executar a criação única da entidade:
fonte
A melhor maneira de fazer isso é armazenar as chaves em um arquivo client_secrets.json e excluí-lo do upload para o git, listando-o em seu arquivo .gitignore. Se você tiver chaves diferentes para ambientes diferentes, você pode usar a api app_identity para determinar qual é o id do aplicativo e carregar de forma adequada.
Há um exemplo bastante abrangente aqui -> https://developers.google.com/api-client-library/python/guide/aaa_client_secrets .
Aqui está um exemplo de código:
fonte
app.yaml
implantação do aplicativo. Alguma ideia aí?app.yaml
) com chaves secretas e informações confidenciais, e o que eu realmente gosto é que você está usando o fluxo de trabalho do Google para realizar a tarefa. Obrigado @GwynHowell. =)Isso não existia quando você postou, mas para qualquer outra pessoa que tropeçar aqui, o Google agora oferece um serviço chamado Secret Manager .
É um serviço REST simples (com SDKs que o envolvem, é claro) para armazenar seus segredos em um local seguro na plataforma em nuvem do Google. Esta é uma abordagem melhor do que o armazenamento de dados, exigindo etapas extras para ver os segredos armazenados e tendo um modelo de permissão mais refinado - você pode proteger segredos individuais de maneira diferente para diferentes aspectos do seu projeto, se necessário.
Ele oferece controle de versão, para que você possa lidar com alterações de senha com relativa facilidade, bem como uma consulta robusta e camada de gerenciamento que permite descobrir e criar segredos em tempo de execução, se necessário.
SDK Python
Exemplo de uso:
fonte
os.getenv('ENV_VAR')
s?SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))
. Configurando o padrão para usar oaccess_secret_version
Esta solução depende do appcfg.py obsoleto
Você pode usar a opção de linha de comando -E de appcfg.py para configurar as variáveis de ambiente ao implantar seu aplicativo no GAE (atualização de appcfg.py)
fonte
gcloud
utilitário?A maioria das respostas está desatualizada. Usar o armazenamento de dados em nuvem do Google é um pouco diferente agora. https://cloud.google.com/python/getting-started/using-cloud-datastore
Aqui está um exemplo:
Isso assume que o nome da entidade é 'TWITTER_APP_KEY', o tipo é 'configurações' e 'valor' é uma propriedade da entidade TWITTER_APP_KEY.
fonte
Parece que você pode fazer algumas abordagens. Temos um problema semelhante e fazemos o seguinte (adaptado ao seu caso de uso):
A maneira mais fácil de fazer isso é usar um servidor de integração contínua, como Hudson , Bamboo ou Jenkins . Basta adicionar algum plug-in, etapa de script ou fluxo de trabalho que faça todos os itens acima mencionados. Você pode passar variáveis de ambiente que são configuradas no próprio Bamboo, por exemplo.
Em resumo, basta inserir os valores durante o processo de construção em um ambiente ao qual você só tem acesso. Se você ainda não está automatizando suas compilações, deveria estar.
Outra opção de opção é o que você disse, coloque no banco de dados. Se o motivo para não fazer isso for porque as coisas estão muito lentas, simplesmente envie os valores para o memcache como um cache de segunda camada e fixe os valores nas instâncias como um cache de primeira camada. Se os valores podem mudar e você precisa atualizar as instâncias sem reinicializá-los, apenas mantenha um hash que você pode verificar para saber quando eles mudam ou acioná-lo de alguma forma quando algo que você faz muda os valores. Deve ser isso.
fonte
Você deve criptografar as variáveis com google kms e incorporá-las ao seu código-fonte. ( https://cloud.google.com/kms/ )
coloque o valor embaralhado (criptografado e codificado em base64) em sua variável de ambiente (no arquivo yaml).
Algum código pythonish para você começar a descriptografar.
fonte
@Jason F's resposta de base no uso do Google Datastore está próxima, mas o código está um pouco desatualizado com base no uso de amostra nos documentos da biblioteca . Aqui está o snippet que funcionou para mim:
Parcialmente inspirado por isso postagem do Medium
fonte
Só queria observar como resolvi esse problema em javascript / nodejs. Para o desenvolvimento local, usei o pacote npm 'dotenv' que carrega variáveis de ambiente de um arquivo .env em process.env. Quando comecei a usar o GAE, aprendi que as variáveis de ambiente precisam ser definidas em um arquivo 'app.yaml'. Bem, eu não queria usar 'dotenv' para desenvolvimento local e 'app.yaml' para GAE (e duplicar minhas variáveis de ambiente entre os dois arquivos), então escrevi um pequeno script que carrega variáveis de ambiente app.yaml no processo .env, para o desenvolvimento local. Espero que isso ajude alguém:
yaml_env.js:
Agora inclua esse arquivo o mais cedo possível em seu código e pronto:
fonte
.env
arquivo com as variáveis secretas. Não os estou duplicando em meuapp.yaml
arquivo e meu código implantado ainda funciona. Estou preocupado com o que acontece com o.env
arquivo na nuvem. É criptografado ou algo assim? Como posso garantir que ninguém acesse as.env
variáveis do arquivo gcloud depois que ele for implantado?Ampliando a resposta de Martin
fonte
Há um pacote pypi chamado gae_env que permite salvar variáveis de ambiente do appengine no Cloud Datastore. Nos bastidores, ele também usa Memcache, então é rápido
Uso:
Se houver um valor para essa chave no armazenamento de dados, ele será retornado. Se não houver, um registro de espaço reservado
__NOT_SET__
será criado e umValueNotSetError
será lançado. A exceção o lembrará de ir para o Developers Console e atualizar o registro de espaço reservado.Semelhante à resposta de Martin, aqui está como atualizar o valor da chave no Datastore:
Acesse a seção Datastore no console de desenvolvedores
Selecione seu projeto no topo da página se ainda não estiver selecionado.
Na caixa suspensa Tipo , selecione
GaeEnvSettings
.Chaves para as quais uma exceção foi levantada terão valor
__NOT_SET__
.Vá para a página GitHub do pacote para obter mais informações sobre uso / configuração
fonte