我有一个使用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文档的参数。
答案 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)。
我们使用与VPC安全组相同的机制,使用Ingress&amp;出口规则,所以我们可以有两个SG参考。