func (t *TextDetail) SetAwsInfo(region string) error { meta := ec2metadata.New(session.New(), &aws.Config{Region: aws.String(region)}) instance_id, err := meta.GetMetadata("instance-id") svc := ec2.New(session.New(), &aws.Config{Region: aws.String(region)}) res, err := svc.DescribeInstances(nil) if err != nil { return err } tag_name := "" for _, r := range res.Reservations { for _, i := range r.Instances { if *i.InstanceId == instance_id { tag_name = *i.Tags[0].Value } } } t.AwsInstanceId = instance_id t.AwsTagName = tag_name return nil }
func initAWS() { defer Track("initAWS", Now(), debugOut) AWSSession = session.New() // Region if GlobalConfig.Get("awsRegion") != "" { // CLI trumps AWSSession.Config.Region = aws.String(GlobalConfig.Get("awsRegion")) } else if os.Getenv("AWS_REGION") == "" { // Grab it from this EC2 instace region, err := ec2metadata.New(session.New()).Region() if err != nil { fmt.Printf("Cannot set AWS region: '%v'\n", err) os.Exit(1) } AWSSession.Config.Region = aws.String(region) } // Creds if GlobalConfig.Get("awsAccessKey") != "" && GlobalConfig.Get("awsSecretKey") != "" { // CLI trumps creds := credentials.NewStaticCredentials( GlobalConfig.Get("awsAccessKey"), GlobalConfig.Get("awsSecretKey"), "") AWSSession.Config.Credentials = creds } }
func NewEBSService() (*ebsService, error) { var err error s := &ebsService{} s.metadataClient = ec2metadata.New(session.New()) if !s.isEC2Instance() { return nil, fmt.Errorf("Not running on an EC2 instance") } s.InstanceID, err = s.metadataClient.GetMetadata("instance-id") if err != nil { return nil, err } s.Region, err = s.metadataClient.Region() if err != nil { return nil, err } s.AvailabilityZone, err = s.metadataClient.GetMetadata("placement/availability-zone") if err != nil { return nil, err } config := aws.NewConfig().WithRegion(s.Region) s.ec2Client = ec2.New(session.New(), config) return s, nil }
func NewAwsAsgEbs(maxRetries int) *AwsAsgEbs { awsAsgEbs := &AwsAsgEbs{} metadata := ec2metadata.New(session.New()) region, err := metadata.Region() if err != nil { log.WithFields(log.Fields{"error": err}).Fatal("Failed to get region from instance metadata") } log.WithFields(log.Fields{"region": region}).Info("Setting region") awsAsgEbs.Region = region availabilityZone, err := metadata.GetMetadata("placement/availability-zone") if err != nil { log.WithFields(log.Fields{"error": err}).Fatal("Failed to get availability zone from instance metadata") } log.WithFields(log.Fields{"az": availabilityZone}).Info("Setting availability zone") awsAsgEbs.AvailabilityZone = availabilityZone instanceId, err := metadata.GetMetadata("instance-id") if err != nil { log.WithFields(log.Fields{"error": err}).Fatal("Failed to get instance id from instance metadata") } log.WithFields(log.Fields{"instance_id": instanceId}).Info("Setting instance id") awsAsgEbs.InstanceId = instanceId awsAsgEbs.AwsConfig = aws.NewConfig(). WithRegion(region). WithCredentials(ec2rolecreds.NewCredentials(session.New())). WithMaxRetries(maxRetries) return awsAsgEbs }
// here, support a function that maps a given redis key to a dynamodb table key and value field func NewDynamoModule(keymap KeyMapper) *DynamoModule { module := &DynamoModule{} cfgdir := "/etc" cfg := &module.config ok := logging.ReadModuleConfig(cfg, cfgdir, "dynamo") || logging.ReadModuleConfig(cfg, ".", "dynamo") sess := session.New(&aws.Config{Region: aws.String("ap-southeast-1")}) if !ok { log.Println("failed to read dynamo config, using defaults") } else { sess = session.New(&aws.Config{ Region: aws.String(cfg.Server.Region), Endpoint: aws.String(cfg.Server.Endpoint), DisableSSL: aws.Bool(cfg.Server.DisableSSL), }) } module.client = dynamodb.New(sess) if keymap != nil { module.keyMapper = keymap } else { module.keyMapper = module.defaultMapper } if cfg.Server.CacheDuration > 0 { logging.Debug.Println("activiating cache, TTL", cfg.Server.CacheDuration) module.cache = cache.NewMemoryWithTTL(time.Duration(cfg.Server.CacheDuration) * time.Second) } return module }
func (c *CloudWatch) Connect() error { Config := &aws.Config{ Region: aws.String(c.Region), Credentials: credentials.NewChainCredentials( []credentials.Provider{ &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())}, &credentials.EnvProvider{}, &credentials.SharedCredentialsProvider{}, }), } svc := cloudwatch.New(session.New(Config)) params := &cloudwatch.ListMetricsInput{ Namespace: aws.String(c.Namespace), } _, err := svc.ListMetrics(params) // Try a read-only call to test connection. if err != nil { log.Printf("cloudwatch: Error in ListMetrics API call : %+v \n", err.Error()) } c.svc = svc return err }
func main() { kingpin.Parse() me := ec2metadata.New(session.New(), &aws.Config{}) region, err := me.Region() if err != nil { fmt.Println(err) os.Exit(1) } cw := cloudwatch.New(session.New(&aws.Config{Region: aws.String(region)})) as := autoscaling.New(session.New(&aws.Config{Region: aws.String(region)})) // Get the name of this instance. instance, err := me.GetMetadata("instance-id") if err != nil { fmt.Println(err) os.Exit(1) } log.Printf("Instance: %s", instance) // Check if this instance is in an auto scaling group. gps, err := as.DescribeAutoScalingInstances(&autoscaling.DescribeAutoScalingInstancesInput{ InstanceIds: []*string{ aws.String(instance), }, }) if err == nil && len(gps.AutoScalingInstances) > 0 { group = *gps.AutoScalingInstances[0].AutoScalingGroupName log.Printf("AutoScaling group: %s", group) } // Loop and send to the backend. limiter := time.Tick(time.Second * 60) for { <-limiter // Submit all the values. for _, mn := range strings.Split(*cliMetrics, ",") { m, err := metric.New(mn) if err != nil { log.Printf("Cannot find metric: %s" + mn) continue } v, err := m.Value() if err != nil { log.Println("Cannot get metric.") } // Send the instance metrics. Send(cw, "InstanceId", instance, m.Name(), v) // Send the autoscaling. if group != "" { Send(cw, "AutoScalingGroupName", group, m.Name(), v) } } } }
func main() { kingpin.Version("2.1.0") kingpin.Parse() sl, err := syslog.New(syslog.LOG_NOTICE|syslog.LOG_LOCAL0, "[varnish-purge-proxy]") defer sl.Close() if err != nil { log.Println("Error writing to syslog") } else { log.SetFlags(0) log.SetOutput(sl) } if len(*tags) == 0 { fmt.Println("No tags specified") return } region, err = ec2metadata.New(session.New()).Region() if err != nil { log.Printf("Unable to retrieve the region from the EC2 instance %v\n", err) } // Set up access to ec2 svc := ec2.New(session.New(), &aws.Config{Region: ®ion}) go serveHTTP(*port, *listen, svc) select {} }
// discoverEc2Hosts searches an AWS region, returning a list of instance ips // where EC2TagKey = EC2TagValue func (c *Config) discoverEc2Hosts(logger *log.Logger) ([]string, error) { config := c.RetryJoinEC2 ec2meta := ec2metadata.New(session.New()) if config.Region == "" { logger.Printf("[INFO] agent: No EC2 region provided, querying instance metadata endpoint...") identity, err := ec2meta.GetInstanceIdentityDocument() if err != nil { return nil, err } config.Region = identity.Region } awsConfig := &aws.Config{ Region: &config.Region, Credentials: credentials.NewChainCredentials( []credentials.Provider{ &credentials.StaticProvider{ Value: credentials.Value{ AccessKeyID: config.AccessKeyID, SecretAccessKey: config.SecretAccessKey, }, }, &credentials.EnvProvider{}, &credentials.SharedCredentialsProvider{}, defaults.RemoteCredProvider(*(defaults.Config()), defaults.Handlers()), }), } svc := ec2.New(session.New(), awsConfig) resp, err := svc.DescribeInstances(&ec2.DescribeInstancesInput{ Filters: []*ec2.Filter{ { Name: aws.String("tag:" + config.TagKey), Values: []*string{ aws.String(config.TagValue), }, }, }, }) if err != nil { return nil, err } var servers []string for i := range resp.Reservations { for _, instance := range resp.Reservations[i].Instances { // Terminated instances don't have the PrivateIpAddress field if instance.PrivateIpAddress != nil { servers = append(servers, *instance.PrivateIpAddress) } } } return servers, nil }
// newS3Client returns S3 service client func newS3Client(cfg *aws.Config) *s3Client { return &s3Client{ region: *cfg.Region, client: s3.New(session.New(cfg)), uploader: s3manager.NewUploader(session.New(cfg), func(u *s3manager.Uploader) { u.PartSize = 64 * 1024 * 1024 }), } }
func newConfigProvider(c *cli.Context) client.ConfigProvider { p := session.New() if c.Bool(FlagAWSDebug) { config := &aws.Config{} config.WithLogLevel(1) p = session.New(config) } return p }
func NewKWriter(awsArn, awsRegion, stream *string, retries int) *KWriter { s := session.New(&aws.Config{ Credentials: stscreds.NewCredentials(session.New(&aws.Config{}), *awsArn), Region: awsRegion, }) client := kinesis.New(s) return &KWriter{ Client: client, MaxRetries: retries, StreamName: stream, } }
func NewAWSCloud(region string, tags map[string]string) (*AWSCloud, error) { c := &AWSCloud{Region: region} config := aws.NewConfig().WithRegion(region) c.EC2 = ec2.New(session.New(), config) c.IAM = iam.New(session.New(), config) c.ELB = elb.New(session.New(), config) c.Autoscaling = autoscaling.New(session.New(), config) c.Route53 = route53.New(session.New(), config) c.tags = tags return c, nil }
func NewS3(filename, profile, region string) *S3 { var creds *credentials.Credentials if _, err := os.Stat(filename); err == nil { log.Printf("Connecting to AWS using credentials from '%s'", filename) creds = credentials.NewSharedCredentials(filename, profile) } else { log.Printf("AWS credentials file '%s' dosen't exists, I will be using EC2 Role credentials", filename) sess := session.New() creds = credentials.NewCredentials(&ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess)}) } sess := session.New(&aws.Config{Credentials: creds, Region: aws.String(region)}) return &S3{svc: s3.New(sess)} }
func NewS3Client() *S3Client { var svc s3iface.S3API if log.IsDebug { svc = s3.New(session.New(), aws.NewConfig().WithLogLevel(aws.LogDebug)) } else { svc = s3.New(session.New()) } return &S3Client{ svc: svc, uploader: newS3Uploader(svc), downloader: newS3Downloader(svc), } }
// CreateImageRepo create a repository for the image on amazon's ECR(EC2 Container Repository) // if it doesn't exist as repository needs to be present before pushing and image into it. func CreateImageRepo(reponame string, params map[string]string) error { var ( accessKey string secretKey string regionName string ok bool ) accessKey, ok = params["accesskey"] if !ok { accessKey = "" } secretKey, ok = params["secretkey"] if !ok { secretKey = "" } regionName, ok = params["region"] if !ok || fmt.Sprint(regionName) == "" { return fmt.Errorf("No region parameter provided") } region := fmt.Sprint(regionName) creds := credentials.NewChainCredentials([]credentials.Provider{ &credentials.StaticProvider{ Value: credentials.Value{ AccessKeyID: accessKey, SecretAccessKey: secretKey, }, }, &credentials.EnvProvider{}, &credentials.SharedCredentialsProvider{}, &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(session.New())}, }) awsConfig := aws.NewConfig() awsConfig.WithCredentials(creds) awsConfig.WithRegion(region) svc := ecr.New(session.New(awsConfig)) repoInput := &ecr.CreateRepositoryInput{ RepositoryName: aws.String(reponame), } _, err := svc.CreateRepository(repoInput) if err != nil { if s3Err, ok := err.(awserr.Error); ok && s3Err.Code() == "RepositoryAlreadyExistsException" { return nil } return err } return nil }
//TODO: validate cluster func (c *Cluster) Info() (*ClusterInfo, error) { resources, err := getStackResources(cloudformation.New(session.New(c.aws)), c.stackName()) if err != nil { return nil, err } info, err := mapStackResourcesToClusterInfo(ec2.New(session.New(c.aws)), resources) if err != nil { return nil, err } info.Name = c.cfg.ClusterName return info, nil }
func (input *Sqs3Input) Run(runner pipeline.InputRunner, helper pipeline.PluginHelper) error { // initialize input.runner = runner input.sqs = sqs.New(session.New()) input.s3 = s3.New(session.New()) queue_url, err := get_queue(input.sqs, input.SqsQueue) if err != nil { return err } input.queue_url = queue_url //input.hostname = helper.PipelineConfig().Hostname() tickChan := runner.Ticker() sRunner := runner.NewSplitterRunner("") if !sRunner.UseMsgBytes() { sRunner.SetPackDecorator(input.packDecorator) } defer sRunner.Done() for { select { case <-input.stop: return nil case <-tickChan: } receipt_handle, bucket, key, err := receive_from_queue(input.sqs, input.queue_url) if err != nil { runner.LogError(fmt.Errorf("Error reading queue: %s", err.Error())) continue } o, _, err := get_object(input.s3, bucket, key) if err != nil { runner.LogError(fmt.Errorf("Error opening file: %s", err.Error())) if aws_err := awserr.Error(err); aws_err != nil { f aws_err.Code == "NoSuchBucket" or aws_err.Code == "NoSuchKey" { delete_message(input.sqs, input.queue_url, receipt_handle) } } continue } for err == nil { err = sRunner.SplitStream(o, nil) if err != io.EOF && err != nil { runner.LogError(fmt.Errorf("Error reading file: %s", err.Error())) } } o.Close() } }
func handleDescribeInstances(req *cwRequest, c *middleware.Context) { sess := session.New() creds := credentials.NewChainCredentials( []credentials.Provider{ &credentials.EnvProvider{}, &credentials.SharedCredentialsProvider{Filename: "", Profile: req.DataSource.Database}, &ec2rolecreds.EC2RoleProvider{Client: ec2metadata.New(sess), ExpiryWindow: 5 * time.Minute}, }) cfg := &aws.Config{ Region: aws.String(req.Region), Credentials: creds, } svc := ec2.New(session.New(cfg), cfg) reqParam := &struct { Parameters struct { Filters []*ec2.Filter `json:"filters"` InstanceIds []*string `json:"instanceIds"` } `json:"parameters"` }{} json.Unmarshal(req.Body, reqParam) params := &ec2.DescribeInstancesInput{} if len(reqParam.Parameters.Filters) > 0 { params.Filters = reqParam.Parameters.Filters } if len(reqParam.Parameters.InstanceIds) > 0 { params.InstanceIds = reqParam.Parameters.InstanceIds } var resp ec2.DescribeInstancesOutput err := svc.DescribeInstancesPages(params, func(page *ec2.DescribeInstancesOutput, lastPage bool) bool { reservations, _ := awsutil.ValuesAtPath(page, "Reservations") for _, reservation := range reservations { resp.Reservations = append(resp.Reservations, reservation.(*ec2.Reservation)) } return !lastPage }) if err != nil { c.JsonApiErr(500, "Unable to call AWS API", err) return } c.JSON(200, resp) }
func TestOutputService9ProtocolTestSupportsHeaderMapsCase1(t *testing.T) { sess := session.New() svc := NewOutputService9ProtocolTest(sess, &aws.Config{Endpoint: aws.String("https://test")}) buf := bytes.NewReader([]byte("{}")) req, out := svc.OutputService9TestCaseOperation1Request(nil) req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}} // set headers req.HTTPResponse.Header.Set("Content-Length", "10") req.HTTPResponse.Header.Set("X-Bam", "boo") req.HTTPResponse.Header.Set("X-Foo", "bar") // unmarshal response restjson.UnmarshalMeta(req) restjson.Unmarshal(req) assert.NoError(t, req.Error) // assert response assert.NotNil(t, out) // ensure out variable is used assert.Equal(t, "10", *out.AllHeaders["Content-Length"]) assert.Equal(t, "boo", *out.AllHeaders["X-Bam"]) assert.Equal(t, "bar", *out.AllHeaders["X-Foo"]) assert.Equal(t, "boo", *out.PrefixedHeaders["Bam"]) assert.Equal(t, "bar", *out.PrefixedHeaders["Foo"]) }
func TestOutputService1ProtocolTestScalarMembersCase1(t *testing.T) { sess := session.New() svc := NewOutputService1ProtocolTest(sess, &aws.Config{Endpoint: aws.String("https://test")}) buf := bytes.NewReader([]byte("{\"Str\": \"myname\", \"Num\": 123, \"FalseBool\": false, \"TrueBool\": true, \"Float\": 1.2, \"Double\": 1.3, \"Long\": 200, \"Char\": \"a\"}")) req, out := svc.OutputService1TestCaseOperation1Request(nil) req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}} // set headers req.HTTPResponse.Header.Set("ImaHeader", "test") req.HTTPResponse.Header.Set("X-Foo", "abc") // unmarshal response restjson.UnmarshalMeta(req) restjson.Unmarshal(req) assert.NoError(t, req.Error) // assert response assert.NotNil(t, out) // ensure out variable is used assert.Equal(t, "a", *out.Char) assert.Equal(t, 1.3, *out.Double) assert.Equal(t, false, *out.FalseBool) assert.Equal(t, 1.2, *out.Float) assert.Equal(t, "test", *out.ImaHeader) assert.Equal(t, "abc", *out.ImaHeaderLocation) assert.Equal(t, int64(200), *out.Long) assert.Equal(t, int64(123), *out.Num) assert.Equal(t, int64(200), *out.Status) assert.Equal(t, "myname", *out.Str) assert.Equal(t, true, *out.TrueBool) }
func main() { flag.Parse() if *filesPath == "" || *bucket == "" { fmt.Println("Please specify correct parameters!") fmt.Println("You should specify:") fmt.Println("-path with path to file you want to upload") fmt.Println("-bucket name of bucket in S3 where you want to upload") os.Exit(1) } file, err := os.Open(*filesPath) if err != nil { log.Fatal("Failed to open a file with an error: ", err) } defer file.Close() info, err := file.Stat() if err != nil { log.Fatal("Failed to get info about file with an error: ", err) } session := session.New(createConfig()) service := s3manager.NewUploader(session) switch mode := info.Mode(); { case mode.IsDir(): uploadDirectory(*service, *file) case mode.IsRegular(): uploadFile(*service, *uploadPath+getFileName(*filesPath), file) } }
func clientIAM(s logical.Storage) (*iam.IAM, error) { entry, err := s.Get("config/root") if err != nil { return nil, err } if entry == nil { return nil, fmt.Errorf( "root credentials haven't been configured. Please configure\n" + "them at the 'config/root' endpoint") } var config rootConfig if err := entry.DecodeJSON(&config); err != nil { return nil, fmt.Errorf("error reading root configuration: %s", err) } creds := credentials.NewStaticCredentials(config.AccessKey, config.SecretKey, "") awsConfig := &aws.Config{ Credentials: creds, Region: aws.String(config.Region), HTTPClient: cleanhttp.DefaultClient(), } return iam.New(session.New(awsConfig)), nil }
func TestOutputService4ProtocolTestListsCase2(t *testing.T) { sess := session.New() svc := NewOutputService4ProtocolTest(sess, &aws.Config{Endpoint: aws.String("https://test")}) buf := bytes.NewReader([]byte("{\"ListMember\": [\"a\", null], \"ListMemberMap\": [{}, null, null, {}], \"ListMemberStruct\": [{}, null, null, {}]}")) req, out := svc.OutputService4TestCaseOperation2Request(nil) req.HTTPResponse = &http.Response{StatusCode: 200, Body: ioutil.NopCloser(buf), Header: http.Header{}} // set headers // unmarshal response jsonrpc.UnmarshalMeta(req) jsonrpc.Unmarshal(req) assert.NoError(t, req.Error) // assert response assert.NotNil(t, out) // ensure out variable is used assert.Equal(t, "a", *out.ListMember[0]) assert.Nil(t, out.ListMember[1]) assert.Nil(t, out.ListMemberMap[1]) assert.Nil(t, out.ListMemberMap[2]) assert.Nil(t, out.ListMemberStruct[1]) assert.Nil(t, out.ListMemberStruct[2]) }
// clientEC2 creates a client to interact with AWS EC2 API. func (b *backend) clientEC2(s logical.Storage, region string) (*ec2.EC2, error) { b.configMutex.RLock() if b.EC2ClientsMap[region] != nil { defer b.configMutex.RUnlock() // If the client object was already created, return it. return b.EC2ClientsMap[region], nil } // Release the read lock and acquire the write lock. b.configMutex.RUnlock() b.configMutex.Lock() defer b.configMutex.Unlock() // If the client gets created while switching the locks, return it. if b.EC2ClientsMap[region] != nil { return b.EC2ClientsMap[region], nil } // Create a AWS config object using a chain of providers. awsConfig, err := b.getClientConfig(s, region) if err != nil { return nil, err } // Create a new EC2 client object, cache it and return the same. b.EC2ClientsMap[region] = ec2.New(session.New(awsConfig)) return b.EC2ClientsMap[region], nil }
func newECS(region string) *ecs.ECS { session := session.New() return ecs.New(session, &aws.Config{ Credentials: creds, Region: aws.String(region), }) }
func ExampleECS_SubmitContainerStateChange() { svc := ecs.New(session.New()) params := &ecs.SubmitContainerStateChangeInput{ Cluster: aws.String("String"), ContainerName: aws.String("String"), ExitCode: aws.Int64(1), NetworkBindings: []*ecs.NetworkBinding{ { // Required BindIP: aws.String("String"), ContainerPort: aws.Int64(1), HostPort: aws.Int64(1), Protocol: aws.String("TransportProtocol"), }, // More values... }, Reason: aws.String("String"), Status: aws.String("String"), Task: aws.String("String"), } resp, err := svc.SubmitContainerStateChange(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleECS_ListTasks() { svc := ecs.New(session.New()) params := &ecs.ListTasksInput{ Cluster: aws.String("String"), ContainerInstance: aws.String("String"), DesiredStatus: aws.String("DesiredStatus"), Family: aws.String("String"), MaxResults: aws.Int64(1), NextToken: aws.String("String"), ServiceName: aws.String("String"), StartedBy: aws.String("String"), } resp, err := svc.ListTasks(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleECS_CreateService() { svc := ecs.New(session.New()) params := &ecs.CreateServiceInput{ DesiredCount: aws.Int64(1), // Required ServiceName: aws.String("String"), // Required TaskDefinition: aws.String("String"), // Required ClientToken: aws.String("String"), Cluster: aws.String("String"), LoadBalancers: []*ecs.LoadBalancer{ { // Required ContainerName: aws.String("String"), ContainerPort: aws.Int64(1), LoadBalancerName: aws.String("String"), }, // More values... }, Role: aws.String("String"), } resp, err := svc.CreateService(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleCodeDeploy_RemoveTagsFromOnPremisesInstances() { svc := codedeploy.New(session.New()) params := &codedeploy.RemoveTagsFromOnPremisesInstancesInput{ InstanceNames: []*string{ // Required aws.String("InstanceName"), // Required // More values... }, Tags: []*codedeploy.Tag{ // Required { // Required Key: aws.String("Key"), Value: aws.String("Value"), }, // More values... }, } resp, err := svc.RemoveTagsFromOnPremisesInstances(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }