package main | |
import ( | |
"context" | |
"fmt" | |
"io" | |
"log" | |
"net/http" | |
"os" | |
"time" | |
"github.com/aws/aws-sdk-go-v2/aws" | |
v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" | |
"github.com/aws/aws-sdk-go-v2/config" | |
"github.com/aws/aws-sdk-go-v2/service/rds" | |
) | |
const EmptyStringSHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" | |
func downloadCompleteLogFile(ctx context.Context, dbInstanceIdentifier string, logFileName string, dst io.Writer) error { | |
cfg, err := config.LoadDefaultConfig(ctx) | |
if err != nil { | |
return err | |
} | |
endpointResolver := rds.NewDefaultEndpointResolverV2() | |
endpoint, err := endpointResolver.ResolveEndpoint(ctx, rds.EndpointParameters{ | |
Region: aws.String(cfg.Region), | |
}) | |
if err != nil { | |
return err | |
} | |
url := endpoint.URI | |
url.Path = fmt.Sprintf("/v15/downloadCompleteLogFile/%s/%s", dbInstanceIdentifier, logFileName) | |
req, err := http.NewRequest(http.MethodGet, url.String(), nil) | |
if err != nil { | |
return err | |
} | |
creds, err := cfg.Credentials.Retrieve(ctx) | |
if err != nil { | |
return err | |
} | |
signer := v4.NewSigner() | |
err = signer.SignHTTP(ctx, creds, req, EmptyStringSHA256, "rds", cfg.Region, time.Now()) | |
if err != nil { | |
return err | |
} | |
res, err := http.DefaultClient.Do(req) | |
if err != nil { | |
return err | |
} | |
defer res.Body.Close() | |
_, err = io.Copy(dst, res.Body) | |
return err | |
} | |
func main() { | |
dbInstanceIdentifier := "..." | |
logFileName := "error/postgresql.log.yyyy-mm-dd-hhmi" | |
ctx := context.Background() | |
err := downloadCompleteLogFile(ctx, dbInstanceIdentifier, logFileName, os.Stdout) | |
if err != nil { | |
log.Fatal(err) | |
} | |
} |
gist758d768c2efb4b17b45ecb9d4e915c22
CLIも作った。
実はいにしえのgoamz(のフォーク?)が対応していて、それを使ったツールも作ったけど、SSOやAWS_PROFILEの対応が辛いので作り直した。リトライまわりは未対応