首页 > 解决方案 > Grails Amazon Web Services Plugin route53 Error On Using Route53 ChangeResourceRecordSets

问题描述

我正在尝试使用带有用于 route53 的 aws 服务插件的 grails 创建一个新的 route53 记录集。

我目前正在使用 Grails 2.4.5 并为 grails 2.4.5 使用 AmazonWebService 插件

我正在尝试使用这个插件在 route53 上创建一个新的 route53 记录集。

在我的 BuildConfig.groovy 上,我使用了这个插件来访问 aws Web 服务。

compile ":aws-sdk:1.10.44"

关于 route53 更改资源记录集,我需要你们的帮助。

这是我的代码。

import com.amazonaws.services.route53.AmazonRoute53Client
import com.amazonaws.services.route53.model.AliasTarget
import com.amazonaws.services.route53.model.Change
import com.amazonaws.services.route53.model.ChangeAction
import com.amazonaws.services.route53.model.ChangeBatch
import com.amazonaws.services.route53.model.ChangeResourceRecordSetsRequest
import com.amazonaws.services.route53.model.ChangeResourceRecordSetsResult
import com.amazonaws.services.route53.model.RRType
import com.amazonaws.services.route53.model.ResourceRecord
import com.amazonaws.services.route53.model.ResourceRecordSet
import grails.plugin.awssdk.AmazonWebService
import grails.transaction.Transactional

@Transactional
class AwsRoute53Service {

    AmazonWebService amazonWebService

    ChangeResourceRecordSetsResult changeRecordSet() {
        AmazonRoute53Client route53Client = amazonWebService.route53

        AliasTarget target = new AliasTarget('hostedZoneIDHere', 'app.sample.com.')

        target.setEvaluateTargetHealth(true)

        List<ResourceRecord> resourceRecords = new ArrayList<>()

        resourceRecords.add(new ResourceRecord('dNSNameHere'))

        ResourceRecordSet recordSet = new ResourceRecordSet('app.sample.com.', RRType.A)

        recordSet.setAliasTarget(target)
        recordSet.setResourceRecords(resourceRecords)
        recordSet.setTrafficPolicyInstanceId('simple')

        List<Change> changes = new ArrayList<>()

        changes.add(new Change(ChangeAction.CREATE, recordSet))

        ChangeBatch changeBatch = new ChangeBatch(changes)

        ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest('hostedZoneIDHere', changeBatch)

        return route53Client.changeResourceRecordSets(request)
    }
}

当我尝试更改 route53 资源记录集时,出现以下错误。

Invalid request: Expected exactly one of [AliasTarget, all of [TTL, and ResourceRecords], or TrafficPolicyInstanceId], but found more than one in Change with [Action=CREATE, Name=app.sample.com., Type=A, SetIdentifier=null] (Service: AmazonRoute53; Status Code: 400; Error Code: InvalidInput; Request ID: 2ca80154-78a7-11e9-b5e7-f7bc7c79e5e6). Stacktrace follows:
Message: Invalid request: Expected exactly one of [AliasTarget, all of [TTL, and ResourceRecords], or TrafficPolicyInstanceId], but found more than one in Change with [Action=CREATE, Name=app.sample.com., Type=A, SetIdentifier=null] (Service: AmazonRoute53; Status Code: 400; Error Code: InvalidInput; Request ID: 2ca80154-78a7-11e9-b5e7-f7bc7c79e5e6)

你能告诉我设置有什么问题吗?

如果你现在能帮我解决我的问题,我会很高兴。我真的需要你们的帮助。

标签: amazon-web-servicesgrailsamazon-route53

解决方案


以下是我的问题的确切答案

import com.amazonaws.services.route53.AmazonRoute53Client
import com.amazonaws.services.route53.model.AliasTarget
import com.amazonaws.services.route53.model.Change
import com.amazonaws.services.route53.model.ChangeAction
import com.amazonaws.services.route53.model.ChangeBatch
import com.amazonaws.services.route53.model.ChangeResourceRecordSetsRequest
import com.amazonaws.services.route53.model.ChangeResourceRecordSetsResult
import com.amazonaws.services.route53.model.RRType
import com.amazonaws.services.route53.model.ResourceRecord
import com.amazonaws.services.route53.model.ResourceRecordSet
import grails.plugin.awssdk.AmazonWebService
import grails.transaction.Transactional

@Transactional
class AwsRoute53Service {

    private static final String DOMAIN_NAME_SERVER = "${System.env.DOMAIN_NAME_SERVER}"
    private static final String HOSTED_ZONE_ID = "${System.env.HOSTED_ZONE_ID}"

    AmazonWebService amazonWebService

    ChangeResourceRecordSetsResult changeRecordSet() {
        AmazonRoute53Client route53Client = amazonWebService.route53

        GetHostedZoneResult hostedZoneResult = route53Client.getHostedZone(new GetHostedZoneRequest(HOSTED_ZONE_ID))
        HostedZone hostedZone = hostedZoneResult.getHostedZone()

        ResourceRecordSet resourceRecordSet = new ResourceRecordSet()
            .withName('dNSName')
            .withType(RRType.CNAME)
            .withTTL(60)
            .withResourceRecords([
                new ResourceRecord().withValue(DOMAIN_NAME_SERVER)
            ])

        ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest()
            .withHostedZoneId(hostedZone.id)
            .withChangeBatch(
                new ChangeBatch()
                    .withChanges([
                        new Change()
                            .withAction(ChangeAction.CREATE)
                            .withResourceRecordSet(resourceRecordSet)
                    ])
            )

        return route53Client.changeResourceRecordSets(request)
    }
}

推荐阅读