From e9d6d93113a07a35b9ae1a1543e46507c39a3179 Mon Sep 17 00:00:00 2001 From: Erik Osterman Date: Sun, 14 Jun 2020 14:31:16 -0700 Subject: [PATCH] Add scaffolding (#56) * Add scaffolding * add templates * add github action to build arch * rename image * rename * add screenshot * add screenshot --- .dockerignore | 17 ++++++ .github/CODEOWNERS | 14 +++++ .github/ISSUE_TEMPLATE/bug_report.md | 37 ++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 18 ++++++ .github/ISSUE_TEMPLATE/feature_request.md | 36 +++++++++++ .github/ISSUE_TEMPLATE/question.md | 0 .github/PULL_REQUEST_TEMPLATE.md | 13 ++++ .github/workflows/build-and-push.yml | 23 +++++++ Dockerfile | 49 +++++++++++++++ Makefile | 37 +++++++++++- README.md | 6 ++ README.yaml | 6 ++ docs/screenshot.png | Bin 0 -> 78127 bytes projects/Makefile.parent | 70 ++++++++++++++++++++++ projects/README.md | 62 +++++++++++++++++++ rootfs/.gitignore | 0 rootfs/etc/profile.d/aws-saml2aws.sh | 19 ++++++ 17 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 .dockerignore create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/build-and-push.yml create mode 100644 Dockerfile create mode 100644 docs/screenshot.png create mode 100644 projects/Makefile.parent create mode 100644 projects/README.md create mode 100644 rootfs/.gitignore create mode 100644 rootfs/etc/profile.d/aws-saml2aws.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4d16d8c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,17 @@ +.git +.gitignore +.editorconfig + +# Compiled files +**/.terraform/* +**/.terragrunt-cache/* +*.tfstate +*.tfstate.* + +# Module directory +.terraform +**/.idea +**/*.iml + +**/.build-harness +**/build-harness diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..bed3c96 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,14 @@ +# Use this file to define individuals or teams that are responsible for code in a repository. +# Read more: +# +# Order is important: the last matching pattern takes the most precedence + +# These owners will be the default owners for everything +* @cloudposse/engineering @cloudposse/contributors + +# Cloud Posse must review any changes to Makefiles +**/Makefile @cloudposse/engineering +**/Makefile.* @cloudposse/engineering + +# Cloud Posse must review any changes to GitHub actions +.github/* @cloudposse/engineering diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..f3df96b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,37 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: 'bug' +assignees: '' + +--- + +Found a bug? Maybe our [Slack Community](https://slack.cloudposse.com) can help. + +[![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com) + +## Describe the Bug +A clear and concise description of what the bug is. + +## Expected Behavior +A clear and concise description of what you expected to happen. + +## Steps to Reproduce +Steps to reproduce the behavior: +1. Go to '...' +2. Run '....' +3. Enter '....' +4. See error + +## Screenshots +If applicable, add screenshots or logs to help explain your problem. + +## Environment (please complete the following information): + +Anything that will help us triage the bug will help. Here are some ideas: + - OS: [e.g. Linux, OSX, WSL, etc] + - Version [e.g. 10.15] + +## Additional Context +Add any other context about the problem here. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..76ae6d6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,18 @@ +blank_issues_enabled: false + +contact_links: + + - name: Community Slack Team + url: https://cloudposse.com/slack/ + about: |- + Please ask and answer questions here. + + - name: Office Hours + url: https://cloudposse.com/office-hours/ + about: |- + Join us every Wednesday for FREE Office Hours (lunch & learn). + + - name: DevOps Accelerator Program + url: https://cloudposse.com/accelerate/ + about: |- + Own your infrastructure in record time. We build it. You drive it. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..39a8686 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,36 @@ +--- +name: Feature Request +about: Suggest an idea for this project +title: '' +labels: 'feature request' +assignees: '' + +--- + +Have a question? Please checkout our [Slack Community](https://slack.cloudposse.com) or visit our [Slack Archive](https://archive.sweetops.com/). + +[![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com) + +## Describe the Feature + +A clear and concise description of what the bug is. + +## Expected Behavior + +A clear and concise description of what you expected to happen. + +## Use Case + +Is your feature request related to a problem/challenge you are trying to solve? Please provide some additional context of why this feature or capability will be valuable. + +## Describe Ideal Solution + +A clear and concise description of what you want to happen. If you don't know, that's okay. + +## Alternatives Considered + +Explain what alternative solutions or features you've considered. + +## Additional Context + +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..e69de29 diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..4b8f32d --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,13 @@ +## what +* Describe high-level what changed as a result of these commits (i.e. in plain-english, what do these changes mean?) +* Use bullet points to be concise and to the point. + +## why +* Provide the justifications for the changes (e.g. business case). +* Describe why these changes were made (e.g. why do these commits fix the problem?) +* Use bullet points to be concise and to the point. + +## references +* Link to any supporting github issues or helpful documentation to add some context (e.g. stackoverflow). +* Use `closes #123`, if this PR closes a GitHub issue `#123` + diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml new file mode 100644 index 0000000..ed9361f --- /dev/null +++ b/.github/workflows/build-and-push.yml @@ -0,0 +1,23 @@ +name: docker +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] + +jobs: + update: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v1 + - name: docker/build-and-push + uses: docker/build-push-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + repository: ${{ github.repository }} + registry: registry-1.docker.io + tag_with_ref: true + tag_with_sha: true diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..aeb83d5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,49 @@ +FROM cloudposse/geodesic:0.132.1 + +# Geodesic message of the Day +ENV MOTD_URL="https://geodesic.sh/motd" + +# Some configuration options for Geodesic +ENV AWS_SAML2AWS_ENABLED=true +ENV AWS_VAULT_ENABLED=false +ENV GEODESIC_TERRAFORM_WORKSPACE_PROMPT_ENABLED=true +ENV DIRENV_ENABLED=false + +ENV DOCKER_IMAGE="cloudposse/reference-architectures" +ENV DOCKER_TAG="latest" +ENV NAMESPACE="eg" + +# Geodesic banner message +ENV BANNER="sweet ops" + +# Pin kubectl to version 1.15 +RUN apk add kubectl-1.15@cloudposse + +# Install terraform +RUN apk add terraform@cloudposse + +# Install helmfile +RUN apk add helmfile@cloudposse + +# Install saml2aws +# https://github.com/Versent/saml2aws#linux +RUN apk add saml2aws@cloudposse + +# Install assume-role +RUN apk add assume-role@cloudposse + +# Install variant2 overwriting variant +RUN apk add variant2@cloudposse + +# Install the "docker" command to interact with the host's Docker daemon +RUN apk add -u docker-cli + +# Limit Makefile searches set up by Geodesic +# Allow a single Makefile to serve all child directories +ENV MAKE_INCLUDES="Makefile.settings ../Makefile.parent Makefile" + +COPY rootfs/ / + +COPY projects/ /projects/ + +WORKDIR /projects/ diff --git a/Makefile b/Makefile index ee22cf7..786b0cb 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,38 @@ -# Import the cloudposse/build-harness -include $(shell curl -sSL -o .build-harness "https://git.io/build-harness"; echo .build-harness) --include tasks/Makefile.* +export DOCKER_ORG ?= cloudposse +export DOCKER_IMAGE ?= $(DOCKER_ORG)/reference-architectures +export DOCKER_TAG ?= latest +export DOCKER_IMAGE_NAME ?= $(DOCKER_IMAGE):$(DOCKER_TAG) +export APP_NAME ?= geodesic.sh +GEODESIC_INSTALL_PATH ?= /usr/local/bin +export INSTALL_PATH ?= $(GEODESIC_INSTALL_PATH) +export SCRIPT = $(INSTALL_PATH)/$(APP_NAME) # The target called when calling `make` with no arguments export DEFAULT_HELP_TARGET = help/short +# Import the cloudposse/build-harness +-include $(shell curl -sSL -o .build-harness "https://git.io/build-harness"; echo .build-harness) + +## Initialize build-harness, install deps, build docker container, install wrapper script and run shell +all: init deps build install run + @exit 0 + +## Install dependencies (if any) +deps: + @exit 0 + +## Build docker image +build: + @make --no-print-directory docker/build + +## Push docker image to registry +push: + docker push $(DOCKER_IMAGE) + +## Install wrapper script from geodesic container +install: + @docker run --rm $(DOCKER_IMAGE_NAME) | bash -s $(DOCKER_TAG) || (echo "Try: sudo make install"; exit 1) + +## Start the geodesic shell by calling wrapper script +run: + $(SCRIPT) diff --git a/README.md b/README.md index f051c98..a92642b 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,12 @@ It's 100% Open Source and licensed under the [APACHE2](LICENSE). +## Screenshots + + +![demo](docs/screenshot.png) +*Example of using the `geodesic` shell as a build a docker image built from the `cloudposse/reference-architectures`* + ## Introduction diff --git a/README.yaml b/README.yaml index 4af7cc5..669adf2 100644 --- a/README.yaml +++ b/README.yaml @@ -92,6 +92,12 @@ introduction: |- The master account owns the top-level DNS zone and then delegates NS authority to each member account. +# Screenshots +screenshots: + - name: "demo" + description: "Example of using the `geodesic` shell as a build a docker image built from the `cloudposse/reference-architectures`" + url: "docs/screenshot.png" + quickstart: |- ### Assumptions diff --git a/docs/screenshot.png b/docs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e412ca08a1d8d8b93b19e6f2e9399721316f5ac8 GIT binary patch literal 78127 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%0D{4?Ynv%6EK)Yv{M?cwtL-XpJFZUa5F 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 GLK6VQC3}+q literal 0 HcmV?d00001 diff --git a/projects/Makefile.parent b/projects/Makefile.parent new file mode 100644 index 0000000..45c0036 --- /dev/null +++ b/projects/Makefile.parent @@ -0,0 +1,70 @@ +init: .terraform/terraform.tfstate + +workspace/% %.workspace: conf/%.tfvars .terraform/terraform.tfstate + @terraform workspace select $* || terraform workspace new $* + +plan: + @if [[ -n $${WORKSPACE:=$$(cat .terraform/environment 2>/dev/null)} ]]; then \ + echo terraform plan -var-file conf/$${WORKSPACE}.tfvars -out $${WORKSPACE}.planfile; \ + terraform plan -var-file conf/$${WORKSPACE}.tfvars -out $${WORKSPACE}.planfile; \ + else \ + echo You must first select a workspace with "'make workspace/...'" >&2; exit 4; \ + fi + +apply: + @if [[ -n $${WORKSPACE:=$$(cat .terraform/environment 2>/dev/null)} ]]; then \ + if [[ -s $${WORKSPACE}.planfile ]]; then \ + echo terraform apply $${WORKSPACE}.planfile; \ + terraform apply $${WORKSPACE}.planfile && rm $${WORKSPACE}.planfile; \ + else \ + echo "You must first 'make plan'" >&2; exit 3; \ + fi; \ + else \ + echo You must first select a workspace with "'make workspace/...'" >&2; exit 4; \ + fi + +clean: + rm -rf .terraform *.planfile + +# refresh the terraform state & outputs +refresh: + @if [[ -n $${WORKSPACE:=$$(cat .terraform/environment 2>/dev/null)} ]]; then \ + echo terraform refresh -var-file conf/$${WORKSPACE}.tfvars; \ + terraform refresh -var-file conf/$${WORKSPACE}.tfvars; \ + else \ + echo You must first select a workspace with "'make workspace/...'" >&2; exit 4; \ + fi + +.terraform/terraform.tfstate: + terraform init + +## make .plan will always run "terraform plan" to create a planfile for workspace "" +## make .planfile will run "terraform plan" to create a planfile for workspace "" if it is +## out of date with respect to source files +%.plan %.planfile: conf/%.tfvars *.tf workspace/% + terraform plan -var-file conf/$*.tfvars -out $*.planfile + +## make .apply will run "terraform apply" using an existing ".planfile" file for workspace "" +%.apply: workspace/% + @if [[ -s $*.planfile ]]; then \ + echo terraform apply $*.planfile; \ + terraform apply $*.planfile && rm $*.planfile; \ + else \ + echo "You must first 'make $*.planfile'" >&2; exit 3; \ + fi; \ + +## make .sync will run "terraform plan" then "terraform apply" for workspace "" +%.sync: conf/%.tfvars workspace/% %.planfile + terraform apply $*.planfile && rm $*.planfile + +# refresh the terraform state & outputs +%.refresh: workspace/% + terraform refresh -var-file conf/$*.tfvars + +# output the terraform state outputs +%.output: workspace/% + @ terraform output + +.PHONY: init plan apply clean sync refresh output + +.SECONDARY: diff --git a/projects/README.md b/projects/README.md new file mode 100644 index 0000000..1ace8ad --- /dev/null +++ b/projects/README.md @@ -0,0 +1,62 @@ +# Infrastructure Projects + +Terraform and Kubernetes projects exist in here. + +## Terraform workflow + +Terraform operates on a "workspace". We have a named workspace for each AWS account. +In these examples, we will use "dev" as the workspace we are operating on, but "dev" +can be replaced with any workspace name for which there is a `conf/$workspace.tfvars` file. + +### Manual, multi-step workflow + +Remember, replace "dev" with whatever valid workspace name you want. + +```bash +make init # initializes Terraform +make workspace/dev # selects workspace "dev" +make plan # make planfile for current workspace +make apply # apply planfile for current workspace, delete planfile on success +``` + +### Automatic, single-step workflow + +Remember, replace "dev" with whatever valid workspace name you want. + +- Generate Terraform planfile (the output of `terraform plan` and input to `terraform apply`), if needed: + + ```bash + make dev.planfile + ``` + +- Optionally/alternatively: (re-)generate Terraform planfile regardless of whether there is a current up-to-date one already: + + ```bash + make dev.plan + ``` + +- Apply an existing planfile and delete it on success. Will fail if planfile does not exist: + + ```bash + make dev.apply + ``` + +## Cold Start + +Initiating the project requires a specific order. + +* Initialize the [tfstate-backend](tfstate-backend/README.md) +* Create the [accounts](account/README.md) +* Configure [SSO](sso/README.md) with a GSuite Admin +* Configure [primary IAM roles](iam-primary-roles/README.md) +* Configure [delegated IAM roles](iam-delegated-roles/) +* Configure [VPCs](vpc/) +* Configure [CloudTrail bucket](cloudtrail-bucket/) on `master` +* Configure [CloudTrail](cloudtrail/) per account +* Configure [primary DNS zones](dns-primary/) +* Configure [delegated DNS zones](dns-delegated/) +* Configure [EKS clusters](eks/) +* Configure [EFS](efs/) +* Configure [EKS IAM Roles](eks-iam/) +* Configure [Helm external-dns](helmfiles/external-dns) +* Configure [Helm metrics-server](helmfiles/kube-state-metrics) diff --git a/rootfs/.gitignore b/rootfs/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/rootfs/etc/profile.d/aws-saml2aws.sh b/rootfs/etc/profile.d/aws-saml2aws.sh new file mode 100644 index 0000000..d25ab71 --- /dev/null +++ b/rootfs/etc/profile.d/aws-saml2aws.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +if [[ $GEODESIC_TRACE =~ saml ]]; then + export _GEODESIC_TRACE_SAML=true +else + unset _GEODESIC_TRACE_SAML +fi + +if [ "${AWS_SAML2AWS_ENABLED}" == "true" ]; then + [[ -n $_GEODESIC_TRACE_SAML ]] && echo "trace: Executing aws-saml2aws.sh" + if command -v saml2aws >/dev/null; then + [[ -n $_GEODESIC_TRACE_SAML ]] && green "trace: saml2aws installed" + else + [[ -n $_GEODESIC_TRACE_SAML ]] && red "trace: saml2aws not installed" + exit 1 + fi + + ln -sf /localhost/.saml2aws ${HOME} +fi