Lambda启动EC2实例时克隆私有Bitbucket仓库的最佳实践
启动EC2时克隆私有Bitbucket仓库的最佳实践
直接把SSH密钥存在S3确实不是安全的做法——一旦S3桶权限配置失误,密钥很容易泄露。结合你的Lambda启动EC2的场景,推荐下面几个业内常用的最佳实践:
方案1:Bitbucket App Password + SSM参数存储(最推荐)
这个方案不用管理SSH密钥,用Bitbucket的App Password做认证,同时通过AWS SSM参数存储安全存放凭证,避免硬编码:
在Bitbucket创建App Password:
- 登录Bitbucket,进入个人设置 → App passwords
- 创建一个新的App Password,只勾选Repository read权限(遵循最小权限原则),记录下生成的密码
将App Password存入SSM参数存储:
- 打开AWS控制台的Systems Manager → 参数存储,创建一个安全字符串类型的参数(比如命名为
/bitbucket/repo-read-password),把刚才的App Password存进去并启用加密
- 打开AWS控制台的Systems Manager → 参数存储,创建一个安全字符串类型的参数(比如命名为
配置EC2实例的IAM角色:
- 给EC2使用的IAM角色添加
AmazonSSMReadOnlyAccess权限(或者更细粒度的权限,仅允许读取这个特定参数)
- 给EC2使用的IAM角色添加
在user_data脚本中获取凭证并克隆仓库:
脚本示例:# 安装AWS CLI(如果EC2镜像自带可跳过) yum install -y aws-cli # 从SSM参数存储获取App Password BITBUCKET_PASSWORD=$(aws ssm get-parameter --name "/bitbucket/repo-read-password" --with-decryption --query Parameter.Value --output text) # 克隆私有仓库(替换为你的用户名和仓库地址) git clone https://your-bitbucket-username:$BITBUCKET_PASSWORD@bitbucket.org/your-team/your-repo.git
方案2:Secrets Manager存储SSH密钥 + IAM角色访问
如果你更倾向于用SSH方式克隆,可以把SSH私钥存在AWS Secrets Manager,通过IAM角色让EC2安全读取:
准备Bitbucket SSH公钥:
- 本地执行
ssh-keygen -t ed25519生成一对SSH密钥,把公钥添加到Bitbucket的仓库或个人SSH密钥列表中
- 本地执行
将私钥存入Secrets Manager:
- 在AWS Secrets Manager中创建一个新的秘密,把私钥内容作为SecretString存储并启用加密
配置EC2 IAM角色权限:
- 给EC2角色添加
secretsmanager:GetSecretValue权限,限制仅能访问这个特定的SSH密钥秘密
- 给EC2角色添加
user_data脚本配置SSH并克隆:
yum install -y aws-cli # 从Secrets Manager获取SSH私钥 aws secretsmanager get-secret-value --secret-id "bitbucket-ssh-private-key" --query SecretString --output text > /tmp/id_rsa chmod 600 /tmp/id_rsa # 克隆仓库,指定私钥(生产环境可预先添加Bitbucket主机密钥到known_hosts替代StrictHostKeyChecking=no) git clone git@bitbucket.org:your-team/your-repo.git --config core.sshCommand="ssh -i /tmp/id_rsa -o StrictHostKeyChecking=no"
方案3:镜像Bitbucket仓库到CodeCommit(适合长期同步场景)
如果你的团队已经在使用AWS生态,可以把Bitbucket仓库镜像到AWS CodeCommit,然后EC2通过IAM角色直接访问CodeCommit,不用处理Bitbucket的认证:
配置Bitbucket到CodeCommit的镜像同步:
- 在CodeCommit创建一个新仓库,设置Bitbucket的Webhook实现代码自动同步,或者用AWS Lambda定期拉取同步
配置EC2 IAM角色权限:
- 给EC2角色添加
CodeCommitReadOnly权限
- 给EC2角色添加
user_data中克隆CodeCommit仓库:
git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/your-codecommit-repoEC2会自动使用IAM角色的权限进行认证,不需要额外凭证
通用安全注意事项
- 最小权限原则:不管用哪个方案,给IAM角色、Bitbucket App Password的权限都只保留必要的(比如仅仓库只读权限)
- 禁止硬编码:永远不要把凭证直接写在user_data脚本里,用SSM或Secrets Manager统一管理
- 定期轮换凭证:定期更新Bitbucket App Password或SSH密钥,Secrets Manager支持自动轮换密钥
- 监控执行日志:开启EC2的CloudWatch日志,监控user_data脚本的执行情况,及时排查异常
内容的提问来源于stack exchange,提问作者Raúl Reguillo Carmona
相关产品推荐
相关产品推荐

