Skip to content

Instantly share code, notes, and snippets.

@jjmerri
Created March 8, 2023 13:49
Show Gist options
  • Save jjmerri/4aeb669454932f641164fa0238eadfb8 to your computer and use it in GitHub Desktop.
Save jjmerri/4aeb669454932f641164fa0238eadfb8 to your computer and use it in GitHub Desktop.
A k6 test that makes a signed request to AWS AppSync
import http from "k6/http";
import { check } from "k6";
import { AWSConfig, SignatureV4 } from "https://jslib.k6.io/aws/0.7.1/aws.js";
const awsConfig = new AWSConfig({
region: __ENV.AWS_REGION,
accessKeyId: __ENV.AWS_ACCESS_KEY_ID,
secretAccessKey: __ENV.AWS_SECRET_ACCESS_KEY,
sessionToken: __ENV.AWS_SESSION_TOKEN,
});
export const options = {
scenarios: {
constant_request_rate: {
executor: "constant-arrival-rate",
rate: 120,
timeUnit: "1s",
duration: "15m",
preAllocatedVUs: 100,
maxVUs: 500,
},
},
};
export default function () {
const reqBody = {
query: `{
hero {
name
}
}`
};
const signer = new SignatureV4({
service: "appsync",
region: awsConfig.region,
credentials: {
accessKeyId: awsConfig.accessKeyId,
secretAccessKey: awsConfig.secretAccessKey,
sessionToken: awsConfig.sessionToken,
},
});
const signedRequest = signer.sign(
{
method: "POST",
protocol: "https",
hostname: "your_app_sync.appsync-api.us-east-1.amazonaws.com",
headers: {},
body: JSON.stringify(reqBody),
path: "/graphql",
uriEscapePath: false,
applyChecksum: false,
},
{
signingDate: new Date(),
}
);
const res = http.post(signedRequest.url, signedRequest.body, {
headers: signedRequest.headers,
});
check(res, {
"status is 200": (r) => r.status === 200,
});
// log errors API errors so we can debug
if (res.status !== 200) {
console.error(JSON.stringify(res));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment