1
0
mirror of https://github.com/raseels-repos/golang-saas-starter-kit.git synced 2025-07-01 00:55:01 +02:00
This commit is contained in:
Lee Brown
2019-07-11 14:46:05 -08:00
parent 8eb9f6d976
commit df86310a8b
7 changed files with 205 additions and 211 deletions

View File

@ -9,9 +9,9 @@ import (
saasSwagger "geeks-accelerator/oss/saas-starter-kit/example-project/internal/mid/saas-swagger"
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/auth"
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/web"
_ "geeks-accelerator/oss/saas-starter-kit/example-project/internal/signup"
"github.com/jmoiron/sqlx"
"gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis"
_ "geeks-accelerator/oss/saas-starter-kit/example-project/internal/signup"
)
// API returns a handler for a set of routes.
@ -23,7 +23,7 @@ func API(shutdown chan os.Signal, log *log.Logger, masterDB *sqlx.DB, redis *red
// Register health check endpoint. This route is not authenticated.
check := Check{
MasterDB: masterDB,
Redis: redis,
Redis: redis,
}
app.Handle("GET", "/v1/health", check.Health)
app.Handle("GET", "/ping", check.Ping)

View File

@ -16,11 +16,10 @@ import (
"syscall"
"time"
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/devops"
"golang.org/x/crypto/acme/autocert"
"geeks-accelerator/oss/saas-starter-kit/example-project/cmd/web-api/docs"
"geeks-accelerator/oss/saas-starter-kit/example-project/cmd/web-api/handlers"
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/auth"
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/devops"
"geeks-accelerator/oss/saas-starter-kit/example-project/internal/platform/flag"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
@ -28,6 +27,7 @@ import (
"github.com/go-redis/redis"
"github.com/kelseyhightower/envconfig"
"github.com/lib/pq"
"golang.org/x/crypto/acme/autocert"
awstrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/aws-sdk-go/aws"
sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql"
redistrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis"
@ -320,7 +320,7 @@ func main() {
// ECS Task registration for services that don't use an AWS Elastic Load Balancer.
err = devops.EcsServiceTaskInit(log, awsSession)
if err != nil {
log.Fatalf("main : Ecs Service Task init : %v", err)
log.Fatalf("main : Ecs Service Task init : %v", err)
}
// =========================================================================
@ -368,7 +368,6 @@ func main() {
}()
}
// Start the HTTPS service listening for requests.
if cfg.HTTPS.Host != "" {
api := http.Server{
@ -379,7 +378,6 @@ func main() {
MaxHeaderBytes: 1 << 20,
}
// Note: use a sensible value for data directory
// this is where cached certificates are stored
dataDir := "."
@ -399,8 +397,6 @@ func main() {
}
api.TLSConfig = &tls.Config{GetCertificate: m.GetCertificate}
httpServers = append(httpServers, api)
go func() {
@ -423,7 +419,7 @@ func main() {
// Ensure the public IP address for the task is removed from Route53.
err = devops.EcsServiceTaskTaskShutdown(log, awsSession)
if err != nil {
log.Fatalf("main : Ecs Service Task shutdown : %v", err)
log.Fatalf("main : Ecs Service Task shutdown : %v", err)
}
// Create context for Shutdown call.

View File

@ -1,5 +1,6 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
@ -73,6 +74,7 @@ github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcs
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.4 h1:i/65mCM9s1h8eCkT07F5Z/C1e/f8VTgEwer+00yevpA=
github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc=
github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
@ -138,6 +140,7 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190620125010-da37f6c1e481 h1:IaSjLMT6WvkoZZjspGxy3rdaTEmWLoRm49WbtVUi9sA=
github.com/mailru/easyjson v0.0.0-20190620125010-da37f6c1e481/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
@ -199,9 +202,11 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/swaggo/files v0.0.0-20190110041405-30649e0721f8 h1:ENF9W2s6+pqe/CmdQTQFPuzSdCB91LQ3WWzdMWucs7c=
github.com/swaggo/files v0.0.0-20190110041405-30649e0721f8/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14 h1:PyYN9JH5jY9j6av01SpfRMb+1DWg/i3MbGOKPxJ2wjM=
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
github.com/swaggo/swag v1.5.1 h1:2Agm8I4K5qb00620mHq0VJ05/KT4FtmALPIcQR9lEZM=
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
github.com/swaggo/swag v1.6.1 h1:r5kS0vSmXYrSBSNdCLgGV40DpAPzSwvuLNMVIR8y0Ic=
github.com/swaggo/swag v1.6.1/go.mod h1:YyZstMc22WYm6GEDx/CYWxq+faBbjQ5EqwQcrjREDBo=
github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
@ -262,6 +267,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4 h1:1mMox4TgefDwqluYCv677yNXwlfTkija4owZve/jr78=
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190708203411-c8855242db9c h1:rRFNgkkT7zOyWlroLBmsrKYtBNhox8WtulQlOr3jIDk=
golang.org/x/tools v0.0.0-20190708203411-c8855242db9c/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=

View File

@ -11,12 +11,12 @@ import (
"strconv"
"time"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/ecs"
"github.com/aws/aws-sdk-go/service/route53"
"github.com/pkg/errors"
"github.com/aws/aws-sdk-go/aws/session"
)
// EcsServiceTaskInit allows newly spun up ECS Service Tasks to register their public IP with Route 53.
@ -92,8 +92,8 @@ func RegisterEcsServiceTasksRoute53(log *log.Logger, awsSession *session.Session
service := serviceRes.Services[0]
servceTaskRes, err := svc.ListTasks(&ecs.ListTasksInput{
Cluster: aws.String(ecsClusterName),
ServiceName: aws.String(ecsServiceName),
Cluster: aws.String(ecsClusterName),
ServiceName: aws.String(ecsServiceName),
DesiredStatus: aws.String("RUNNING"),
})
if err != nil {
@ -127,7 +127,7 @@ func RegisterEcsServiceTasksRoute53(log *log.Logger, awsSession *session.Session
}
for _, a := range t.Attachments {
if a.Details == nil || *a.Id != *c.NetworkInterfaces[0].AttachmentId {
if a.Details == nil || *a.Id != *c.NetworkInterfaces[0].AttachmentId {
continue
}
@ -143,12 +143,12 @@ func RegisterEcsServiceTasksRoute53(log *log.Logger, awsSession *session.Session
}
if len(networkInterfaceIds) > 0 {
log.Printf("Found %d network interface IDs.\n", len(networkInterfaceIds))
log.Printf("Found %d network interface IDs.\n", len(networkInterfaceIds))
break
}
// Found no network interfaces, try again.
log.Println( "Found no network interfaces.")
log.Println("Found no network interfaces.")
time.Sleep((time.Duration(a) * time.Second * 10) * time.Duration(a))
}
@ -178,7 +178,7 @@ func RegisterEcsServiceTasksRoute53(log *log.Logger, awsSession *session.Session
}
// Found no public IPs, try again.
log.Println( "Found no public IPs.")
log.Println("Found no public IPs.")
time.Sleep((time.Duration(a) * time.Second * 10) * time.Duration(a))
}
@ -232,7 +232,6 @@ func RegisterEcsServiceTasksRoute53(log *log.Logger, awsSession *session.Session
return nil
}
/*
http://169.254.170.2/v2/metadata,
@ -353,4 +352,4 @@ http://169.254.170.2/v2/metadata,
"PullStartedAt": "2019-07-11T05:36:35.407114703Z",
"PullStoppedAt": "2019-07-11T05:36:54.128398742Z"
}
*/
*/

View File

@ -3,6 +3,9 @@ package devops
import (
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/ecr"
@ -13,9 +16,6 @@ import (
"github.com/aws/aws-sdk-go/service/rds"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/servicediscovery"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/iancoleman/strcase"
"github.com/urfave/cli"
)
@ -33,96 +33,96 @@ type ServiceDeployFlags struct {
S3BucketPrivateName string `validate:"omitempty" example:"saas-example-project-private"`
S3BucketPublicName string `validate:"omitempty" example:"saas-example-project-public"`
ProjectRoot string `validate:"omitempty" example:"."`
ProjectName string ` validate:"omitempty" example:"example-project"`
DockerFile string `validate:"omitempty" example:"./cmd/web-api/Dockerfile"`
EnableLambdaVPC bool `validate:"omitempty" example:"false"`
EnableEcsElb bool `validate:"omitempty" example:"false"`
NoBuild bool `validate:"omitempty" example:"false"`
NoDeploy bool `validate:"omitempty" example:"false"`
NoCache bool `validate:"omitempty" example:"false"`
NoPush bool `validate:"omitempty" example:"false"`
RecreateService bool `validate:"omitempty" example:"false"`
ProjectRoot string `validate:"omitempty" example:"."`
ProjectName string ` validate:"omitempty" example:"example-project"`
DockerFile string `validate:"omitempty" example:"./cmd/web-api/Dockerfile"`
EnableLambdaVPC bool `validate:"omitempty" example:"false"`
EnableEcsElb bool `validate:"omitempty" example:"false"`
NoBuild bool `validate:"omitempty" example:"false"`
NoDeploy bool `validate:"omitempty" example:"false"`
NoCache bool `validate:"omitempty" example:"false"`
NoPush bool `validate:"omitempty" example:"false"`
RecreateService bool `validate:"omitempty" example:"false"`
}
// serviceDeployRequest defines the details needed to execute a service deployment.
type serviceDeployRequest struct {
ServiceName string `validate:"required"`
ServiceDir string `validate:"required"`
Env string `validate:"oneof=dev stage prod"`
ProjectRoot string `validate:"required"`
ProjectName string `validate:"required"`
DockerFile string `validate:"required"`
GoModFile string `validate:"required"`
GoModName string `validate:"required"`
ServiceName string `validate:"required"`
ServiceDir string `validate:"required"`
Env string `validate:"oneof=dev stage prod"`
ProjectRoot string `validate:"required"`
ProjectName string `validate:"required"`
DockerFile string `validate:"required"`
GoModFile string `validate:"required"`
GoModName string `validate:"required"`
EnableHTTPS bool `validate:"omitempty"`
ServiceDomainName string `validate:"omitempty,required_with=EnableHTTPS,fqdn"`
ServiceDomainNameAliases []string `validate:"omitempty,dive,fqdn"`
EnableHTTPS bool `validate:"omitempty"`
ServiceDomainName string `validate:"omitempty,required_with=EnableHTTPS,fqdn"`
ServiceDomainNameAliases []string `validate:"omitempty,dive,fqdn"`
AwsCreds awsCredentials `validate:"required,dive,required"`
AwsCreds awsCredentials `validate:"required,dive,required"`
EcrRepositoryName string `validate:"required"`
EcrRepository *ecr.CreateRepositoryInput
EcrRepositoryMaxImages int `validate:"omitempty"`
EcrRepositoryName string `validate:"required"`
EcrRepository *ecr.CreateRepositoryInput
EcrRepositoryMaxImages int `validate:"omitempty"`
EcsClusterName string `validate:"required"`
EcsCluster *ecs.CreateClusterInput
EcsClusterName string `validate:"required"`
EcsCluster *ecs.CreateClusterInput
EcsServiceName string `validate:"required"`
EcsServiceDesiredCount int64 `validate:"required"`
EcsServiceMinimumHealthyPercent *int64 `validate:"omitempty"`
EcsServiceMaximumPercent *int64 `validate:"omitempty"`
EscServiceHealthCheckGracePeriodSeconds *int64 `validate:"omitempty"`
EcsServiceName string `validate:"required"`
EcsServiceDesiredCount int64 `validate:"required"`
EcsServiceMinimumHealthyPercent *int64 `validate:"omitempty"`
EcsServiceMaximumPercent *int64 `validate:"omitempty"`
EscServiceHealthCheckGracePeriodSeconds *int64 `validate:"omitempty"`
EcsExecutionRoleName string `validate:"required"`
EcsExecutionRole *iam.CreateRoleInput
EcsExecutionRolePolicyArns []string `validate:"required"`
EcsExecutionRoleName string `validate:"required"`
EcsExecutionRole *iam.CreateRoleInput
EcsExecutionRolePolicyArns []string `validate:"required"`
EcsTaskRoleName string `validate:"required"`
EcsTaskRole *iam.CreateRoleInput
EcsTaskRoleName string `validate:"required"`
EcsTaskRole *iam.CreateRoleInput
EcsTaskPolicyName string `validate:"required"`
EcsTaskPolicy *iam.CreatePolicyInput
EcsTaskPolicyName string `validate:"required"`
EcsTaskPolicy *iam.CreatePolicyInput
EcsTaskPolicyDocument IamPolicyDocument
Ec2SecurityGroupName string `validate:"required"`
Ec2SecurityGroup *ec2.CreateSecurityGroupInput
Ec2SecurityGroupName string `validate:"required"`
Ec2SecurityGroup *ec2.CreateSecurityGroupInput
CloudWatchLogGroupName string `validate:"required"`
CloudWatchLogGroup *cloudwatchlogs.CreateLogGroupInput
CloudWatchLogGroupName string `validate:"required"`
CloudWatchLogGroup *cloudwatchlogs.CreateLogGroupInput
S3BucketTempPrefix string `validate:"required_with=S3BucketPrivateName S3BucketPublicName"`
S3BucketPrivateName string `validate:"omitempty"`
S3BucketPublicName string `validate:"omitempty"`
S3Buckets []S3Bucket
S3BucketTempPrefix string `validate:"required_with=S3BucketPrivateName S3BucketPublicName"`
S3BucketPrivateName string `validate:"omitempty"`
S3BucketPublicName string `validate:"omitempty"`
S3Buckets []S3Bucket
EnableEcsElb bool `validate:"omitempty"`
ElbLoadBalancerName string `validate:"omitempty"`
ElbDeregistrationDelay *int `validate:"omitempty"`
ElbLoadBalancer *elbv2.CreateLoadBalancerInput
EnableEcsElb bool `validate:"omitempty"`
ElbLoadBalancerName string `validate:"omitempty"`
ElbDeregistrationDelay *int `validate:"omitempty"`
ElbLoadBalancer *elbv2.CreateLoadBalancerInput
ElbTargetGroupName string `validate:"omitempty"`
ElbTargetGroup *elbv2.CreateTargetGroupInput
ElbTargetGroupName string `validate:"omitempty"`
ElbTargetGroup *elbv2.CreateTargetGroupInput
VpcPublicName string `validate:"omitempty"`
VpcPublic *ec2.CreateVpcInput
VpcPublicName string `validate:"omitempty"`
VpcPublic *ec2.CreateVpcInput
VpcPublicSubnets []*ec2.CreateSubnetInput
EnableLambdaVPC bool `validate:"omitempty"`
NoBuild bool `validate:"omitempty"`
NoDeploy bool `validate:"omitempty"`
NoCache bool `validate:"omitempty"`
NoPush bool `validate:"omitempty"`
RecreateService bool `validate:"omitempty"`
EnableLambdaVPC bool `validate:"omitempty"`
NoBuild bool `validate:"omitempty"`
NoDeploy bool `validate:"omitempty"`
NoCache bool `validate:"omitempty"`
NoPush bool `validate:"omitempty"`
RecreateService bool `validate:"omitempty"`
SDNamepsace *servicediscovery.CreatePrivateDnsNamespaceInput
SDService *servicediscovery.CreateServiceInput
SDService *servicediscovery.CreateServiceInput
CacheCluster *elasticache.CreateCacheClusterInput
CacheCluster *elasticache.CreateCacheClusterInput
CacheClusterParameter []*elasticache.ParameterNameValue
DBCluster *rds.CreateDBClusterInput
DBCluster *rds.CreateDBClusterInput
DBInstance *rds.CreateDBInstanceInput
ReleaseImage string
@ -132,12 +132,12 @@ type serviceDeployRequest struct {
}
type S3Bucket struct {
Name string `validate:"omitempty"`
Input *s3.CreateBucketInput
LifecycleRules []*s3.LifecycleRule
CORSRules []*s3.CORSRule
Name string `validate:"omitempty"`
Input *s3.CreateBucketInput
LifecycleRules []*s3.LifecycleRule
CORSRules []*s3.CORSRule
PublicAccessBlock *s3.PublicAccessBlockConfiguration
Policy string
Policy string
}
// DB mimics the general info needed for services used to define placeholders.

View File

@ -80,21 +80,21 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
AwsCreds: awsCreds,
// Optional flags.
ProjectRoot: flags.ProjectRoot,
ProjectName: flags.ProjectName,
DockerFile: flags.DockerFile,
EnableHTTPS: flags.EnableHTTPS,
ServiceDomainName: flags.ServiceDomainName,
ServiceDomainNameAliases: flags.ServiceDomainNameAliases,
S3BucketPrivateName : flags.S3BucketPrivateName,
S3BucketPublicName: flags.S3BucketPublicName,
EnableLambdaVPC: flags.EnableLambdaVPC,
EnableEcsElb: flags.EnableEcsElb,
NoBuild: flags.NoBuild,
NoDeploy: flags.NoDeploy,
NoCache: flags.NoCache,
NoPush: flags.NoPush,
RecreateService: flags.RecreateService,
ProjectRoot: flags.ProjectRoot,
ProjectName: flags.ProjectName,
DockerFile: flags.DockerFile,
EnableHTTPS: flags.EnableHTTPS,
ServiceDomainName: flags.ServiceDomainName,
ServiceDomainNameAliases: flags.ServiceDomainNameAliases,
S3BucketPrivateName: flags.S3BucketPrivateName,
S3BucketPublicName: flags.S3BucketPublicName,
EnableLambdaVPC: flags.EnableLambdaVPC,
EnableEcsElb: flags.EnableEcsElb,
NoBuild: flags.NoBuild,
NoDeploy: flags.NoDeploy,
NoCache: flags.NoCache,
NoPush: flags.NoPush,
RecreateService: flags.RecreateService,
flags: flags,
}
@ -170,7 +170,7 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// Defines a life cycle policy to expire keys for the temp directory.
bucketLifecycleTempRule := &s3.LifecycleRule{
ID: aws.String("Rule for : "+req.S3BucketTempPrefix),
ID: aws.String("Rule for : " + req.S3BucketTempPrefix),
Status: aws.String("Enabled"),
Filter: &s3.LifecycleRuleFilter{
Prefix: aws.String(req.S3BucketTempPrefix),
@ -199,7 +199,7 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
Bucket: aws.String(req.S3BucketPublicName),
},
LifecycleRules: []*s3.LifecycleRule{bucketLifecycleTempRule},
CORSRules: []*s3.CORSRule{
CORSRules: []*s3.CORSRule{
&s3.CORSRule{
// Headers that are specified in the Access-Control-Request-Headers header.
// These headers are allowed in a preflight OPTIONS request. In response to
@ -362,8 +362,8 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// Set default AWS ECS Task Policy Name.
req.EcsTaskPolicyName = fmt.Sprintf("%s%sServices", req.ProjectNameCamel(), strcase.ToCamel(req.Env))
req.EcsTaskPolicy = &iam.CreatePolicyInput{
PolicyName: aws.String(req.EcsTaskPolicyName),
Description: aws.String(fmt.Sprintf("Defines access for %s services. ", req.ProjectName)),
PolicyName: aws.String(req.EcsTaskPolicyName),
Description: aws.String(fmt.Sprintf("Defines access for %s services. ", req.ProjectName)),
}
log.Printf("\t\t\tSet ECS Task Policy Name to '%s'.", req.EcsTaskPolicyName)
@ -509,7 +509,7 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// characters, must contain only alphanumeric characters or hyphens, and must
// not begin or end with a hyphen.
// Name is a required field
Name: aws.String(req.ElbTargetGroupName ),
Name: aws.String(req.ElbTargetGroupName),
// The port on which the targets receive traffic. This port is used unless you
// specify a port override when registering the target. If the target is a Lambda
@ -590,7 +590,7 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// * lambda - The target groups contains a single Lambda function.
TargetType: aws.String("ip"),
}
log.Printf("\t\t\tSet ELB Target Group Name to '%s'.", req.ElbTargetGroupName )
log.Printf("\t\t\tSet ELB Target Group Name to '%s'.", req.ElbTargetGroupName)
}
// Set ECS configs based on specified env.
@ -614,7 +614,7 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// Service Discovery Namespace settings.
req.SDNamepsace = &servicediscovery.CreatePrivateDnsNamespaceInput{
Name: aws.String(req.EcsClusterName),
Name: aws.String(req.EcsClusterName),
Description: aws.String(fmt.Sprintf("Private DNS namespace used for services running on the ECS Cluster %s", req.EcsClusterName)),
// A unique string that identifies the request and that allows failed CreatePrivateDnsNamespace
@ -625,7 +625,7 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// Service Discovery Service settings.
req.SDService = &servicediscovery.CreateServiceInput{
Name: aws.String(req.EcsServiceName),
Name: aws.String(req.EcsServiceName),
Description: aws.String(fmt.Sprintf("Service %s running on the ECS Cluster %s", req.EcsServiceName, req.EcsClusterName)),
// A complex type that contains information about the Amazon Route 53 records
@ -672,21 +672,21 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
// Elastic Cache settings for a Redis cache cluster. Could defined different settings by env.
req.CacheCluster = &elasticache.CreateCacheClusterInput{
AutoMinorVersionUpgrade: aws.Bool(true),
CacheClusterId: aws.String(req.ProjectName+"-"+req.Env),
CacheNodeType: aws.String("cache.t2.micro"),
CacheSubnetGroupName: aws.String("default"),
Engine: aws.String("redis"),
EngineVersion: aws.String("5.0.4"),
NumCacheNodes: aws.Int64(1),
Port: aws.Int64(6379),
SnapshotRetentionLimit: aws.Int64(7),
AutoMinorVersionUpgrade: aws.Bool(true),
CacheClusterId: aws.String(req.ProjectName + "-" + req.Env),
CacheNodeType: aws.String("cache.t2.micro"),
CacheSubnetGroupName: aws.String("default"),
Engine: aws.String("redis"),
EngineVersion: aws.String("5.0.4"),
NumCacheNodes: aws.Int64(1),
Port: aws.Int64(6379),
SnapshotRetentionLimit: aws.Int64(7),
}
// Recommended to be set to allkeys-lru to avoid OOM since redis will be used as an ephemeral store.
req.CacheClusterParameter = []*elasticache.ParameterNameValue{
&elasticache.ParameterNameValue{
ParameterName: aws.String("maxmemory-policy"),
ParameterName: aws.String("maxmemory-policy"),
ParameterValue: aws.String("allkeys-lru"),
},
}
@ -695,22 +695,22 @@ func NewServiceDeployRequest(log *log.Logger, flags ServiceDeployFlags) (*servic
req.DBCluster = nil
// RDS settings for a Postgres database Instance. Could defined different settings by env.
req.DBInstance = &rds.CreateDBInstanceInput{
DBInstanceIdentifier: aws.String(req.ProjectName+"-"+req.Env+"-01"),
DBName: aws.String("shared"),
Engine: aws.String("postgres"),
MasterUsername: aws.String("god"),
MasterUserPassword: aws.String("mypassword"), // When empty auto generated.
Port: aws.Int64(5432),
DBInstanceClass: aws.String("db.t2.small"),
AllocatedStorage: aws.Int64(20),
MultiAZ: aws.Bool(false),
PubliclyAccessible: aws.Bool(false),
StorageEncrypted: aws.Bool(true),
BackupRetentionPeriod: aws.Int64(7),
req.DBInstance = &rds.CreateDBInstanceInput{
DBInstanceIdentifier: aws.String(req.ProjectName + "-" + req.Env + "-01"),
DBName: aws.String("shared"),
Engine: aws.String("postgres"),
MasterUsername: aws.String("god"),
MasterUserPassword: aws.String("mypassword"), // When empty auto generated.
Port: aws.Int64(5432),
DBInstanceClass: aws.String("db.t2.small"),
AllocatedStorage: aws.Int64(20),
MultiAZ: aws.Bool(false),
PubliclyAccessible: aws.Bool(false),
StorageEncrypted: aws.Bool(true),
BackupRetentionPeriod: aws.Int64(7),
EnablePerformanceInsights: aws.Bool(false),
AutoMinorVersionUpgrade: aws.Bool(true),
CopyTagsToSnapshot: aws.Bool(true),
AutoMinorVersionUpgrade: aws.Bool(true),
CopyTagsToSnapshot: aws.Bool(true),
Tags: []*rds.Tag{
{Key: aws.String(awsTagNameProject), Value: aws.String(req.ProjectName)},
{Key: aws.String(awsTagNameEnv), Value: aws.String(req.Env)},
@ -829,8 +829,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
if err != nil {
return errors.WithMessage(err, "failed docker registry login")
}
log.Printf("\t\tStatus: %s", loginRes.Status )
log.Printf("\t\tStatus: %s", loginRes.Status)
registryAuth = fmt.Sprintf(`{"Username": "%s", "Password": "%s"}`, user, pass)
registryAuth = base64.StdEncoding.EncodeToString([]byte(registryAuth))
@ -985,7 +984,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
_, err := svc.CreateTags(&ec2.CreateTagsInput{
Resources: aws.StringSlice([]string{resource}),
Tags: ec2Tags,
Tags: ec2Tags,
})
if err != nil {
return errors.Wrapf(err, "failed to create tags for %s", resource)
@ -1002,7 +1001,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// If no log group was found, create one.
var err error
_, err = svc.CreateLogGroup(req.CloudWatchLogGroup )
_, err = svc.CreateLogGroup(req.CloudWatchLogGroup)
if err != nil {
if aerr, ok := err.(awserr.Error); !ok || aerr.Code() != cloudwatchlogs.ErrCodeResourceAlreadyExistsException {
return errors.Wrapf(err, "failed to create log group '%s'", req.CloudWatchLogGroupName)
@ -1044,7 +1043,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
Bucket: aws.String(bucket.Name),
})
if err != nil {
return errors.Wrapf(err, "failed to wait for s3 bucket '%s' to exist",bucket.Name)
return errors.Wrapf(err, "failed to wait for s3 bucket '%s' to exist", bucket.Name)
}
log.Printf("\t\t\tExists")
}
@ -1288,7 +1287,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
err := svc.DescribeSubnetsPages(&ec2.DescribeSubnetsInput{
Filters: []*ec2.Filter{
&ec2.Filter{
Name: aws.String("tag:"+awsTagNameName),
Name: aws.String("tag:" + awsTagNameName),
Values: aws.StringSlice([]string{req.VpcPublicName}),
},
},
@ -1333,7 +1332,6 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
}
}
log.Printf("\t\tFind internet gateway or create new one.\n")
var internetGatewayId string
{
@ -1341,7 +1339,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
err := svc.DescribeInternetGatewaysPages(&ec2.DescribeInternetGatewaysInput{
Filters: []*ec2.Filter{
&ec2.Filter{
Name: aws.String("tag:"+awsTagNameName),
Name: aws.String("tag:" + awsTagNameName),
Values: aws.StringSlice([]string{req.VpcPublicName}),
},
},
@ -1379,10 +1377,10 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t\tAttached to VPC.")
_, err = svc.AttachInternetGateway(&ec2.AttachInternetGatewayInput{
InternetGatewayId: aws.String(internetGatewayId),
VpcId: aws.String(publicVpcId),
VpcId: aws.String(publicVpcId),
})
if err != nil {
return errors.Wrapf(err, "failed to attach internet gateway '%s' to vpc '%s'", )
return errors.Wrapf(err, "failed to attach internet gateway '%s' to vpc '%s'")
}
}
}
@ -1393,7 +1391,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
descRes, err := svc.DescribeRouteTables(&ec2.DescribeRouteTablesInput{
Filters: []*ec2.Filter{
&ec2.Filter{
Name: aws.String("tag:"+awsTagNameName),
Name: aws.String("tag:" + awsTagNameName),
Values: aws.StringSlice([]string{req.VpcPublicName}),
},
},
@ -1434,8 +1432,8 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
if !hasAllTrafficRoute {
_, err := svc.CreateRoute(&ec2.CreateRouteInput{
DestinationCidrBlock: aws.String(routeAllTrafficCidr),
GatewayId: aws.String(internetGatewayId),
RouteTableId: routeTable.RouteTableId,
GatewayId: aws.String(internetGatewayId),
RouteTableId: routeTable.RouteTableId,
})
if err != nil {
return errors.Wrapf(err, "failed to create route")
@ -1569,16 +1567,16 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
})
if err != nil {
/*
if aerr, ok := err.(awserr.Error); !ok || aerr.Code() != secretsmanager.ErrCodeResourceExistsException {
return errors.Wrap(err, "failed to create new secret with db credentials")
}
_, err = sm.UpdateSecret(&secretsmanager.UpdateSecretInput{
SecretId: aws.String(dbSecretId),
SecretString: aws.String(string(dat)),
})
if err != nil {
return errors.Wrap(err, "failed to update secret with db credentials")
}*/
if aerr, ok := err.(awserr.Error); !ok || aerr.Code() != secretsmanager.ErrCodeResourceExistsException {
return errors.Wrap(err, "failed to create new secret with db credentials")
}
_, err = sm.UpdateSecret(&secretsmanager.UpdateSecretInput{
SecretId: aws.String(dbSecretId),
SecretString: aws.String(string(dat)),
})
if err != nil {
return errors.Wrap(err, "failed to update secret with db credentials")
}*/
return errors.Wrap(err, "failed to create new secret with db credentials")
}
log.Printf("\t\tStored Secret\n")
@ -1590,7 +1588,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// If no cluster was found, create one.
createRes, err := svc.CreateDBInstance(req.DBInstance)
if err != nil {
return errors.Wrapf(err, "failed to create instance '%s'", *req.DBInstance.DBInstanceIdentifier)
return errors.Wrapf(err, "failed to create instance '%s'", *req.DBInstance.DBInstanceIdentifier)
}
dbInstance = createRes.DBInstance
@ -1635,7 +1633,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// Update the current AWS Secret.
sm := secretsmanager.New(req.awsSession())
_, err = sm.UpdateSecret(&secretsmanager.UpdateSecretInput{
SecretId: aws.String(dbSecretId),
SecretId: aws.String(dbSecretId),
SecretString: aws.String(string(dat)),
})
if err != nil {
@ -1658,7 +1656,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
svc := elasticache.New(req.awsSession())
descRes, err := svc.DescribeCacheClusters(&elasticache.DescribeCacheClustersInput{
CacheClusterId: req.CacheCluster.CacheClusterId,
CacheClusterId: req.CacheCluster.CacheClusterId,
ShowCacheNodeInfo: aws.Bool(true),
})
if err != nil {
@ -1673,7 +1671,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// If no repository was found, create one.
createRes, err := svc.CreateCacheCluster(req.CacheCluster)
if err != nil {
return errors.Wrapf(err, "failed to create cluster '%s'", *req.CacheCluster.CacheClusterId)
return errors.Wrapf(err, "failed to create cluster '%s'", *req.CacheCluster.CacheClusterId)
}
cacheCluster = createRes.CacheCluster
@ -1730,8 +1728,8 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t\tCreated custom Cache Parameter Group : %s", customCacheParameterGroupName)
_, err = svc.CreateCacheParameterGroup(&elasticache.CreateCacheParameterGroupInput{
CacheParameterGroupFamily: descRes.CacheParameterGroups[0].CacheParameterGroupFamily,
CacheParameterGroupName: aws.String(customCacheParameterGroupName),
Description: aws.String(fmt.Sprintf("Customized default parameter group for %s %s", *cacheCluster.Engine, *cacheCluster.EngineVersion)),
CacheParameterGroupName: aws.String(customCacheParameterGroupName),
Description: aws.String(fmt.Sprintf("Customized default parameter group for %s %s", *cacheCluster.Engine, *cacheCluster.EngineVersion)),
})
if err != nil {
return errors.Wrapf(err, "failed to cache parameter group '%s'", customCacheParameterGroupName)
@ -1739,7 +1737,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t\tSet Cache Parameter Group : %s", customCacheParameterGroupName)
updateRes, err := svc.ModifyCacheCluster(&elasticache.ModifyCacheClusterInput{
CacheClusterId: cacheCluster.CacheClusterId,
CacheClusterId: cacheCluster.CacheClusterId,
CacheParameterGroupName: aws.String(customCacheParameterGroupName),
})
if err != nil {
@ -1755,10 +1753,10 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
_, err = svc.ModifyCacheParameterGroup(&elasticache.ModifyCacheParameterGroupInput{
CacheParameterGroupName: cacheCluster.CacheParameterGroup.CacheParameterGroupName,
ParameterNameValues: req.CacheClusterParameter,
ParameterNameValues: req.CacheClusterParameter,
})
if err != nil {
return errors.Wrapf(err, "failed to modify cache parameter group '%s'", * cacheCluster.CacheParameterGroup.CacheParameterGroupName)
return errors.Wrapf(err, "failed to modify cache parameter group '%s'", *cacheCluster.CacheParameterGroup.CacheParameterGroupName)
}
for _, p := range req.CacheClusterParameter {
@ -2011,7 +2009,6 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t%s\tUsing Service Discovery Namespace '%s'.\n", tests.Success, *sdNamespace.Id)
// Try to find an existing entry for the current service.
var existingService *servicediscovery.ServiceSummary
err = svc.ListServicesPages(&servicediscovery.ListServicesInput{
@ -2046,7 +2043,6 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
}
sdService = createRes.Service
log.Printf("\t\tCreated: %s.", *sdService.Arn)
} else {
@ -2059,7 +2055,6 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
}
sdService = getRes.Service
log.Printf("\t\tFound: %s.", *sdService.Arn)
// The number of instances that are currently associated with the service. Instances
@ -2161,7 +2156,6 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t\tFound certificate '%s'", req.ServiceDomainName)
}
descRes, err := svc.DescribeCertificate(&acm.DescribeCertificateInput{
CertificateArn: aws.String(certificateArn),
})
@ -2297,13 +2291,13 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// the load balancer is fully set up and ready to route traffic, its state is
// active. If the load balancer could not be set up, its state is failed.
log.Printf("\t\t\tState: %s.", *elb.State.Code)
var targetGroup *elbv2.TargetGroup
err = svc.DescribeTargetGroupsPages(&elbv2.DescribeTargetGroupsInput{
LoadBalancerArn: elb.LoadBalancerArn,
}, func(res *elbv2.DescribeTargetGroupsOutput, lastPage bool) bool {
for _, tg := range res.TargetGroups {
if *tg.TargetGroupName == req.ElbTargetGroupName {
if *tg.TargetGroupName == req.ElbTargetGroupName {
targetGroup = tg
return false
}
@ -2312,7 +2306,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
})
if err != nil {
if aerr, ok := err.(awserr.Error); !ok || aerr.Code() != elbv2.ErrCodeTargetGroupNotFoundException {
return errors.Wrapf(err, "failed to describe target group '%s'", req.ElbTargetGroupName )
return errors.Wrapf(err, "failed to describe target group '%s'", req.ElbTargetGroupName)
}
}
@ -2324,7 +2318,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// If no target group was found, create one.
createRes, err := svc.CreateTargetGroup(req.ElbTargetGroup)
if err != nil {
return errors.Wrapf(err, "failed to create target group '%s'", req.ElbTargetGroupName )
return errors.Wrapf(err, "failed to create target group '%s'", req.ElbTargetGroupName)
}
targetGroup = createRes.TargetGroups[0]
@ -2348,13 +2342,13 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
},
})
if err != nil {
return errors.Wrapf(err, "failed to modify target group '%s' attributes", req.ElbTargetGroupName )
return errors.Wrapf(err, "failed to modify target group '%s' attributes", req.ElbTargetGroupName)
}
log.Printf("\t\t\tSet sttributes.")
}
listenerPorts := map[string]int64 {
listenerPorts := map[string]int64{
"HTTP": 80,
}
if req.EnableHTTPS {
@ -2443,7 +2437,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
// group or groups associated with a service or task set.
TargetGroupArn: targetGroup.TargetGroupArn,
})
{
log.Println("Ensure Load Balancer DNS name exists for hosted zones.")
log.Printf("\t\tDNSName: '%s'.\n", *elb.DNSName)
@ -2467,11 +2461,11 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
input.ChangeBatch.Changes = append(input.ChangeBatch.Changes, &route53.Change{
Action: aws.String("UPSERT"),
ResourceRecordSet: &route53.ResourceRecordSet{
Name: aws.String(aName),
Type: aws.String("A"),
Name: aws.String(aName),
Type: aws.String("A"),
AliasTarget: &route53.AliasTarget{
HostedZoneId: elb.CanonicalHostedZoneId,
DNSName: elb.DNSName,
HostedZoneId: elb.CanonicalHostedZoneId,
DNSName: elb.DNSName,
EvaluateTargetHealth: aws.Bool(true),
},
},
@ -2569,7 +2563,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
"{DB_DRIVER}": "",
"{DB_DISABLE_TLS}": "",
"{ROUTE53_ZONES}": "",
"{ROUTE53_ZONES}": "",
"{ROUTE53_UPDATE_TASK_IPS}": "false",
// Directly map GitLab CICD env variables set during deploy.
@ -3161,11 +3155,11 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
svc := ecs.New(req.awsSession())
// The service cannot be stopped while it is scaled above 0
if ecsService.DesiredCount != nil && *ecsService.DesiredCount > 0 {
if ecsService.DesiredCount != nil && *ecsService.DesiredCount > 0 {
log.Println("\t\tScaling service down to zero.")
_, err := svc.UpdateService(&ecs.UpdateServiceInput{
Cluster: ecsService.ClusterArn,
Service: ecsService.ServiceArn,
Cluster: ecsService.ClusterArn,
Service: ecsService.ServiceArn,
DesiredCount: aws.Int64(int64(0)),
})
if err != nil {
@ -3174,7 +3168,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Println("\t\tWait for the service to scale down.")
err = svc.WaitUntilServicesStable(&ecs.DescribeServicesInput{
Cluster: ecsCluster.ClusterArn,
Cluster: ecsCluster.ClusterArn,
Services: aws.StringSlice([]string{*ecsService.ServiceArn}),
})
if err != nil {
@ -3199,7 +3193,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Println("\t\tWait for the service to be deleted.")
err = svc.WaitUntilServicesInactive(&ecs.DescribeServicesInput{
Cluster: ecsCluster.ClusterArn,
Cluster: ecsCluster.ClusterArn,
Services: aws.StringSlice([]string{*ecsService.ServiceArn}),
})
if err != nil {
@ -3421,13 +3415,13 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
svc := cloudwatchlogs.New(req.awsSession())
createRes, err := svc.CreateExportTask(&cloudwatchlogs.CreateExportTaskInput{
LogGroupName: aws.String(req.CloudWatchLogGroupName),
LogGroupName: aws.String(req.CloudWatchLogGroupName),
LogStreamNamePrefix: aws.String(logStreamName),
//TaskName: aws.String(taskId),
Destination: aws.String( req.S3BucketPrivateName),
Destination: aws.String(req.S3BucketPrivateName),
DestinationPrefix: aws.String(s3KeyPrefix),
From: aws.Int64(startTime.UTC().AddDate(0, 0, -1).UnixNano() / int64(time.Millisecond)),
To: aws.Int64(time.Now().UTC().AddDate(0, 0, 1).UnixNano() / int64(time.Millisecond)),
From: aws.Int64(startTime.UTC().AddDate(0, 0, -1).UnixNano() / int64(time.Millisecond)),
To: aws.Int64(time.Now().UTC().AddDate(0, 0, 1).UnixNano() / int64(time.Millisecond)),
})
if err != nil {
return []string{}, errors.Wrapf(err, "failed to create export task for from log group '%s' with stream name prefix '%s'", req.CloudWatchLogGroupName, logStreamName)
@ -3441,9 +3435,9 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
if err != nil {
return []string{}, errors.Wrapf(err, "failed to describe export task '%s' for from log group '%s' with stream name prefix '%s'", exportTaskId, req.CloudWatchLogGroupName, logStreamName)
}
taskStatus := *descRes.ExportTasks[0].Status.Code
taskStatus := *descRes.ExportTasks[0].Status.Code
if taskStatus == "COMPLETED" {
if taskStatus == "COMPLETED" {
downloadPrefix = filepath.Join(s3KeyPrefix, exportTaskId) + "/"
break
} else if taskStatus == "CANCELLED" || taskStatus == "FAILED" {
@ -3475,12 +3469,12 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
for _, s3Key := range s3Keys {
res, err := svc.GetObject(&s3.GetObjectInput{
Bucket: aws.String(req.S3BucketPrivateName),
Key: aws.String(s3Key),
Key: aws.String(s3Key),
})
if err != nil {
return []string{}, errors.Wrapf(err, "failed to get object '%s' from s3 bucket", s3Key, req.S3BucketPrivateName)
}
r,_ := gzip.NewReader(res.Body)
r, _ := gzip.NewReader(res.Body)
dat, err := ioutil.ReadAll(r)
res.Body.Close()
if err != nil {
@ -3506,8 +3500,8 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
svc := ecs.New(req.awsSession())
serviceTaskRes, err := svc.ListTasks(&ecs.ListTasksInput{
Cluster: aws.String(req.EcsClusterName),
ServiceName: aws.String(req.EcsServiceName),
Cluster: aws.String(req.EcsClusterName),
ServiceName: aws.String(req.EcsServiceName),
DesiredStatus: aws.String("STOPPED"),
})
if err != nil {
@ -3542,7 +3536,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t\t\tContainer %s exited with %d - %s.\n", *tc.Name, *tc.ExitCode, *tc.Reason)
} else if tc.ExitCode != nil {
log.Printf("\t\t\tContainer %s exited with %d.\n", *tc.Name, *tc.ExitCode)
} else {
} else {
log.Printf("\t\t\tContainer %s exited.\n", *tc.Name)
}
}
@ -3568,7 +3562,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
log.Printf("\t%s\tTask %s stopped with %s - %s.\n", tests.Failed, *t.TaskArn, *t.StopCode, *t.StoppedReason)
} else if t.StopCode != nil {
log.Printf("\t%s\tTask %s stopped with %s.\n", tests.Failed, *t.TaskArn, *t.StopCode)
} else {
} else {
log.Printf("\t%s\tTask %s stopped.\n", tests.Failed, *t.TaskArn)
}
@ -3603,7 +3597,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
go func() {
for {
select {
case <- ticker.C:
case <-ticker.C:
stop, err := checkTasks()
if err != nil {
log.Printf("\t%s\tFailed to check tasks.\n%+v\n", tests.Failed, err)
@ -3621,7 +3615,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
go func() {
svc := ecs.New(req.awsSession())
err := svc.WaitUntilServicesStable(&ecs.DescribeServicesInput{
Cluster: ecsCluster.ClusterArn,
Cluster: ecsCluster.ClusterArn,
Services: aws.StringSlice([]string{*ecsService.ServiceArn}),
})
if err != nil {
@ -3632,7 +3626,7 @@ func ServiceDeploy(log *log.Logger, req *serviceDeployRequest) error {
}
}()
if err := <-checkErr; err != nil {
if err := <-checkErr; err != nil {
log.Printf("\t%s\tFailed to check tasks.\n%+v\n", tests.Failed, err)
return nil
}

View File

@ -5,8 +5,8 @@
package retry
import (
"context"
"time"
"context"
"time"
)
// queryPollIntervals is a slice of the delays before re-checking the status on
@ -38,7 +38,6 @@ var DefaultPollIntervals = []time.Duration{
time.Minute,
}
// delayer keeps track of the current delay between retries.
type delayer struct {
Delays []time.Duration