Skip to content

S3 encryption #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
204 changes: 155 additions & 49 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,69 +1,175 @@
version: 2

# TODO: centralize full configuration. Figure out how
# ?? Each step as a separate script that is downloaded and run ??
# ?? CircleCI feature request to supoort include from remote sources
# More Markdown terraform_testing
# Python testing. Add doc and test that too
# circleci/python: Both 2 and 3?
# if src/requirements.txt get version from *.tf and test
# Style+: flake8 + hacking?, prospector?
# Security: bandit, RATS,

# This file uses YAML anchors to deduplicate steps
# see https://circleci.com/blog/circleci-hacks-reuse-yaml-in-your-circleci-config-with-yaml/
# and https://learnxinyminutes.com/docs/yaml/

.steps_template: &steps_terraform_static_analysis
steps:
- checkout
- run:
name: "Check: Validate tf files (terraform validate)"
command: |
find . -type f -name "*.tf" -exec dirname {} \;|sort -u | while read m; do (terraform validate -check-variables=false "$m" && echo "√ $m") || exit 1 ; done
- run:
name: "Check: Terraform formatting (terraform fmt)"
command: |
if [ `terraform fmt --list=true -diff=true -write=false | tee format-issues | wc -c` -ne 0 ]; then
echo "Some terraform files need be formatted, run 'terraform fmt' to fix"
echo "Formatting issues:"
cat format-issues
exit 1
fi
- run:
name: "Install: tflint"
command: |
apk update
apk add jq wget
# Get latest version of tflint (v0.7.0 test if still need to exclude modules. Any other changes)
pkg_arch=linux_amd64
dl_url=$(curl -s https://api.github.com/repos/wata727/tflint/releases/latest | jq -r ".assets[] | select(.name | test(\"${pkg_arch}\")) | .browser_download_url")
wget ${dl_url}
unzip tflint_linux_amd64.zip
mkdir -p /usr/local/tflint/bin
# Setup PATH for later run steps - ONLY for Bash and not in Bash
#echo 'export PATH=/usr/local/tflint/bin:$PATH' >> $BASH_ENV
echo "Installing tflint..."
install tflint /usr/local/tflint/bin
echo "Configuring tflint..."
tf_ver=$(terraform version | awk 'FNR <= 1' | cut -dv -f2)
echo -e "\tConfig for terraform version: ${tf_ver}"
if [ -f '.tflint.hcl' ]; then
sed -i "/terraform_version =/s/\".*\"/\"${tf_ver}\"/" .tflint.hcl
else
{
echo -e "config {\nterraform_version = \"${tf_ver}\"\ndeep_check = true\nignore_module = {"
for module in $(grep -h '[^a-zA-Z]source[ =]' *.tf | sed -r 's/.*=\s+//' | sort -u); do
# if not ^"../
echo "${module} = true"
done
echo -e "}\n}\n"
} > .tflint.hcl
fi
echo "tflint configuration:"
cat .tflint.hcl
- run:
# Not supporting modules from registry ?? v0.5.4
# For now, must ignore in config file
name: "Check: tflint"
command: |
#echo "Initializing terraform..."
#terraform init -input=false
echo "Running tflint..."
/usr/local/tflint/bin/tflint --version
/usr/local/tflint/bin/tflint

jobs:
build:
###
### Documentation testing: Markdown
###
# Markdown Lint https://github.com/DavidAnson/markdownlint
# CLI https://github.com/igorshubovych/markdownlint-cli
# https://hub.docker.com/r/circleci/node/tags/
markdown_lint_node:
docker:
- image: hashicorp/terraform:0.11.3
entrypoint: /bin/sh
- image: circleci/node:10.5.0
steps:
- checkout
- run:
name: "Validate tf files (terraform validate)"
name: "Install: markdown lint (node.js)"
command: |
find . -type f -name "*.tf" -exec dirname {} \;|sort -u | while read m; do (terraform validate -check-variables=false "$m" && echo "√ $m") || exit 1 ; done
sudo npm install -g markdownlint-cli
- run:
name: "Check: Terraform formatting (terraform fmt)"
name: "Check: markdown lint (node.js)"
command: |
if [ `terraform fmt --list=true -diff=true -write=false | tee format-issues | wc -c` -ne 0 ]; then
echo "Some terraform files need be formatted, run 'terraform fmt' to fix"
echo "Formatting issues:"
cat format-issues
exit 1
fi
#markdownlint --help
echo -n "markdownlint version: "
markdownlint --version
markdownlint ./
# Markdown Lint https://github.com/markdownlint/markdownlint
# https://hub.docker.com/r/circleci/ruby/tags/
markdown_lint_ruby:
docker:
- image: circleci/ruby:2.5.1
steps:
- checkout
- run:
name: "Install: markdown lint (ruby)"
command: |
gem install mdl
- run:
name: "Check: markdown lint (ruby)"
command: |
#mdl --help
echo -n "mdl version: "
mdl --version
mdl .
markdown_proofer:
docker:
- image: circleci/golang:1.10
entrypoint: /bin/sh
steps:
- checkout
- run:
name: "Install: tflint"
name: "Install: markdown proofer"
command: |
apk add jq wget
# Get latest version of tflint
# Get latest version
pkg_arch=linux_amd64
dl_url=$(curl -s https://api.github.com/repos/wata727/tflint/releases/latest | jq -r ".assets[] | select(.name | test(\"${pkg_arch}\")) | .browser_download_url")
# Prerelease, so latest doesn't work yet
#dl_url=$(curl -s https://api.github.com/repos/felicianotech/md-proofer/releases/latest | jq -r ".assets[] | select(.name | test(\"${pkg_arch}\")) | .browser_download_url")
dl_url='https://github.com/felicianotech/md-proofer/releases/download/v0.2.0/md-proofer--v0.2.0--linux-amd64.tar.gz'
wget ${dl_url}
unzip tflint_linux_amd64.zip
mkdir -p /usr/local/tflint/bin
# Setup PATH for later run steps - ONLY for Bash and not in Bash
#echo 'export PATH=/usr/local/tflint/bin:$PATH' >> $BASH_ENV
echo "Installing tflint..."
install tflint /usr/local/tflint/bin
echo "Configuring tflint..."
tf_ver=$(terraform version | awk 'FNR <= 1' | cut -dv -f2)
echo -e "\tConfig for terraform version: ${tf_ver}"
if [ -f '.tflint.hcl' ]; then
sed -i "/terraform_version =/s/\".*\"/\"${tf_ver}\"/" .tflint.hcl
else
{
echo -e "config {\nterraform_version = \"${tf_ver}\"\ndeep_check = true\nignore_module = {"
for module in $(grep -h '[^a-zA-Z]source[ =]' *.tf | sed -r 's/.*=\s+//' | sort -u); do
# if not ^"../
echo "${module} = true"
done
echo "}}"
} > .tflint.hcl
fi
echo "tflint configuration:"
cat .tflint.hcl
tar xzf md-proofer--v0.2.0--linux-amd64.tar.gz
- run:
# Not supporting modules from registry ?? v0.5.4
# For now, must ignore in config file
name: "Check: tflint"
name: "Check: markdown proofer"
command: |
#echo "Initializing terraform..."
#terraform init -input=false
echo "Running tflint..."
/usr/local/tflint/bin/tflint --version
/usr/local/tflint/bin/tflint
./md-proofer version
#./md-proofer lint --help
# Will this find all *.md in directory structure or need to run in each directory ?
if ./md-proofer lint ./; then
echo "md-proofer passed"
else
echo "md-proofer failed"
fi
###
### Terraform testing
###
terraform_0_11_3:
docker:
- image: hashicorp/terraform:0.11.3
entrypoint: /bin/sh
<<: *steps_terraform_static_analysis

terraform_0_11_7:
docker:
- image: hashicorp/terraform:0.11.7
entrypoint: /bin/sh
<<: *steps_terraform_static_analysis

terraform_latest:
docker:
- image: hashicorp/terraform:latest
entrypoint: /bin/sh
<<: *steps_terraform_static_analysis

workflows:
version: 2
build:
terraform_testing:
jobs:
- build
- markdown_lint_node
- markdown_lint_ruby
# Currently doesn't do anything that markdownlint node doesn't do
#- markdown_proofer
- terraform_0_11_3
- terraform_0_11_7
- terraform_latest
7 changes: 4 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.terraform*
!terraform.tfstate*
terraform.*
*.tfstate
*.tfstate.backup
*.tfvars
.terraform
4 changes: 4 additions & 0 deletions .markdownlintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"default": true,
"MD013": { "code_blocks": false, "tables": false },
}
1 change: 1 addition & 0 deletions .mdlrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rules "~MD013"
47 changes: 47 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# See http://pre-commit.com for more information
# See http://pre-commit.com/hooks.html for more hooks
# To update to all latest tagged versions run:
# pre-commit autoupdate
# TODO: write dependencies install instructions and put in each of
# my pre-commit repos. Decide where to put for others
repos:
- repo: https://github.com/devops-workflow/pre-commit-terraform
rev: v1.13.3
hooks:
- id: terraform_tools
#- id: terraform_template
# args: [--owner=appzen-oss, --repo=terraform-template]
- id: terraform_fmt
- id: terraform_docs
- id: terraform_graph
#- id: tflint
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v1.4.0
hooks:
- id: check-case-conflict
- id: check-executables-have-shebangs
- id: check-merge-conflict
- id: check-yaml
- id: detect-aws-credentials
- id: detect-private-key
- id: mixed-line-ending
args: [--fix=lf]
- id: trailing-whitespace
# TODO: test these
# check-json
# pretty-format-json
#- repo: https://github.com/jumanjihouse/pre-commit-hooks
# # Requires: shellcheck, shfmt
# rev: 1.8.0
# hooks:
# - id: shellcheck
# - id: shfmt
#- repo: git://github.com/detailyang/pre-commit-shell
# # Requires: shellcheck
# rev: 1.0.2
# hooks:
# - id: shell-lint
# TODO:
# add bashate shell code style https://github.com/openstack-dev/bashate
# gitlint https://github.com/jorisroovers/gitlint
# Create new repo and hook for markdown linters
78 changes: 66 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,82 @@
[![CircleCI](https://circleci.com/gh/devops-workflow/terraform-aws-s3-buckets?style=svg)](https://circleci.com/gh/devops-workflow/terraform-aws-s3-buckets)
# AWS S3 Buckets Terraform module

AWS S3 Buckets Terraform module
========================
[![CircleCI](https://circleci.com/gh/appzen-oss/terraform-aws-s3-buckets.svg?style=svg)](https://circleci.com/gh/appzen-oss/terraform-aws-s3-buckets)
[![Github release](https://img.shields.io/github/release/appzen-oss/terraform-aws-s3-buckets.svg)](https://github.com/appzen-oss/terraform-aws-s3-buckets/releases)

Terraform module which creates S3 buckets on AWS.
Terraform module which creates multiple AWS S3 buckets

Terraform Registry: https://registry.terraform.io/modules/devops-workflow/s3-buckets/aws
[Terraform Registry](https://registry.terraform.io/modules/devops-workflow/s3-buckets/aws)

Usage
-----
## Usage

```hcl
module "s3-buckets" {
source = "devops-workflow/s3-buckets/aws"
names = ["bucket1", "bucket2", "bucket3"]
environment = "dev"
org = "corp"
source = "devops-workflow/s3-buckets/aws"
names = ["bucket1", "bucket2", "bucket3"]
environment = "dev"
organization = "corp"
}
```

This would create/manage 3 S3 buckets: `corp-dev-bucket1`, `corp-dev-bucket2`, and `corp-dev-bucket3`
This would create/manage 3 S3 buckets: `corp-dev-bucket1`, `corp-dev-bucket2`,
and `corp-dev-bucket3`

If a S3 bucket already exists, you will need to import it. Like this:

```Shell
terraform import module.s3-buckets.aws_s3_bucket.this[0] corp-dev-bucket1
```

<!-- BEGINNING OF PRE-COMMIT-TERRAFORM DOCS HOOK -->
## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|:----:|:-----:|:-----:|
| allow_encrypted_uploads_only | Set to `true` to prevent uploads of unencrypted objects to S3 bucket | string | `false` | no |
| attributes | Suffix name with additional attributes (policy, role, etc.) | list | `<list>` | no |
| block\_public\_acls | Whether Amazon S3 should block public ACLs for this bucket | string | `"true"` | no |
| block\_public\_policy | Whether Amazon S3 should block public bucket policies for this bucket | string | `"true"` | no |
| component | TAG: Underlying, dedicated piece of service (Cache, DB, ...) | string | `"UNDEF-S3-Buckets"` | no |
| delimiter | Delimiter to be used between `name`, `namespaces`, `attributes`, etc. | string | `"-"` | no |
| enabled | Set to false to prevent the module from creating anything | string | `"true"` | no |
| environment | Environment (ex: `dev`, `qa`, `stage`, `prod`). (Second or top level namespace. Depending on namespacing options) | string | n/a | yes |
| encryption | If encryption is true, create an S3 bucket with default encryption i.e. `AES256` | string | false | no |
| force\_destroy | Delete all objects in bucket on destroy | string | `"false"` | no |
| ignore\_public\_acls | Whether Amazon S3 should ignore public ACLs for this bucket | string | `"true"` | no |
| kms_master_key_arn | The AWS KMS master key ARN used for the `SSE-KMS` encryption. This can only be used when you set the value of `encryption` as `true`. The default aws/s3 AWS KMS master key is used if this element is absent | string | `` | no |
| monitor | TAG: Should resource be monitored | string | `"UNDEF-S3-Buckets"` | no |
| names | List of S3 bucket names | list | n/a | yes |
| namespace-env | Prefix name with the environment. If true, format is: <env>-<name> | string | `"true"` | no |
| namespace-org | Prefix name with the organization. If true, format is: <org>-<env namespaced name>. If both env and org namespaces are used, format will be <org>-<env>-<name> | string | `"true"` | no |
| organization | Organization name (Top level namespace) | string | `""` | no |
| owner | TAG: Owner of the service | string | `"UNDEF-S3-Buckets"` | no |
| principal | principal | string | `"*"` | no |
| product | TAG: Company/business product | string | `"UNDEF-S3-Buckets"` | no |
| public | Allow public read access to bucket | string | `"false"` | no |
| restrict\_public\_buckets | Whether Amazon S3 should restrict public bucket policies for this bucket | string | `"true"` | no |
| service | TAG: Application (microservice) name | string | `"UNDEF-S3-Buckets"` | no |
| sse_algorithm | The server-side encryption algorithm to use. Valid values are `AES256` and `aws:kms` | string | `AES256` | no |
| tags | A map of additional tags | map | `<map>` | no |
| team | TAG: Department/team of people responsible for service | string | `"UNDEF-S3-Buckets"` | no |
| versioned | Version the bucket | string | `"false"` | no |

## Outputs

| Name | Description |
|------|-------------|
| arns | List of AWS S3 Bucket ARNs |
| domain\_names | List of AWS S3 Bucket Domain Names |
| hosted\_zone\_ids | List of AWS S3 Bucket Hosted Zone IDs |
| ids | List of AWS S3 Bucket IDs |
| name\_bases | List of base names used to generate S3 bucket names |
| names | List of AWS S3 Bucket Names |
| regions | List of AWS S3 Bucket Regions |

<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->

<!-- BEGINNING OF PRE-COMMIT-TERRAFORM GRAPH HOOK -->

## Resource Graph of plan

![Terraform Graph](resource-plan-graph.png)
<!-- END OF PRE-COMMIT-TERRAFORM GRAPH HOOK -->
Loading