@davidpellerin/accountfactory
Version:
AWS Organizations setup and management tool for creating and managing multi-account setups
178 lines (137 loc) ⢠6.4 kB
Markdown
# š accountfactory
[](https://codecov.io/github/davidpellerin/accountfactory)
[](https://badge.fury.io/js/@davidpellerin%2Faccountfactory)
[](https://github.com/davidpellerin/accountfactory/issues)
A command-line tool for managing [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html), creating accounts, and setting up IAM users across multiple accounts.
## Features
- Create and manage AWS Organizations accounts (eg: shared, staging, and production environments)
- Set up IAM users across multiple accounts
- Configure AWS CLI profiles automatically
- Store credentials securely in AWS Secrets Manager
## Installation
```bash
npm install -g @davidpellerin/accountfactory
```
## Prerequisites
- Node.js 18 or higher
- AWS CLI installed and configured with appropriate credentials
- AWS Organizations access in your root/management account
## Usage
```bash
accountfactory - AWS Infrastructure deployment tool
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
list-accounts š List accounts in your AWS Organization
generate-skeleton š Generate a skeleton accountfactory.json file
create-accounts [options] š Deploy accounts in your AWS Organization
setup-aws-profiles [options] š§ Configure AWS profiles using creds from Secrets Manager
help [command] display help for command
```
### List AWS Organization Accounts
```bash
$ AWS_PROFILE=organizations accountfactory list-accounts
āāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāā
ā (index) ā Email ā Id ā Status ā
āāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāā¤
ā 0 ā 'sharedservices@example.com' ā '012345678901' ā 'ACTIVE' ā
ā 1 ā 'staging@example.com' ā '012345678902' ā 'ACTIVE' ā
ā 2 ā 'production@example.com' ā '012345678903' ā 'ACTIVE' ā
ā 3 ā 'oldaccount@example.com' ā '012345678904' ā 'SUSPENDED' ā
āāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāā
```
^ In this example I ran this command with `AWS_PROFILE=organizations` (which is a profile I specifically setup with permissions to manage my organization. (see: [IAM permissions](#IAM-Permissions))
### Generate Skeleton
```bash
$ accountfactory generate-skeleton
```
Creates an `accountfactory.json` file in your current directory. It is a json file that you can modify with the list of accounts you want `accountfactory` to create. It will look like this:
```json
{
"accounts": [
{
"accountName": "Shared Services",
"profileName": "myappname-shared",
"email": "sharedservices@example.com"
},
{
"accountName": "Staging",
"profileName": "myappname-staging",
"email": "staging@example.com"
},
{
"accountName": "Production",
"profileName": "myappname-production",
"email": "production@example.com"
}
]
}
```
### Create New Accounts
```bash
$ accountfactory create-accounts --username <iam-username>
```
Iterates through the accounts in `accountfactory.json` and creates those accounts in your AWS Organization.
### Setup AWS Profiles
```bash
$ accountfactory setup-aws-profiles --username <iam-username> --prefix <profile-prefix>
```
This command creates profiles in (`~/.aws/credentials`) for each account. This command uses the `aws` cli tool under the hood.
## Security
This tool requires high-privilege AWS credentials and should be used with caution. It's recommended to:
- Use MFA-protected credentials
- Review all actions before confirming
- Follow the principle of least privilege
- Regularly rotate credentials
## IAM Permissions
Although you could _theoretically_ just give your account `AdministratorAccess` that's really not a good practice.
One good way of limiting the blast radius is to use a dediacted organizations "management account" that you will use to create and manage the child accounts.
Here are the permissions that I use:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"organizations:CreateAccount",
"organizations:DescribeCreateAccountStatus",
"organizations:DescribeAccount",
"organizations:ListAccounts",
"organizations:ListAWSServiceAccessForOrganization",
"organizations:EnableAWSServiceAccess",
"organizations:DescribeOrganization",
"organizations:ListChildren",
"organizations:ListRoots"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:AttachRolePolicy",
"iam:PutRolePolicy",
"iam:CreatePolicy",
"iam:ListRoles",
"iam:GetRole"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
}
]
}
```
## Environment Variables
| Variable | Value | Purpose |
| ----------------------------- | ----- | ------------------------------------------------------- |
| ACCOUNTFACTORY_ENABLE_LOGGING | true | Enables logging to disk (~/.local/state/accountfactory) |
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT License - see [LICENSE](LICENSE) file for details