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

如何为Lightsail实例分配IAM角色,解决Certbot续期TLS证书权限问题?

解决Lightsail实例通过IAM角色让Certbot访问Route53的问题

一、为Lightsail实例关联IAM角色的正确步骤

Lightsail关联IAM角色的逻辑和EC2不同,核心是要让角色信任Lightsail服务,而非EC2,具体步骤如下:

  1. 创建适配Lightsail的IAM角色

    • 配置角色的信任策略,允许lightsail.amazonaws.com作为可信实体,示例策略:
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "lightsail.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      
    • 给角色添加Route53权限策略,仅包含Certbot需要的最小权限,示例:
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "route53:GetHostedZone",
              "route53:ListHostedZones",
              "route53:ChangeResourceRecordSets"
            ],
            "Resource": [
              "arn:aws:route53:::hostedzone/你的托管区ID",
              "arn:aws:route53:::change/*"
            ]
          },
          {
            "Effect": "Allow",
            "Action": "route53:ListResourceRecordSets",
            "Resource": "arn:aws:route53:::hostedzone/你的托管区ID"
          }
        ]
      }
      
  2. 将IAM角色附加到Lightsail实例

    • 控制台操作:进入实例详情页 → 切换到「权限」标签 → 点击「附加IAM角色」,选择目标角色。
    • 自动化操作:用boto3的Lightsail客户端调用attach_instance_iam_role接口,示例代码:
      import boto3
      
      lightsail_client = boto3.client('lightsail')
      lightsail_client.attach_instance_iam_role(
          instanceName='你的实例名称',
          iamRoleName='你的IAM角色名称'
      )
      
  3. 验证角色生效状态
    在Lightsail实例内执行以下命令,检查是否能获取临时凭证:

    curl http://169.254.169.254/latest/meta-data/iam/security-credentials/你的角色名称
    

    返回包含AccessKeyId、SecretAccessKey、Token的JSON即说明角色生效,Certbot的Route53插件会自动读取这些临时凭证,无需手动配置密钥文件。

二、权限过期与Certbot续期的疑问解答

  • Lightsail实例关联的IAM角色会自动轮换临时凭证(默认有效期1小时,AWS后台自动处理刷新),无需手动重新关联角色。
  • Certbot在每次运行(包括续期)时,都会从实例元数据服务获取最新的临时凭证,只要角色的权限策略未变更,续期时就能正常完成Route53 DNS验证,不会出现权限失效问题。

三、为什么之前的iam:PassRole策略无效?

iam:PassRole权限是给执行「附加角色」操作的实体(比如你用boto3/Ansible的管理IAM用户)的权限,而非给Lightsail实例的。需要确保操作发起方的IAM实体具备该权限,且资源指向目标角色,示例策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::你的AWS账号ID:role/你的角色名称",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "lightsail.amazonaws.com"
        }
      }
    }
  ]
}

如果之前仅给实例角色添加iam:PassRole,自然不会生效,因为这个权限的作用对象是操作发起方。

四、最佳实践总结

  1. 绝对不要在Lightsail实例文件系统中存储IAM用户的访问密钥,完全用IAM角色替代。
  2. 角色的信任策略必须正确指向lightsail.amazonaws.com,权限策略遵循最小权限原则,仅保留Certbot需要的Route53操作。
  3. 自动化脚本的执行实体(管理IAM用户)需配置iam:PassRole权限,才能完成角色与实例的关联。
  4. Certbot续期无需额外配置,会自动获取最新临时凭证完成验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:54:59