-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
189 additions
and
109 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
package awscmd | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/service/ecs" | ||
) | ||
|
||
type InputEcsDeploy struct { | ||
Region string | ||
Cluster string | ||
Service string | ||
DockerImage string | ||
} | ||
|
||
type OuputEcsDeploy struct { | ||
Service string | ||
} | ||
|
||
func EcsDeploy(ctx context.Context, input *InputEcsDeploy) (*OuputEcsDeploy, error) { | ||
sess, err := NewSession(input.Region) | ||
if err != nil { | ||
return nil, err | ||
} | ||
svc := ecs.New(sess) | ||
|
||
// 1. fetch running task | ||
serviceOut, err := svc.DescribeServicesWithContext(ctx, &ecs.DescribeServicesInput{ | ||
Cluster: aws.String(input.Cluster), | ||
Services: []*string{aws.String(input.Service)}, | ||
}) | ||
|
||
if err != nil { | ||
return nil, fmt.Errorf("Failed to fetch current running task: %w", err) | ||
} | ||
|
||
if len(serviceOut.Services) == 0 { | ||
return nil, fmt.Errorf("No service definition found") | ||
} | ||
if len(serviceOut.Services) != 1 { | ||
// this should not happen because we defined only 1 service in input but stays for sanity check | ||
return nil, fmt.Errorf("Ambigious match, found more than 1 service") | ||
} | ||
|
||
var taskDefinition *string | ||
for _, s := range serviceOut.Services { | ||
taskDefinition = s.TaskDefinition | ||
} | ||
|
||
// 2. build new task definition | ||
taskDefinitionOut, err := svc.DescribeTaskDefinitionWithContext(ctx, &ecs.DescribeTaskDefinitionInput{ | ||
TaskDefinition: taskDefinition, | ||
}) | ||
|
||
containerDefinitions := []*ecs.ContainerDefinition{} | ||
for _, container := range taskDefinitionOut.TaskDefinition.ContainerDefinitions { | ||
container.Image = aws.String(input.DockerImage) | ||
containerDefinitions = append(containerDefinitions, container) | ||
} | ||
|
||
// 3. register new task revision | ||
registerOut, err := svc.RegisterTaskDefinitionWithContext(ctx, &ecs.RegisterTaskDefinitionInput{ | ||
ContainerDefinitions: containerDefinitions, | ||
Family: taskDefinitionOut.TaskDefinition.Family, | ||
}) | ||
if err != nil { | ||
return nil, fmt.Errorf("Failed to register new task revision: %w", err) | ||
} | ||
arn := registerOut.TaskDefinition.TaskDefinitionArn | ||
|
||
// 4. update ecs service with new task arn | ||
updateOut, err := svc.UpdateServiceWithContext(ctx, &ecs.UpdateServiceInput{ | ||
Cluster: aws.String(input.Cluster), | ||
Service: aws.String(input.Service), | ||
TaskDefinition: arn, | ||
}) | ||
if err != nil { | ||
return nil, fmt.Errorf("Failed to update service with new task revision: %w", err) | ||
} | ||
|
||
return &OuputEcsDeploy{ | ||
Service: *updateOut.Service.ServiceName, | ||
}, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package awscmd | ||
|
||
import ( | ||
"context" | ||
"encoding/json" | ||
"fmt" | ||
"strings" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/service/secretsmanager" | ||
) | ||
|
||
type InputSecretsAll struct { | ||
Region string | ||
ID string | ||
} | ||
|
||
type OutputSecretsAll struct { | ||
Secrets map[string]string | ||
} | ||
|
||
func SecretsAll(ctx context.Context, input *InputSecretsAll) (*OutputSecretsAll, error) { | ||
sess, err := NewSession(input.Region) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
svc := secretsmanager.New(sess, aws.NewConfig().WithRegion(input.Region)) | ||
secretsInput := &secretsmanager.GetSecretValueInput{ | ||
SecretId: aws.String(input.ID), | ||
VersionStage: aws.String("AWSCURRENT"), | ||
} | ||
result, err := svc.GetSecretValue(secretsInput) | ||
if err != nil { | ||
return nil, fmt.Errorf("Failed to get secret value: %w", err) | ||
} | ||
|
||
var out OutputSecretsAll | ||
if result.SecretString != nil { | ||
err = json.NewDecoder(strings.NewReader(*result.SecretString)).Decode(&out.Secrets) | ||
if err != nil { | ||
return nil, fmt.Errorf("Failed to decode secrets into key-value map: %w", err) | ||
} | ||
} else { | ||
return nil, fmt.Errorf("Failed to fetch secret value (SecretString is empty): %w", err) | ||
} | ||
|
||
return &out, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package awscmd | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/aws/session" | ||
) | ||
|
||
func NewSession(region string) (*session.Session, error) { | ||
sess, err := session.NewSession(&aws.Config{Region: aws.String(region)}) | ||
if err != nil { | ||
return nil, fmt.Errorf("Failed to initiate new session: %w", err) | ||
} | ||
|
||
return sess, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package shellcmd | ||
|
||
import ( | ||
"fmt" | ||
"io" | ||
"strings" | ||
) | ||
|
||
func KeyValueToExports(w io.Writer, kv map[string]string) { | ||
for k, v := range kv { | ||
escaped := strings.ReplaceAll(v, `"`, `\"`) | ||
fmt.Fprint(w, "export ", k, "=", `"`, escaped, `"`, "\n") | ||
} | ||
} |