You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ebextensions文件中用环境变量跨AWS账号获取S3中的SSL证书

实现跨AWS账号从S3下载SSL证书的EB配置方案

我来帮你一步步搞定这个需求,先提个小提醒:IAM角色本身没有长期的Access Key/Secret,如果你想用密钥对的方式,得先在AWS1创建一个带S3访问权限的IAM用户;不过更安全的做法是用跨账号角色获取临时凭证,我把两种方案都整理好了,你可以按需选。

1. 先搞定AWS1侧的权限配置

不管用哪种方案,首先得确保AWS1的身份(用户/角色)能访问存储证书的S3桶:

  • 给IAM用户/角色附加这个权限政策,替换成你的桶名:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::你的证书存储桶名称/*"
    }
  ]
}
  • 如果用跨账号角色,还要修改角色的信任策略,允许AWS2的EB实例角色来假定它:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AWS2账号ID:role/aws-elasticbeanstalk-ec2-role"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

2. 在AWS2的EB环境配置环境变量

登录AWS2的Elastic Beanstalk控制台,进入你的应用环境,找到「配置」→「软件」,添加这些环境变量:

  • AWS1_REGION: AWS1的S3桶所在区域(比如us-east-1)
  • S3_CERT_BUCKET: AWS1的证书存储桶名称
  • S3_CERT_KEY: SSL证书在S3里的路径(比如certs/my-ssl-cert.pem)
  • (如果用IAM用户方案)还要加AWS1_ACCESS_KEY_ID和AWS1_SECRET_ACCESS_KEY,对应AWS1的IAM用户密钥

3. 创建ebextensions配置文件

在你的应用代码根目录下新建.ebextensions文件夹,然后在里面创建download-ssl-cert.config文件,二选一用下面的内容:

方案一:用IAM用户的长期密钥(不推荐,仅用于特殊场景)

files:
  "/tmp/download-cert.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      # 从环境变量取配置
      AWS_ACCESS_KEY_ID=$AWS1_ACCESS_KEY_ID
      AWS_SECRET_ACCESS_KEY=$AWS1_SECRET_ACCESS_KEY
      AWS_REGION=$AWS1_REGION
      S3_BUCKET=$S3_CERT_BUCKET
      S3_KEY=$S3_CERT_KEY
      # 改成你应用需要的证书存放路径,比如Nginx的默认路径是/etc/nginx/certs/
      DEST_PATH="/etc/pki/tls/certs/"

      # 先创建目标目录
      mkdir -p $DEST_PATH

      # 用AWS CLI下载证书
      aws s3 cp s3://$S3_BUCKET/$S3_KEY $DEST_PATH \
        --region $AWS_REGION

commands:
  01-run-download-script:
    command: "/tmp/download-cert.sh"
    env:
      AWS1_ACCESS_KEY_ID: { "Ref": "AWS1_ACCESS_KEY_ID" }
      AWS1_SECRET_ACCESS_KEY: { "Ref": "AWS1_SECRET_ACCESS_KEY" }
      AWS1_REGION: { "Ref": "AWS1_REGION" }
      S3_CERT_BUCKET: { "Ref": "S3_CERT_BUCKET" }
      S3_CERT_KEY: { "Ref": "S3_CERT_KEY" }

方案二:用跨账号角色(推荐,更安全)

这个方案不需要长期密钥,用临时凭证访问S3:

packages:
  yum:
    jq: [] # 安装jq用来解析STS返回的JSON,亚马逊Linux2需要这个

files:
  "/tmp/download-cert.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      # 替换成AWS1的跨账号角色ARN
      AWS1_ROLE_ARN="arn:aws:iam::AWS1账号ID:role/你的跨账号角色名"
      AWS_REGION=$AWS1_REGION
      S3_BUCKET=$S3_CERT_BUCKET
      S3_KEY=$S3_CERT_KEY
      DEST_PATH="/etc/pki/tls/certs/"

      # 假定角色获取临时凭证
      CREDS=$(aws sts assume-role --role-arn $AWS1_ROLE_ARN --role-session-name eb-cert-download)
      export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId')
      export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey')
      export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken')

      # 创建目录并下载证书
      mkdir -p $DEST_PATH
      aws s3 cp s3://$S3_BUCKET/$S3_KEY $DEST_PATH --region $AWS_REGION

commands:
  01-run-download-script:
    command: "/tmp/download-cert.sh"
    env:
      AWS1_REGION: { "Ref": "AWS1_REGION" }
      S3_CERT_BUCKET: { "Ref": "S3_CERT_BUCKET" }
      S3_CERT_KEY: { "Ref": "S3_CERT_KEY" }

另外,还要给AWS2的EB实例角色添加允许假定角色的权限,政策如下:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::AWS1账号ID:role/你的跨账号角色名"
    }
  ]
}

4. 部署验证

把.ebextensions文件夹和你的应用代码一起打包,部署到AWS2的EB环境。部署完成后,你可以登录EB的EC2实例,检查证书是否已经下载到指定路径,比如执行ls /etc/pki/tls/certs/看看有没有你的证书文件。

几个重要的注意点

  • 安全优先:长期密钥有泄露风险,强烈推荐用跨账号角色的方案,避免存储和使用长期Access Key/Secret。
  • 确保EB实例所在的VPC能访问S3:如果是私有VPC,需要配置S3 VPC端点或者NAT网关,不然实例连不上S3。
  • 证书路径要匹配你的应用:比如Apache可能用/etc/httpd/conf.d/ssl/,Nginx用/etc/nginx/certs/,记得修改DEST_PATH。
  • 如果用的是亚马逊Linux以外的OS(比如Ubuntu),要把packages里的yum改成apt,比如:
packages:
  apt:
    jq: []

内容的提问来源于stack exchange,提问作者Prathamesh Datar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:18:23