ecr-api
This API provides simple restful API access to a service.
Endpoints
GET /v1/ecr/ping
GET /v1/ecr/version
GET /v1/ecr/metrics
GET /v1/ecr/{account}/repositories
POST /v1/ecr/{account}/repositories/{group}
GET /v1/ecr/{account}/repositories/{group}
GET /v1/ecr/{account}/repositories/{group}/{name}
PUT /v1/ecr/{account}/repositories/{group}/{name}
DELETE /v1/ecr/{account}/repositories/{group}/{name}
GET /v1/ecr/{account}/repositories/{group}/{name}/images
GET /v1/ecr/{account}/repositories/{group}/{name}/users
POST /v1/ecr/{account}/repositories/{group}/{name}/users
GET /v1/ecr/{account}/repositories/{group}/{name}/users/{user}
DELETE /v1/ecr/{account}/repositories/{group}/{name}/users/{user}
Authentication
Authentication is accomplished via an encrypted pre-shared key passed via the X-Auth-Token header.
Usage
Repositories
Create a repository
POST /v1/ecr/{account}/repositories/{group}
| Response Code |
Definition |
| 200 OK |
create a repository |
| 400 Bad Request |
badly formed request |
| 404 Not Found |
account not found |
| 500 Internal Server Error |
a server error occurred |
Example create request body
{
"RepositoryName": "myAwesomeRepository",
"ScanOnPush": "true",
"Tags": [
{
"Key": "CreatedBy",
"Value": "cf322"
},
{
"Key": "spinup:spaceid",
"Value": "spincool-00001"
}
]
}
Example create response body
{
"CreatedAt": "2020-12-14T15:34:18Z",
"EncryptionType": "AES256",
"KmsKeyId": "",
"ScanOnPush": "true",
"ImageTagMutability": "MUTABLE",
"RegistryId": "0123456789",
"RepositoryArn": "arn:aws:ecr:us-east-1:0123456789:repository/spindev-00001/myAwesomeRepository",
"RepositoryName": "spindev-00001/camdenstestrepo02",
"RepositoryUri": "0123456789.dkr.ecr.us-east-1.amazonaws.com/spindev-00001/myAwesomeRepository",
"Tags": [
{
"Key": "spinup:spaceid",
"Value": "spindev-00001"
},
{
"Key": "CreatedBy",
"Value": "santa"
},
{
"Key": "spinup:org",
"Value": "spindev"
},
{
"Key": "Name",
"Value": "spindev-00001/myAwesomeRepository"
}
]
}
List Repositories
GET /v1/ecr/{account}/repositories
| Response Code |
Definition |
| 200 OK |
return the list of repositories |
| 400 Bad Request |
badly formed request |
| 404 Not Found |
account not found |
| 500 Internal Server Error |
a server error occurred |
Example list response
[
"spindev-00001/dasher",
"spindev-00001/dancer",
"spindev-00002/prancer",
"spindev-00002/vixen"
"spindev-00003/comet",
"spindev-00003/cupid",
"spindev-00004/donner",
"spindev-00005/blitzen",
"spindev-00006/rudolph",
]
List Repositories by group id
GET /v1/ecr/{account}/repositories/{group}
| Response Code |
Definition |
| 200 OK |
return the list of repositories |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account not found |
| 500 Internal Server Error |
a server error occurred |
Example list by group response
[
"spindev-00006/rudolph"
]
Get details about a Repository
GET /v1/ecr/{account}/repositories/{group}/{id}
| Response Code |
Definition |
| 200 OK |
return details of a repository |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account or repository not found |
| 500 Internal Server Error |
a server error occurred |
Example show response
{
"CreatedAt": "2020-12-14T15:34:18Z",
"EncryptionType": "AES256",
"KmsKeyId": "",
"ScanOnPush": "true",
"ImageTagMutability": "MUTABLE",
"RegistryId": "0123456789",
"RepositoryArn": "arn:aws:ecr:us-east-1:0123456789:repository/spindev-00001/myAwesomeRepository",
"RepositoryName": "spindev-00001/camdenstestrepo02",
"RepositoryUri": "0123456789.dkr.ecr.us-east-1.amazonaws.com/spindev-00001/myAwesomeRepository",
"Tags": [
{
"Key": "spinup:spaceid",
"Value": "spindev-00001"
},
{
"Key": "CreatedBy",
"Value": "santa"
},
{
"Key": "spinup:org",
"Value": "spindev"
},
{
"Key": "Name",
"Value": "spindev-00001/myAwesomeRepository"
}
]
}
Update a repository
PUT /1/ecr/{account}/repositories/{group}/{id}
Example update request body
{
"ScanOnPush": "false",
"Tags": [
{
"Key": "Application",
"Value": "MyAwesomeCloudApp"
}
]
}
Example update response body
{
"CreatedAt": "2020-12-14T15:34:18Z",
"EncryptionType": "AES256",
"KmsKeyId": "",
"ScanOnPush": "false",
"ImageTagMutability": "MUTABLE",
"RegistryId": "0123456789",
"RepositoryArn": "arn:aws:ecr:us-east-1:0123456789:repository/spindev-00001/myAwesomeRepository",
"RepositoryName": "spindev-00001/camdenstestrepo02",
"RepositoryUri": "0123456789.dkr.ecr.us-east-1.amazonaws.com/spindev-00001/myAwesomeRepository",
"Tags": [
{
"Key": "spinup:spaceid",
"Value": "spindev-00001"
},
{
"Key": "CreatedBy",
"Value": "santa"
},
{
"Key": "spinup:org",
"Value": "spindev"
},
{
"Key": "Name",
"Value": "spindev-00001/myAwesomeRepository"
},
{
"Key": "Application",
"Value": "MyAwesomeCloudApp"
}
]
}
Delete a repository and all images
NOTE: deleting a repository does not currently cleanup users, this must be done first.
DELETE /v1/ecr/{account}/repositories/{group}/{id}
| Response Code |
Definition |
| 200 Submitted |
delete request is submitted |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account or repository not found |
| 409 Conflict |
repository is not in the available state |
| 500 Internal Server Error |
a server error occurred |
Images
List images in a repository
GET /v1/ecr/{account}/repositories/{group}/{id}/images
| Response Code |
Definition |
| 200 OK |
return list of images |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account or repository not found |
| 500 Internal Server Error |
a server error occurred |
Example response body
[
{
"ArtifactMediaType": "application/vnd.docker.container.image.v1+json",
"ImageDigest": "sha256:ac81321d3627bcde149b383220b16dabc590f2d247f4c72c64cb14f58e7fb9c2",
"ImageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
"ImagePushedAt": "2020-12-14T15:56:11Z",
"ImageScanFindingsSummary": {
"FindingSeverityCounts": {},
"ImageScanCompletedAt": "2020-12-14T16:02:36Z",
"VulnerabilitySourceUpdatedAt": "2020-11-04T01:21:09Z"
},
"ImageScanStatus": {
"Description": "The scan was completed successfully.",
"Status": "COMPLETE"
},
"ImageSizeInBytes": 16093514,
"ImageTags": [
"latest"
],
"RegistryId": "0123456789",
"RepositoryName": "spindev-00001/myAwesomeRepository"
}
]
Users
Repository users are created in the same account as the repository. An account is "bootstrapped" by
the create action if its not already prepared to contain repository users. This bootstrapping creates
a shared role and group for admin users. The role grants a user access to a repository based on the tags
spinup:org, spinup:spaceid and ResourceName (the repository name).
List all users for a repository
GET /v1/ecr/{account}/repositories/{group}/{name}/users
| Response Code |
Definition |
| 200 OK |
return the list of users |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account not found |
| 500 Internal Server Error |
a server error occurred |
Example list users response
[
"user1"
]
Create a user
POST /v1/ecr/{account}/repositories/{group}/{name}/users
| Response Code |
Definition |
| 200 OK |
create a repository |
| 400 Bad Request |
badly formed request |
| 404 Not Found |
account not found |
| 500 Internal Server Error |
a server error occurred |
Example create user request body
{
"username": "user1",
"tags": [
{
"key": "application",
"value": "myapp"
}
],
"groups": [
"SpinupECRAdminGroup"
]
}
Example create user response body
{
"UserName": "user1",
"AccessKeys": [],
"Groups": [
"SpinupECRAdminGroup"
],
"Tags": [
{
"Key": "application",
"Value": "myapp"
},
{
"Key": "ResourceName",
"Value": "spindev-00001-myAwesomeRepository-user1"
},
{
"Key": "ResourceName",
"Value": "spindev-00001/myAwesomeRepository"
},
{
"Key": "spinup:org",
"Value": "spindev"
},
{
"Key": "spinup:spaceid",
"Value": "spindev-00001"
}
]
}
Get details about a user
GET /v1/ecr/{account}/repositories/{group}/{name}/users/{user}
| Response Code |
Definition |
| 200 OK |
return details of a user |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account or user not found |
| 500 Internal Server Error |
a server error occurred |
Example show user response
{
"UserName": "user1",
"AccessKeys": [],
"Groups": [
"SpinupECRAdminGroup"
],
"Tags": [
{
"Key": "application",
"Value": "myapps"
},
{
"Key": "Name",
"Value": "spincool-00002/camdenstestrepo01"
},
{
"Key": "spinup:org",
"Value": "spincool"
},
{
"Key": "spinup:spaceid",
"Value": "spincool-00002"
}
]
}
Delete a user
DELETE /v1/ecr/{account}/repositories/{group}/{name}/users/{user}
| Response Code |
Definition |
| 200 Submitted |
delete request is submitted |
| 400 Bad Request |
badly formed request |
| 403 Forbidden |
bad token or fail to assume role |
| 404 Not Found |
account or user not found |
| 409 Conflict |
user is not in the available state |
| 500 Internal Server Error |
a server error occurred |
License
GNU Affero General Public License v3.0 (GNU AGPLv3)
Copyright © 2020 Yale University