func (infra *Infrastructure) removeSQSQueue() { svc := sqs.New(session.New(), infra.config) svc.DeleteQueue(&sqs.DeleteQueueInput{ QueueUrl: aws.String(infra.queueURL), }) }
func (infra *Infrastructure) createIAMLambdaRolePolicy(roleName string) error { svc := iam.New(session.New(), infra.config) _, err := svc.PutRolePolicy(&iam.PutRolePolicyInput{ PolicyDocument: aws.String(`{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sqs:SendMessage" ], "Effect": "Allow", "Resource": "arn:aws:sqs:*:*:goad-*" }, { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "arn:aws:logs:*:*:*" } ] }`), PolicyName: aws.String("goad-lambda-role-policy"), RoleName: aws.String(roleName), }) return err }
func (t *Test) invokeLambda(awsConfig *aws.Config, cmd string) { svc := lambda.New(session.New(), awsConfig) svc.InvokeAsync(&lambda.InvokeAsyncInput{ FunctionName: aws.String("goad"), InvokeArgs: strings.NewReader(`{"cmd":"` + cmd + `"}`), }) }
func (infra *Infrastructure) createSQSQueue() (url string, err error) { svc := sqs.New(session.New(), infra.config) resp, err := svc.CreateQueue(&sqs.CreateQueueInput{ QueueName: aws.String("goad-" + uuid.NewV4().String()), }) if err != nil { return "", err } return *resp.QueueUrl, nil }
func (infra *Infrastructure) createLambdaFunction(roleArn string, payload []byte) error { svc := lambda.New(session.New(), infra.config) _, err := svc.GetFunction(&lambda.GetFunctionInput{ FunctionName: aws.String("goad"), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "ResourceNotFoundException" { _, err := svc.CreateFunction(&lambda.CreateFunctionInput{ Code: &lambda.FunctionCode{ ZipFile: payload, }, FunctionName: aws.String("goad"), Handler: aws.String("index.handler"), Role: aws.String(roleArn), Runtime: aws.String("nodejs"), Description: aws.String("Description"), MemorySize: aws.Int64(128), Publish: aws.Bool(true), Timeout: aws.Int64(300), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok { // Calling this function too soon after creating the role might // fail, so we should retry after a little while. // TODO: limit the number of retries. if awsErr.Code() == "InvalidParameterValueException" { time.Sleep(time.Second) return infra.createLambdaFunction(roleArn, payload) } } return err } } } } return nil }
func (infra *Infrastructure) createIAMLambdaRole(roleName string) (arn string, err error) { svc := iam.New(session.New(), infra.config) resp, err := svc.GetRole(&iam.GetRoleInput{ RoleName: aws.String(roleName), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "NoSuchEntity" { resp, err := svc.CreateRole(&iam.CreateRoleInput{ AssumeRolePolicyDocument: aws.String(`{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole" } }`), RoleName: aws.String(roleName), Path: aws.String("/"), }) if err != nil { return "", err } if err := infra.createIAMLambdaRolePolicy(*resp.Role.RoleName); err != nil { return "", err } return *resp.Role.Arn, nil } } else { return "", err } } return *resp.Role.Arn, nil }
func getClient(awsConfig *aws.Config) *sqs.SQS { client := sqs.New(session.New(), awsConfig) return client }