我需要在aws lambda(lambda运行时是python)中克隆一个私人git repo。经过研究后,我知道我需要在/tmp
目录中克隆存储库,因为它是lambda中唯一可访问的目录。另外,我需要使用私钥将SSH SSH到github。
基本上,我的代码如下:
import git # lambda-git
import os
private_key = """-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
"""
with open("/tmp/id_rsa", "w") as id_rsa:
id_rsa.write(private_key)
os.chmod("/tmp/id_rsa", 600)
os.environ["GIT_SSH_COMMAND"] = 'ssh -i /tmp/id_rsa -o StrictHostKeyChecking=no'
git.exec_command("clone", "git@domain:repo_name.git", "/tmp")
但是,将压缩文件夹上传到lambda后,出现以下错误
Could not create directory \\'/home/sbx_user1051/.ssh\\'.
Failed to add the host to the list of known hosts (/home/sbx_user1051/.ssh/known_hosts).
Load key \"/tmp/id_rsa\": Permission denied
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
我想念什么?还是有可能在AWS Lambda中克隆一个私有仓库? 任何帮助表示赞赏。
PS。我知道我可以使用git令牌并通过https克隆仓库。但是我无法修改回购网址,而必须按原样使用git@domain:repo_name.git
。
答案 0 :(得分:1)
我终于找到了答案。
将权限代码从600
更改为0o600
解决了这个问题!
答案 1 :(得分:0)
感谢您发布您的解决方案@coding-monkey
我的问题是我使用了 os.system("export GIT_SSH_COMMAND... 而不是 os.environ["GIT_SSH_COMMAND"]
以防万一有人需要,这是我的解决方案:
import os
def lambda_handler(event, context):
os.system('rm -rf /tmp/*')
os.system("""cat >/tmp/id_rsa <<EOL
-----BEGIN OPENSSH PRIVATE KEY-----
ATTENTION, DO NOT STORE PRIVATE KEYS IN CODE, THIS IS ONLY DEMONSTRATION
-----END OPENSSH PRIVATE KEY-----
EOL""")
os.chmod('/tmp/id_rsa', 0o600)
os.system('ssh-keyscan -t rsa github.com | tee /tmp/known_hosts | ssh-keygen -lf -')
os.environ['GIT_SSH_COMMAND'] = 'ssh -o UserKnownHostsFile=/tmp/known_hosts -i /tmp/id_rsa'
os.system('git clone git@github.com:<privaterepo>.git /tmp/aws2')
return {"test": "123"}