Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

adjusted AWS budgets, added CloudFormation and EKS #241

Merged
merged 1 commit into from
Oct 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,10 @@ In that case terraformer will not know with which region resources are associate
* `aws_budgets_budget`
* `cloudfront`
* `aws_cloudfront_distribution`
* `cloudformation`
* `aws_cloudformation_stack`
* `aws_cloudformation_stack_set`
* `aws_cloudformation_stack_set_instance`
* `cloudtrail`
* `aws_cloudtrail`
* `dynamodb`
Expand All @@ -375,6 +379,8 @@ In that case terraformer will not know with which region resources are associate
* `aws_ecs_cluster`
* `aws_ecs_service`
* `aws_ecs_task_definition`
* `eks`
* `aws_eks_cluster`
* `elb`
* `aws_elb`
* `es`
Expand Down Expand Up @@ -447,6 +453,7 @@ In that case terraformer will not know with which region resources are associate
AWS services that are global will be imported without specified region even if several regions will be passed. It is to ensure only one representation of an AWS resource is imported.

List of global AWS services:
* `budgets`
* `cloudfront`
* `iam`
* `organization`
Expand Down
8 changes: 2 additions & 6 deletions cmd/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ import (
"github.com/spf13/cobra"
)

// global resources should be bound to a default region. AWS doesn't specify in which region default services are
// placed (see https://docs.aws.amazon.com/general/latest/gr/rande.html), so we shouldn't assume any region as well
var supportedGlobalResources = []string{"iam", "route53", "cloudfront", "organization"}

const defaultRegion = ""

func newCmdAwsImporter(options ImportOptions) *cobra.Command {
Expand Down Expand Up @@ -79,7 +75,7 @@ func newCmdAwsImporter(options ImportOptions) *cobra.Command {
func parseGlobalResources(allResources []string) []string {
var globalResources []string
for _, resourceName := range allResources {
if contains(supportedGlobalResources, resourceName) {
if contains(aws_terraforming.SupportedGlobalResources, resourceName) {
globalResources = append(globalResources, resourceName)
}
}
Expand All @@ -97,7 +93,7 @@ func importGlobalResources(options ImportOptions) error {
func parseRegionalResources(allResources []string) []string {
var localResources []string
for _, resourceName := range allResources {
if !contains(supportedGlobalResources, resourceName) {
if !contains(aws_terraforming.SupportedGlobalResources, resourceName) {
localResources = append(localResources, resourceName)
}
}
Expand Down
16 changes: 16 additions & 0 deletions providers/aws/aws_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ type AWSProvider struct {

const awsProviderVersion = ">2.25.0"

// global resources should be bound to a default region. AWS doesn't specify in which region default services are
// placed (see https://docs.aws.amazon.com/general/latest/gr/rande.html), so we shouldn't assume any region as well
var SupportedGlobalResources = []string{
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good idea move this to aws provider

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At first I was thinking to define a method on every AWS resource to enforce checking whether a given resource is global or not but this list now looks to be easy to spot and hope to do the job.

"budgets",
"cloudfront",
"iam",
"organization",
"route53",
}

func (p AWSProvider) GetResourceConnections() map[string]map[string][]string {
return map[string]map[string][]string{
"alb": {
Expand Down Expand Up @@ -65,6 +75,10 @@ func (p AWSProvider) GetResourceConnections() map[string]map[string][]string {
"subnet": []string{"network_configuration.subnets", "id"},
"sg": []string{"network_configuration.security_groups", "id"},
},
"eks": {
"subnet": []string{"vpc_config.subnet_ids", "id"},
"sg": []string{"vpc_config.security_group_ids", "id"},
},
"elb": {
"sg": []string{"security_groups", "id"},
"subnet": []string{"subnets", "id"},
Expand Down Expand Up @@ -187,12 +201,14 @@ func (p *AWSProvider) GetSupportedService() map[string]terraform_utils.ServiceGe
"alb": &AlbGenerator{},
"auto_scaling": &AutoScalingGenerator{},
"budgets": &BudgetsGenerator{},
"cloudformation": &CloudFormationGenerator{},
"cloudfront": &CloudFrontGenerator{},
"cloudtrail": &CloudTrailGenerator{},
"dynamodb": &DynamoDbGenerator{},
"ebs": &EbsGenerator{},
"ec2_instance": &Ec2Generator{},
"ecs": &EcsGenerator{},
"eks": &EksGenerator{},
"eip": &ElasticIpGenerator{},
"elasticache": &ElastiCacheGenerator{},
"elb": &ElbGenerator{},
Expand Down
82 changes: 82 additions & 0 deletions providers/aws/cloudformation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Copyright 2019 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package aws

import (
"github.com/GoogleCloudPlatform/terraformer/terraform_utils"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/cloudformation"
)

var cloudFormationAllowEmptyValues = []string{"tags."}

type CloudFormationGenerator struct {
AWSService
}

func (g *CloudFormationGenerator) InitResources() error {
sess := g.generateSession()
svc := cloudformation.New(sess)

err := svc.ListStacksPages(&cloudformation.ListStacksInput{}, func(stacks *cloudformation.ListStacksOutput, lastPage bool) bool {
for _, stackSummary := range stacks.StackSummaries {
g.Resources = append(g.Resources, terraform_utils.NewSimpleResource(
aws.StringValue(stackSummary.StackId),
aws.StringValue(stackSummary.StackName),
"aws_cloudformation_stack",
"aws",
cloudFormationAllowEmptyValues,
))
}
return !lastPage
})
if err != nil {
return err
}

stackSets, err := svc.ListStackSets(&cloudformation.ListStackSetsInput{})
if err != nil {
return err
}
for _, stackSetSummary := range stackSets.Summaries {
g.Resources = append(g.Resources, terraform_utils.NewSimpleResource(
aws.StringValue(stackSetSummary.StackSetId),
aws.StringValue(stackSetSummary.StackSetName),
"aws_cloudformation_stack_set",
"aws",
cloudFormationAllowEmptyValues,
))

stackSetInstances, err := svc.ListStackInstances(&cloudformation.ListStackInstancesInput{
StackSetName: stackSetSummary.StackSetName,
})
if err != nil {
return err
}
for _, stackSetI := range stackSetInstances.Summaries {
id := aws.StringValue(stackSetI.StackSetId) + "," + aws.StringValue(stackSetI.Account) + "," + aws.StringValue(stackSetI.Region)

g.Resources = append(g.Resources, terraform_utils.NewSimpleResource(
id,
id,
"aws_cloudformation_stack_set_instance",
"aws",
cloudFormationAllowEmptyValues,
))
}
}

return nil
}
50 changes: 50 additions & 0 deletions providers/aws/eks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2019 The Terraformer Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package aws

import (
"github.com/GoogleCloudPlatform/terraformer/terraform_utils"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/eks"
)

var eksAllowEmptyValues = []string{"tags."}

type EksGenerator struct {
AWSService
}

func (g *EksGenerator) InitResources() error {
sess := g.generateSession()
svc := eks.New(sess)

err := svc.ListClustersPages(&eks.ListClustersInput{}, func(clusters *eks.ListClustersOutput, lastPage bool) bool {
for _, clusterName := range clusters.Clusters {
g.Resources = append(g.Resources, terraform_utils.NewSimpleResource(
aws.StringValue(clusterName),
aws.StringValue(clusterName),
"aws_eks_cluster",
"aws",
eksAllowEmptyValues,
))
}
return !lastPage
})
if err != nil {
return err
}

return nil
}