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

CloudFormation中使用UserData传递RDS端点至EC2实例失败,求助解决方案

解决CloudFormation中传递RDS端点到EC2实例的问题

我来帮你搞定这个CloudFormation里传递RDS端点到EC2的问题!你之前的核心思路没问题,但大概率是在UserData的编码和变量替换环节出了岔子,下面给你梳理清楚正确的实现方式。

首先,要实现把RDS端点写入EC2实例的文本文件,关键是要让CloudFormation正确把动态生成的RDS端点值注入到EC2的UserData脚本里,同时做好Base64编码(EC2要求UserData必须是Base64格式)。

下面是完整的可运行模板示例,我会标注关键细节:

AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  MyKeyPair:
    Type: AWS::EC2::KeyPair::KeyName
    Description: 你已创建的EC2密钥对名称
Resources:
  MySecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: 允许SSH访问EC2,同时允许EC2访问RDS
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0 # 生产环境请限制为你的公网IP,不要用0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 3306 # 这里假设是MySQL RDS,根据你的数据库类型调整端口
          ToPort: 3306
          SourceSecurityGroupId: !Ref MySecurityGroup
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceClass: db.t2.micro
      Engine: MySQL
      MasterUsername: dbadmin
      MasterUserPassword: YourSecurePassword123 # 生产环境请用参数存储或Secrets Manager,不要明文写
      AllocatedStorage: 20
      PubliclyAccessible: false
      VPCSecurityGroups:
        - !Ref MySecurityGroup
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-74e6b80d # 注意:这个AMI版本较旧,建议换成当前区域可用的Amazon Linux 2或Ubuntu AMI
      InstanceType: t2.nano
      SecurityGroups:
        - !Ref MySecurityGroup
      KeyName: !Ref MyKeyPair # 这里要修正:你原来的数组写法是错的,KeyName是单个字符串值
      UserData:
        Fn::Base64:
          Fn::Sub: |
            #!/bin/bash
            # 将RDS端点地址写入实例内的文本文件
            echo "${MyRDSInstance.Endpoint.Address}" > /rds-endpoint.txt
            # 可选:验证文件内容(部署后可通过SSH查看)
            cat /rds-endpoint.txt

关键细节说明:

  • RDS端点的引用:通过Fn::GetAtt(简写!GetAtt)获取MyRDSInstance.Endpoint.Address,在Fn::Sub中直接用${MyRDSInstance.Endpoint.Address}就能完成动态值替换
  • UserData的正确格式:必须用Fn::Base64包裹脚本内容,同时嵌套Fn::Sub来处理变量替换——CloudFormation部署时会先把变量替换成实际值,再编码成Base64传给EC2
  • KeyName的修正:你之前把KeyName写成了数组(带-),这不符合CloudFormation的属性要求,KeyName只接受单个字符串值,直接用!Ref MyKeyPair即可
  • 安全组配置:要确保EC2的安全组能访问RDS的数据库端口,同时RDS的安全组允许来自EC2安全组的访问,不然EC2连不上RDS

部署这个模板后,EC2实例启动时会自动执行UserData里的脚本,把RDS的端点地址写入/rds-endpoint.txt文件,你可以通过SSH登录实例查看这个文件验证结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:28