我的团队正在开发一种产品,该产品可以启动带有某些软件的新EC2实例,并且在实例的启动过程中运行一小段python代码,以将其注册到Route53 DNS中。 EC2实例和我们的Route53在不同的AWS账户中。
虽然此python代码工作得很漂亮,但我现在的任务是用golang重写此软件。
我已经使用适当的策略在Route53的帐户中创建了IAM角色,并且工作正常。我还允许其他AWS帐户调用它,并且它也很好用。 python代码可以使用此IAM角色承担角色,因此可以在Route53中创建新的RecordSet。但是,当我尝试使用golang代码执行此操作时,我得到...
AccessDenied: Access denied
status code: 403, request id: xxxxxxx-yyyyyyyy-zzzzzzzz
这是我对IAM的理解所能做到的:
(...)
sess := session.Must(session.NewSession())
svc := sts.New(sess)
input := &sts.AssumeRoleInput{
DurationSeconds: aws.Int64(900),
ExternalId: aws.String("register-dns"),
RoleArn: aws.String(roleARN),
RoleSessionName: aws.String(roleSessionName),
}
result, err := svc.AssumeRole(input)
check(err)
creds := stscreds.NewCredentials(sess, roleARN)
service := route53.New(sess, &aws.Config{Credentials: creds})
inputs := &route53.ChangeResourceRecordSetsInput{
ChangeBatch: &route53.ChangeBatch{
Changes: []*route53.Change{
{
Action: aws.String("UPSERT"),
ResourceRecordSet: &route53.ResourceRecordSet{
Name: aws.String(instanceName + ".mycompany.com"),
ResourceRecords: []*route53.ResourceRecord{
{
Value: aws.String(hostIP),
},
},
TTL: aws.Int64(60),
Type: aws.String("A"),
},
},
},
Comment: aws.String(instanceName),
},
HostedZoneId: aws.String(hostedZoneID),
}
resultR53, err := service.ChangeResourceRecordSets(inputs)
(...)
这时,我期望我的代码担当IAM角色roleARN
,并在Route53中创建一个RecordSet。但是,相反,我一直在不断被拒绝访问。
访问其他AWS账户中的某些AWS资源是否正确?
谢谢!
我用作基础的东西: https://docs.aws.amazon.com/sdk-for-go/api/service/sts/#STS.AssumeRole
https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/stscreds