Attini Configuration
The Attini Framework will look for a file in your distributions root
directory called attini-config.json
, attini-config.yml
or
attini-config.yaml
. Only one of these files is allowed.
This file is required, and it should at least contain
a distributionName
.
distributionName: String
distributionId: String
version: String
distributionTags:
String: String
dependencies:
- distributionName: String
version: String
initDeployConfig:
template: String
stackName: String
forceUpdate: Boolean
tags:
String: String
variables:
String:
String: String
parameters:
String:
String: String
package:
container:
image: String
loginCommands:
- String
options:
- String
prePackage:
commands:
- String
postPackage:
commands:
- String
{
"distributionName": "String",
"distributionId": "String",
"version": "String",
"distributionTags": {
"String": "String"
},
"dependencies" : [
{
"distributionName" : "String",
"version" : "String"
}
],
"initDeployConfig": {
"template": "String",
"stackName": "String",
"forceUpdate": "Boolean",
"tags":{
"String": "String"
},
"variables": {
"String": {
"String": "String"
}
},
"parameters": {
"String": {
"String": "String"
}
}
},
"package": {
"container": {
"image": "String",
"loginCommands": [
"String"
],
"options": [
"Sting"
]
},
"prePackage": {
"commands": [
"String"
]
},
"postPackage": {
"commands": [
"String"
]
}
}
}
Type: String
Minimum 2 and maximum 128 characters. Allowed characters: “a-z”, “A-Z”, “0-9” and “-_.”.
If you don’t have a good name in mind, using your Git repository name is a good place to start. But this is not a requirement, sometimes a distribution consists of a combination of many Git repository’s and/or external resources, and sometimes it makes sense to split a repository up into many different distributions.
Required: Yes
Type: String
Minimum 2 and maximum 128 characters. Allowed characters: “a-z”, “A-Z”,“0-9” and “-_.”.
We recommend automatically setting the distributionId
using the
package
section in the attini-config
(see example below). This
will make it easy for you to use the same package logic on your
local computer as you use on your build server. The Git commit id is
a good value for the distributionId
because it will be easy to see
what code runs in your environments. It can also be a good idea to
append a timestamp to the id
so that you can re-build the same
commit if needed.
If you need to mock anything for your local builds (like an
environment variable), see the --environment-config-script
flag in
the attini distribution package
command.
Default: Random GUID
Required: No
Type: String
A semantic version for your distribution.
The version is intended to be a human-readable and sequential value
to identify your distribution. It’s different from the
distributionId
whose primary purpose is to be a unique identifier.
It’s recommended to configure the version for distributions that
are intended for production. See the --distribution-version
, -v
flags in the attini distribution package
command.
Required: No
Type: Map<String,String>
Metadata that is relevant to your organization or distribution, some normal use-cases include:
- Keep track of Git branch that was the source of the distribution.
- Build time.
- Build agent/build container.
- If your distribution consists of a combination of Git repositories, this is a good place to store the Git commit of those repositories.
Required: No
Type: List<Dependency>
A list of distributions that this distribution is dependent on. Attini will validate that the dependency is present in the environment. Attini will also include a URL to the dependencies output in the deployment plan payload (assuming it contains one).
Find more information here.
Required: No
initDeployConfig
Type: InitDeployConfig
Configuration for the Init Deploy.
Within this object, you can use distributionName
and environment
as sub-string parameters, see examples below.
Required: No
Type: Package
Under the package section, you can configure automation you want to
execute when packaging a distribution using the
attini distribution package
command. The attini deploy run
command
will also perform a package assuming the path supplied points is to a
directory.
The Attini CLI will create a temp working directory when packaging a distribution. Therefore, you can manipulate any resources without it affecting the original files.
The path to the temp directory will be stored in the ATTINI_WORK_DIR environment variable during the execution of package commands.
Required: No
Examples
Configuration examples
Simple example
distributionName: network
distributionId: 3957876a98566823744050eef132c133536ea32b
distributionTags:
branch: feature/add-nlb
{
"distributionName": "network",
"distributionId": "3957876a98566823744050eef132c133536ea32b",
"distributionTags": {
"Version": "1.1.2",
"Branch": "feature/add-nlb"
}
}
Full example
distributionName: platform
distributionId: 67e13cb77e9139929057602a46229cf0162c8747
version: 1.0.1
distributionTags:
owner: carl
branch: hotfix/bugfix
dependencies:
- distributionName: infra
version: ">1.0.0"
initDeployConfig:
template: pipeline.yaml
stackName: "${environment}-${distributionName}-init-deploy"
variables:
default:
configPath: /my/default/config.json
dev:
configPath: /my/dev/config.json
parameters:
default:
containerTag: latest
dev:
containerTag: 1.0.11
tags:
dev:
costCenter: Development
prod:
costCenter: Sales
package:
container:
image: 123424324422.dkr.ecr.eu-west-1.amazonaws.com/my-build-images:latest
loginCommands:
- export AWS_PROFILE=Shared
- aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123424324422.dkr.ecr.eu-west-1.amazonaws.com
options: # Here you add options for the docker run command.
- -v $HOME/.aws:/root/.aws:rw # this command will copy your local aws credentials to the container (if the container runs as root).
prePackage:
commands:
- echo $ATTINI_WORK_DIR
- export AWS_PROFILE=MyProfile
- attini configure set-dist-id --override --random
- attini configure set-tag --key version --value echo `1.0.2`
postPackage:
commands:
- echo "done with package"
{
"distributionName": "platform",
"distributionId": "67e13cb77e9139929057602a46229cf0162c8747",
"version": "1.0.1",
"distributionTags": {
"owner": "carl",
"branch": "hotfix/bugfix"
},
"dependencies" : [
{
"distributionName" : "String",
"version" : "String"
}
],
"initDeployConfig": {
"template": "pipeline.yaml",
"stackName": "${environment}-${distributionName}-init-deploy",
"variables": {
"default": {
"configPath": "/my/default/config.json"
},
"dev": {
"configPath": "/my/dev/config.json"
}
},
"parameters": {
"default": {
"containerTag": "latest"
},
"dev": {
"containerTag": "1.0.11"
}
},
"tags": {
"dev": {
"costCenter": "Development"
},
"prod": {
"costCenter": "Sales"
}
}
},
"package": {
"container": {
"image": "123424324422.dkr.ecr.eu-west-1.amazonaws.com/my-build-images:latest",
"loginCommands": [
"export AWS_PROFILE=Shared",
"aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 123424324422.dkr.ecr.eu-west-1.amazonaws.com"
],
"options": [
"-v $HOME/.aws:/root/.aws:rw"
]
},
"prePackage": {
"commands": [
"echo $ATTINI_WORK_DIR",
"export AWS_PROFILE=MyProfile",
"attini configure set-dist-id --override --random",
"attini configure set-tag --key version --value echo `1.0.2`"
]
},
"postPackage": {
"commands": [
"echo \"done with package\""
]
}
}
}
Examples with variables
If I’ve configured my variables in the attini-config
like the
example below.
initDeployConfig:
variables:
default:
myConfigDirectory: defaultConfigDirectory
stackNamePrefix: sandbox
dev:
myConfigDirectory: devConfigDirectory
stackNamePrefix: dev
The following will resolve to a valid AttiniCfn configuration file.
extends: ${myConfigDirectory}/file.yaml
parameters:
ParameterKey: ParameterValue
tags:
Key: Value
The following will also be a valid AttiniCfn step.
StepName:
Type: AttiniCfn
Properties:
StackName: ${stackNamePrefix}-hello-world-lambda
Template: /lambda.yaml
If you want to combine AWS CloudFormation Fn::Sub with Attini variables, the following syntax will work.
StepName:
Type: AttiniCfn
Properties:
StackName:
Fn::Sub:
- ${AttiniVariable}-${CloudFormationParameter}-hello-world-lambda
- AttiniVariable: ${stackNamePrefix}
CloudFormationParameter: !Ref Parameter # this assumes that there is a CloudFormation Parameter called "Parameter"
Template: /lambda.yaml