Let's have some command-line fun with curl, [jq][1], and the [new GitHub Search API][2].
Today we're looking for:
Let's have some command-line fun with curl, [jq][1], and the [new GitHub Search API][2].
Today we're looking for:
/** | |
* Fancy ID generator that creates 20-character string identifiers with the following properties: | |
* | |
* 1. They're based on timestamp so that they sort *after* any existing ids. | |
* 2. They contain 72-bits of random data after the timestamp so that IDs won't collide with other clients' IDs. | |
* 3. They sort *lexicographically* (so the timestamp is converted to characters that will sort properly). | |
* 4. They're monotonically increasing. Even if you generate more than one in the same timestamp, the | |
* latter ones will sort after the former ones. We do this by using the previous random bits | |
* but "incrementing" them by 1 (only in the case of a timestamp collision). | |
*/ |
Introducing a new series: Post-Mortem Book Reports | |
Dear fellow systems engineers, | |
Take a moment and think about the past few years in systems outages and public | |
post mortems. | |
What were your favorite outages? What are the post-mortems that you read that | |
stick with you, months or years or years and years later? What did you learn | |
from them? |
# file name: infra/terraform/modules/aws_vpc/bastion_sg.tf | |
resource "aws_security_group" "bastion_ssh_sg" { | |
name = "bastion_ssh" | |
description = "Allow ssh to bastion hosts for each vpc from anywhere" | |
ingress { | |
from_port = 22 | |
to_port = 22 | |
protocol = "tcp" | |
cidr_blocks = ["0.0.0.0/0"] |
# file name terraform/modules/aws_vpc/vpc.tf | |
# first create the VPC. | |
# Prefix resources with var.name so we can have many environments trivially | |
resource "aws_vpc" "mod" { | |
cidr_block = "${var.cidr}" | |
enable_dns_hostnames = "${var.enable_dns_hostnames}" | |
enable_dns_support = "${var.enable_dns_support}" | |
tags { | |
Name = "${var.env}_vpc" |
# file name: terraform/env-staging/peering.tf | |
# No peering / direct connectivity between staging and prod, for safety. | |
resource "terraform_remote_state" "dev_state" { | |
backend = "s3" | |
config { | |
bucket = "${var.tf_s3_bucket}" | |
region = "${var.region}" | |
key = "${var.dev_state_file}" | |
} |
# snippet from terraform/env-dev/peering.tf | |
# import staging state, add routes from dev to staging | |
resource "terraform_remote_state" "staging_state" { | |
backend = "s3" | |
config { | |
bucket = "${var.tf_s3_bucket}" | |
region = "${var.region}" | |
key = "${var.staging_state_file}" | |
} |
#!/bin/bash -xe | |
# requires jq 1.5 (or at least > 1.3) and kafkacat | |
PATH=$PATH:/usr/lib/kafka/bin | |
topic="hound-staging.retriever-mutation" | |
which kafkacat || echo 'no kafkacat found, bye!' && exit 1 | |
which jq || echo 'no jq found, bye!' && exit 1 | |
# make sure jq is v 1.5 |
#!/bin/bash | |
# Usage: ./init.sh once to initialize remote storage for this environment. | |
# Subsequent tf actions in this environment don't require re-initialization, | |
# unless you have completely cleared your .terraform cache. | |
# | |
# terraform plan -var-file=./production.tfvars | |
# terraform apply -var-file=./production.tfvars | |
tf_env="production" |