Git Product home page Git Product logo

aws-sm-buildkite-plugin's Introduction

AWS Secrets Manager Buildkite Plugin

A Buildkite plugin to read secrets from AWS Secrets Manager.

Unlike AWS Systems Manager (AWS SSM) Parameter Store, AWS Secrets Manager (AWS SM) supports:

  • Cross account access without assuming a role; and
  • The ability to setup automatic rotation of secrets

Setup

This plugins requires AWS CLI version 1.15 or above, as AWS Secrets Manager support is relatively new.

See AWS Setup for instructions on setting up the provider AWS account, and the build agent permissions.

Supported Secrets

This plugin supports both SecretString and SecretBinary AWS SM secret types.

SecretString

A AWS SM secret string may be plaintext or key/value. If you create a key/value secret, then the JSON will be returned.

SecretStrings can be exposed in an environment variable (env) or saved to a file.

JSON

This plugin supports expanding the secret JSON for you, which saves you from having to use jq pull JSON values out.

SecretBinary

Binary secrets can be saved to a file. They cannot be used with env (as they contain binary data).

Example

Ensure to escape the variable expression when using it in your steps, e.g. $$MY_SECRET or \$MY_SECRET. This is due to how buildkite interpolates variables on pipeline upload:

If you want an environment variable to be evaluated at run-time (for example, using the step’s environment variables) make sure to escape the $ character using $$ or $. For example:

For Secrets in the Same Account

For secrets in the same AWS account as the agent, you can use the secret name rather than the whole ARN.

steps:
  - commands: 'echo \$MY_SECRET'
    plugins:
      - seek-oss/aws-sm#v2.1.0:
          env:
            MY_SECRET: my-secret-id
            MY_OTHER_SECRET: my-other-secret-id
          file:
            - path: 'save-my-secret-here'
              secret-id: 'my-secret-file-id'
            - path: 'save-my-other-secret-here'
              secret-id: 'my-other-secret-file-id'

For Secrets in JSON

For Secrets in JSON (e.g. you're using AWS SMs key=value support), a jq-compatible json-key can be specified:

steps:
  - commands: 'echo \$MY_SECRET'
    plugins:
      - seek-oss/aws-sm#v2.1.0:
          env:
            MY_SECRET:
              secret-id: 'my-secret-id'
              json-key: '.Password'
            MY_OTHER_SECRET: my-other-secret-id

To apply all keys in a JSON secret as environment variables

steps:
  - commands: 'echo \$MY_SECRET'
    plugins:
      - seek-oss/aws-sm#v2.1.0:
          json-to-env:
            - secret-id: "my-secret-id"
              json-key: ".Variables"

With the above setting, a secret called my-secret-id with the contents:

{
  "Variables": {
    "MY_SECRET": "value",
    "MY_OTHER_SECRET": "other value"
  }
}

would set the MY_SECRET and MY_OTHER_SECRET environment variables.

Some points of note:

  • JSON keys are mapped into environment variables by replacing special characters with _. E.g. My-great key! would become My_great_key_
  • JSON keys with spaces are supported via json-key: '."My key with a space"' per normal jq syntax

For Secrets in Another Account

For secrets in another AWS account, use the secret ARN.

steps:
  - commands: 'echo \$SECRET_FROM_OTHER_ACCOUNT'
    plugins:
      - seek-oss/aws-sm#v2.1.0:
          env:
            SECRET_FROM_OTHER_ACCOUNT: 'arn:aws:secretsmanager:ap-southeast-2:1234567:secret:my-global-secret'
          file:
            - path: 'save-my-other-secret-here'
              secret-id: 'arn:aws:secretsmanager:ap-southeast-2:1234567:secret:my-global-file-secret'

For Secrets in Another Region

This plugin supports reading AWS SM secrets from a region that is different from where your agents are running. In this case, use the ARN syntax rather than a secret name. The region will be deduced from the secret ARN.

Using Secrets in Another Plugin

Per the examples above, the preferred plugin YAML syntax is to use an array of plugins over the object-key syntax, as this ensures consistent ordering between plugins. It's thus possible to use secrets from this plugin in another plugin:

steps:
  - command: npm publish
    plugins:
      - seek-oss/aws-sm#v2.1.0:
          env:
            MY_TOKEN: npm-publish-token
      - seek-oss/private-npm#v1.1.1:
          env: MY_TOKEN

Docker or Docker Compose

Note that if you're using the Docker plugin or Docker Compose plugin then the environment variable can be propagated to the container:

steps:
  - command: echo $$MY_SECRET
    plugins:
      - seek-oss/aws-sm#v2.1.0:
          env:
            MY_SECRET: the-secret-id
      - docker#v1.4.0:
          image: "node:8"
          environment:
            - MY_SECRET # propagates the env var to the container (docker run -e MY_SECRET)

Tests

To run the tests of this plugin, run

docker-compose run --rm tests

License

MIT (see LICENSE)

aws-sm-buildkite-plugin's People

Contributors

askoufis avatar jamestelfer avatar toolmantim avatar zsims avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.