我有一个托管在 Heroku 上的烧瓶应用程序,它需要使用 boto.cmdshell 在 AWS EC2 实例(Amazon Linux AMI)上运行命令。几个问题:
- 使用密钥对访问 EC2 实例是最佳实践吗?还是使用用户名/密码更好?
- 如果使用密钥对是首选方法,那么在 Heroku 上管理/存储私钥的最佳做法是什么?显然,将私钥放在 git 中不是一种选择。
谢谢。
Heroku 允许您利用配置变量来管理您的应用程序。这是我的 config.py 文件的示例,它位于我的烧瓶应用程序中:
import os
# flask
PORT = int(os.getenv("PORT", 5000))
basedir = str(os.path.abspath(os.path.dirname(__file__)))
SECRET_KEY = str(os.getenv("APP_SECRET_KEY"))
DEBUG = str(os.getenv("DEBUG"))
ALLOWED_EXTENSIONS = str(os.getenv("ALLOWED_EXTENSIONS"))
TESTING = os.getenv("TESTING", False)
# s3
AWS_ACCESS_KEY_ID = str(os.getenv("AWS_ACCESS_KEY_ID"))
AWS_SECRET_ACCESS_KEY = str(os.getenv("AWS_SECRET_ACCESS_KEY"))
S3_BUCKET = str(os.getenv("S3_BUCKET"))
S3_UPLOAD_DIRECTORY = str(os.getenv("S3_UPLOAD_DIRECTORY"))
现在我可以有两组不同的结果。它从我的环境变量中提取。一个当我的应用程序在我的本地计算机上并且在生产时来自 Heroku 配置变量时。例如。
DEBUG = str(os.getenv("DEBUG"))
在我的本地计算机上为“TRUE”。但是在 Heroku 上是错误的。为了检查您的 Heroku 配置运行。
Heroku config
另外请记住,如果您想将某些文件保留在本地而不是 heroku 或 github 上,您可以使用git ignore。当然,那时这些文件将不存在于您的生产应用程序中。
我正在寻找的是关于如何处理私钥的指导。@DrewV 和 @yfeldblum 都为我指明了正确的方向。我最终将我的私钥变成了一个字符串并将其存储在 Heroku 配置变量中。
如果有人想做类似的事情,这里有一个使用 paramiko 的示例代码片段:
import paramiko, base64
import StringIO
import os
key = paramiko.RSAKey.from_private_key(StringIO.StringIO(str(os.environ.get("AWS_PRIVATE_KEY"))))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(str(os.environ.get("EC2_PUBLIC_DNS")), username='ec2-user', pkey=key)
stdin, stdout, stderr = ssh.exec_command('ps')
for line in stdout:
print '... ' + line.strip('\n')
ssh.close()
感谢@DrewV 和@yfeldblum 的帮助(为两者投票)。
您可以使用config vars将配置项存储在 Heroku 上运行的应用程序中。
您可以使用用户名/密码组合。您可以使用户名变得简单;但一定要生成一个强密码,例如,使用类似openssl rand -base64 32
.