为何无法在Google Cloud Function中执行ssh-keygen命令?
解决Cloud Functions调用ssh-keygen报错的问题
问题根源
Cloud Functions的运行时是精简的容器镜像,没预装ssh-keygen这类OpenSSH工具,而Cloud Shell是完整的Linux环境,所以能直接跑命令,两者环境不一样。
可行解决办法
办法1:用Python原生库生成SSH密钥(推荐)
不用依赖系统工具,直接用cryptography库生成兼容OpenSSH的密钥对,示例代码:
from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives import serialization from cryptography.hazmat.backends import default_backend def generate_ssh_key(): # 生成2048位私钥 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048, backend=default_backend() ) # 转成OpenSSH格式的私钥字符串 private_pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.OpenSSH, encryption_algorithm=serialization.NoEncryption() ).decode('utf-8') # 生成对应公钥 public_key = private_key.public_key() public_pem = public_key.public_bytes( encoding=serialization.Encoding.OpenSSH, format=serialization.PublicFormat.OpenSSH ).decode('utf-8') return private_pem, public_pem
生成密钥后,把公钥添加到GCE实例的metadata里,就能实现SSH连接。
办法2:自定义Cloud Functions运行镜像(适合必须用ssh-keygen的场景)
构建包含OpenSSH工具的自定义镜像,部署到Cloud Functions:
- 写Dockerfile示例:
FROM gcr.io/google.com/cloudsdktool/cloud-sdk:latest RUN apt-get update && apt-get install -y openssh-client python3-pip # 复制你的函数代码和依赖文件 COPY . /workspace WORKDIR /workspace RUN pip install -r requirements.txt CMD ["functions-framework", "--target", "你的函数名"]
把镜像推送到Artifact Registry,再部署Cloud Functions时指定用这个镜像。
办法3:用GCP官方工具简化连接
不用手动处理密钥,直接用gcloud compute ssh命令(需确保Cloud Functions的服务账号有GCE相关权限),但同样需要在自定义镜像里装gcloud和openssh-client。
重要提醒
- Cloud Functions的服务账号得有
compute.instances.setMetadata权限,才能往GCE实例里加公钥 - 私钥要妥善存储,别泄露
内容的提问来源于stack exchange,提问作者Matthew Burkhardt
相关产品推荐
相关产品推荐

