I’ve created a CI/CD implementation of building my Angular 4 applications on AWS S3. Here’s one of my YAML configuration:
version: 0.2
env:
variables:
S3_BUCKET: "s3-bucket-name"
BUILD_ENV: "prod"
CLOUDFRONT_ID: "EXX11223344"
phases:
install:
commands:
- echo Installing source NPM dependencies...
# Need https driver.
- sudo apt-get update -y
- sudo apt-get install -y apt-transport-https
# Install Yarn.
- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
- echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
- sudo apt-get update -y
- sudo apt-get install -y yarn
# Install Angular CLI
- yarn global add @angular/cli@1.4.2
# Install node dependancies.
- yarn
build:
commands:
# Builds Angular application.
- echo Build started on `date`
- ng build --${BUILD_ENV}
post_build:
commands:
# Clear S3 bucket.
- aws s3 rm s3://${S3_BUCKET} --recursive
- echo S3 bucket is cleared.
# Copy dist folder to S3 bucket
- aws s3 cp dist s3://${S3_BUCKET} --recursive
# STEP: Clear CloudFront cache.
- aws configure set preview.cloudfront true
- aws cloudfront create-invalidation --distribution-id ${CLOUDFRONT_ID} --paths "/*"
- echo Build completed on `date`
artifacts:
files:
- '**/*'
discard-paths: yes
base-directory: 'dist*'
Problem
I’m getting build errors at the “post_build” phase: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
So this appears to be a permission issue which was not taken care of at the AWS policy level. My old AWS policy for this CodeBuild project:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1506491253000",
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": [
"*"
]
},
{
"Sid": "Stmt1506491270000",
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:ListBucket",
"s3:ListObjects",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::s3-bucket-name"
]
}
]
}
After several troubleshooting steps, and a run to Jack in The Box, I believe I was missing adding additional resources.
Solution
Thinking about the error more and more that I realized I also needed to add the additional resource entry for all files/folders (not just the bucket). Here’s the solution on the AWS Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1506491253000",
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": [
"*"
]
},
{
"Sid": "Stmt1506491270000",
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:ListBucket",
"s3:ListObjects",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::s3-bucket-name",
"arn:aws:s3:::s3-bucket-name/*"
]
}
]
}
All I did was add the “/*” equivalent to tell AWS that I also want the contents to have those permissions.
