Problem: you’re running a multibuild docker build in your cdk asset publishing step and it needs to pull down artifacts from codeartifact.
Here how I got this working for a gradle build.
codeartifact repository
Make sure your repository has a policy that gives GetRepositoryEndpoint and ReadFromRepository permisions to the codebuild role that is assumed by the asset publishing build step.
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<your account id goes here>:root" }, "Action": [ "codeartifact:List*", "codeartifact:Describe*", "codeartifact:Get*", "codeartifact:Read*" ], "Resource": "*" }] }
Dockerfile
Add a build argument to pass in the codeartifact token
… ARG CODEARTIFACT_TOKEN RUN mkdir -p ~/.gradle RUN echo codeartifactToken=${CODEARTIFACT_TOKEN} > ~/.gradle/gradle.properties …
cdk pipeline stack
Add synthCodeBuildDefaults to give the synth step permission to get a token with the correct permissions to read from the repository.
synthCodeBuildDefaults: { rolePolicy: [ new iam.PolicyStatement({ actions: [ 'codeartifact:GetAuthorizationToken' ], resources: [`${codeartifactDomainArn}`], }), new iam.PolicyStatement({ actions: [ 'codeartifact:GetRepositoryEndpoint', 'codeartifact:ReadFromRepository' ], resources: [`${codeartifactRepositoryArn}`], }), new iam.PolicyStatement({ actions: ['sts:GetServiceBearerToken'], resources: ['*'], conditions: { "StringEquals": { "sts:AWSServiceName": "codeartifact.amazonaws.com" } } }) ], }
cdk application stack
Look up the token and pass as a buildarg
import { execSync } from 'child_process'; const codeartifactToken = execSync( 'aws codeartifact get-authorization-token --domain megabus --domain-owner 669431401787 --query authorizationToken --output text --region us-east-1', { encoding: 'utf8' }, ).trim(); ecs.ContainerImage.fromAsset( pathToDockerfileDir, { buildArgs: { CODEARTIFACT_TOKEN: codeartifactToken } })