使用应用层的Cloudformation授予对RDS图层的访问权限

时间:2014-12-08 10:55:42

标签: amazon-cloudformation

我有一个使用Cloudformation启动的RDS数据库。现在我有一个Cloudformation文档,它会调出我的应用服务器层。如何授予我的应用服务器访问RDS实例的权限?

如果RDS实例是由我的Cloudformation文档创建的,我知道我可以这样做:

"DBSecurityGroup": {
        "Type": "AWS::RDS::DBSecurityGroup",
        "Properties": {
            "EC2VpcId" : { "Ref" : "VpcId" },
            "DBSecurityGroupIngress": { "EC2SecurityGroupId": { "Fn::GetAtt": [ "AppServerSecurityGroup", "GroupId" ]} },
            "GroupDescription"      : "Frontend Access"
        }
    }

但是当我运行我的应用程序cloudformation时,DBSecurityGroup已经存在。我该如何更新?

更新根据huelbois在下面向我指出的内容,我了解到我可以在我的应用程序Cloudformation中创建一个AWS :: EC2 :: SecurityGroupIngress。由于我使用的是VPC并且发布的代码为huelbois,因此我可以确认这是有效的:

在RDS Cloudformation中:

    "DbVpcSecurityGroup" : {
        "Type" : "AWS::EC2::SecurityGroup",
        "Properties" : {
            "GroupDescription" : "Enable JDBC access on the configured port",
            "VpcId" : { "Ref" : "VpcId" },
            "SecurityGroupIngress" : [  ]
        }
    }

在app Cloudformation中:

  "specialRDSRule" : {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties" : {
          "IpProtocol": "tcp",
          "FromPort": 5432,
          "ToPort": 5432,
          "GroupId": {"Ref": "DbSecurityGroupId"},
          "SourceSecurityGroupId": {"Ref": "InstanceSecurityGroup"}
      }
  }

其中DbSecurityGroupId是上面的组设置的ID(类似于sg-27324c43),并且是应用程序Cloudformation文档的参数。

1 个答案:

答案 0 :(得分:2)

如果要在CloudFormation模板中使用现有资源,可以使用以前创建的ID,而不是Ref或GetAtt。

在您的示例中,您可以使用:

  

{“EC2SecurityGroupId”:“sg-xxxNNN”}

其中“sg-xxxNNN”是您的数据库安全组的ID(不确定DB SecurityGroup前缀,因为我们不使用EC2-classic而是VPC)。

我建议您在模板中使用SecurityGroup的参数。

***更新**

对于您的特定设置,我将使用“DBSecurityGroupIngress”资源向您的RDS实例添加新的sg。

在第一个堆栈(RDS)中,您创建一个空的DBSecurityGroup,如下所示:

"DBSecurityGroup": {
    "Type": "AWS::RDS::DBSecurityGroup",

    "Properties": {
        "EC2VpcId" : { "Ref" : "VpcId" },
        "DBSecurityGroupIngress": [],
        "GroupDescription"      : "Frontend Access"
    }
}

DBInstance引用了此DBSecurityGroup。 (我猜你有使用DBSecurityGroup而不是VPCSecurityGroup的具体要求。)

在您的App堆栈中,您创建一个DBSecurityGroupIngress资源,该资源是您在第一个堆栈中创建的DBSecurityGroup的子代:

"specialRDSRule" : {
    "Type":"AWS::RDS::DBSecurityGroupIngress",
    "Properties" : {
       "DBSecurityGroupName": "<the arn of the DBSecurityGroup>",  
       "CIDRIP": String,
       "EC2SecurityGroupId": String,
       "EC2SecurityGroupName": String,
       "EC2SecurityGroupOwnerId": String
    }   
}

您需要DBSecurityGroup的arn,即“arn:aws:rds ::: secgrp:”。其他参数来自您的App堆栈,不确定您是否需要所有内容(我不做EC2-经典安全组,只有VPC)。

参考:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-security-group-ingress.html

我们使用与VPC安全组相同的机制,使用Ingress&amp;出口规则,所以我们可以有两个SG参考。