【问题标题】:How to list resources of linked AWS accounts using AWS Go sdk如何使用 AWS Go sdk 列出链接的 AWS 账户的资源
【发布时间】:2022-11-21 06:14:54
【问题描述】:

这是我试过的。下面的代码获取关联账户的列表,但只获取一个 AWS 账户的域列表。我想列出每个特定链接帐户的域或任何其他资源。

问题似乎出在svc := route53.New(sess)sess 本身,因为帐户 ID 未传递给 svcsess。那么问题来了,如何传递account Id呢?

package main

import (
    "context"
    "crypto/tls"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/organizations"
    "github.com/aws/aws-sdk-go-v2/service/route53domains"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/route53"
)

func main() {

    // Load the Shared AWS Configuration (~/.aws/config)
    cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithDefaultRegion("us-east-1"))
    if err != nil {
        log.Fatal(err)
    }

    // Create an Amazon service clients
    awsOrgClient := organizations.NewFromConfig(cfg)
    awsRoute53DomainsClient := route53domains.NewFromConfig(cfg)

    // Build the request with its input parameters
    resp, err := awsOrgClient.ListAccounts(context.TODO(), &organizations.ListAccountsInput{})
    if err != nil {
        log.Fatalf("failed to list tables, %v", err)
    }

    fmt.Println("Accounts:")
    for _, account := range resp.Accounts {
        fmt.Println(*account.Name)

        // Build the request with its input parameters
        resp, err := awsRoute53DomainsClient.ListDomains(context.TODO(), &route53domains.ListDomainsInput{}, func(o *route53domains.Options) {})

        if err != nil {
            log.Fatalf("failed to list tables, %v", err)
        }

        fmt.Println("Accounts:")
        for _, route53 := range resp.Domains {
            fmt.Println(*&route53.DomainName)
        }

        // fetch list of domains from AWS Route53
        sess := session.Must(session.NewSessionWithOptions(session.Options{
            SharedConfigState: session.SharedConfigEnable,
        }))

        svc := route53.New(sess)

        // call svc.ListHostedZones() for an account

        result, err := svc.ListHostedZones(&route53.ListHostedZonesInput{})
        if err != nil {
            fmt.Println(err.Error())
            return
        }

        for _, hostedzone := range result.HostedZones {
            fmt.Println(*hostedzone.Name)
        }
    }
}

【问题讨论】:

    标签: amazon-web-services go aws-sdk aws-organizations aws-sdk-go-v2


    【解决方案1】:

    您似乎正在运行 AWS Organizations ListAccounts() 命令来获取账户列表。

    如果您随后想要对每个“会员”帐户进行 API 调用,您的代码将需要担任 IAM 角色在会员账户中。这是因为您现有的凭据与组织帐户相关联,该帐户无权访问成员帐户。

    来自Accessing and administering the member accounts in your organization - AWS Organizations

    如果您使用作为 AWS Organizations 的一部分提供的工具创建账户,则可以使用名为 OrganizationAccountAccessRole 的预配置角色访问该账户,该角色存在于您以此方式创建的所有新账户中。

    因此,您可以在成员帐户中的OrganizationAccountAccessRole 上调用AssumeRole(),然后它将返回一组临时凭证。您可以使用这些凭据对成员账户进行 API 调用。

    基本上,一组凭据只能用于一个帐户。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多