Skip to content

Commit 272126c

Browse files
committed
[ELI-702] - changing workflow to sign and upload first before deployment
1 parent 3b31922 commit 272126c

2 files changed

Lines changed: 129 additions & 14 deletions

File tree

.github/workflows/cicd-3-test-deploy.yaml

Lines changed: 125 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,17 @@ jobs:
4646
echo "name=$TAG" >> $GITHUB_OUTPUT
4747
echo "Resolved tag: $TAG"
4848
49-
deploy:
50-
name: "Deploy to TEST (approval required)"
49+
sign-lambda-artifact:
50+
name: "Sign lambda artifact for TEST"
5151
runs-on: ubuntu-latest
5252
needs: [metadata]
5353
environment: test
54-
timeout-minutes: 10080
54+
timeout-minutes: 45
5555
permissions:
5656
id-token: write
5757
contents: read
58+
outputs:
59+
bucket_name: ${{ steps.tf_output.outputs.bucket_name }}
5860
steps:
5961
- name: "Checkout same commit"
6062
uses: actions/checkout@v6
@@ -80,6 +82,124 @@ jobs:
8082
run-id: ${{ github.event.workflow_run.id }}
8183
github-token: ${{ github.token }}
8284

85+
- name: "Terraform Init (TEST api-layer)"
86+
env:
87+
ENVIRONMENT: test
88+
WORKSPACE: "default"
89+
run: |
90+
echo "Running: make terraform env=$ENVIRONMENT workspace=$WORKSPACE stack=api-layer tf-command=init"
91+
make terraform env=$ENVIRONMENT stack=api-layer tf-command=init workspace=$WORKSPACE
92+
working-directory: ./infrastructure
93+
94+
- name: "Extract S3 bucket name from Terraform output"
95+
id: tf_output
96+
run: |
97+
BUCKET=$(terraform output -raw lambda_artifact_bucket)
98+
PROFILE=$(terraform output -raw lambda_signing_profile_name)
99+
echo "bucket_name=$BUCKET" >> $GITHUB_OUTPUT
100+
echo "signing_profile_name=$PROFILE" >> $GITHUB_OUTPUT
101+
working-directory: ./infrastructure/stacks/api-layer
102+
103+
- name: "Upload unsigned lambda artifact to S3"
104+
run: |
105+
aws s3 cp ./dist/lambda.zip \
106+
s3://${{ steps.tf_output.outputs.bucket_name }}/unsigned/${{ needs.metadata.outputs.tag }}/lambda.zip \
107+
--region eu-west-2
108+
109+
- name: "Get uploaded source object version"
110+
id: source_object
111+
run: |
112+
VERSION_ID=$(aws s3api head-object \
113+
--bucket "${{ steps.tf_output.outputs.bucket_name }}" \
114+
--key "unsigned/${{ needs.metadata.outputs.tag }}/lambda.zip" \
115+
--query 'VersionId' \
116+
--output text \
117+
--region eu-west-2)
118+
echo "version_id=$VERSION_ID" >> $GITHUB_OUTPUT
119+
120+
- name: "Start signing job"
121+
id: signing
122+
env:
123+
SIGNING_PROFILE_NAME: ${{ steps.tf_output.outputs.signing_profile_name }}
124+
run: |
125+
JOB_ID=$(aws signer start-signing-job \
126+
--source "s3={bucketName=${{ steps.tf_output.outputs.bucket_name }},key=unsigned/${{ needs.metadata.outputs.tag }}/lambda.zip,version=${{ steps.source_object.outputs.version_id }}}" \
127+
--destination "s3={bucketName=${{ steps.tf_output.outputs.bucket_name }},prefix=signed/${{ needs.metadata.outputs.tag }}/}" \
128+
--profile-name "$SIGNING_PROFILE_NAME" \
129+
--query 'jobId' \
130+
--output text \
131+
--region eu-west-2)
132+
echo "job_id=$JOB_ID" >> $GITHUB_OUTPUT
133+
134+
- name: "Wait for signing job"
135+
run: |
136+
aws signer wait successful-signing-job \
137+
--job-id "${{ steps.signing.outputs.job_id }}" \
138+
--region eu-west-2
139+
140+
- name: "Resolve signed artifact location"
141+
id: signed_object
142+
run: |
143+
SIGNED_BUCKET=$(aws signer describe-signing-job \
144+
--job-id "${{ steps.signing.outputs.job_id }}" \
145+
--region eu-west-2 \
146+
--query 'signedObject.s3.bucketName' \
147+
--output text)
148+
149+
SIGNED_KEY=$(aws signer describe-signing-job \
150+
--job-id "${{ steps.signing.outputs.job_id }}" \
151+
--region eu-west-2 \
152+
--query 'signedObject.s3.key' \
153+
--output text)
154+
155+
echo "bucket_name=$SIGNED_BUCKET" >> $GITHUB_OUTPUT
156+
echo "object_key=$SIGNED_KEY" >> $GITHUB_OUTPUT
157+
158+
- name: "Download signed lambda artifact"
159+
run: |
160+
aws s3 cp \
161+
"s3://${{ steps.signed_object.outputs.bucket_name }}/${{ steps.signed_object.outputs.object_key }}" \
162+
./dist/lambda.zip \
163+
--region eu-west-2
164+
165+
- name: "Upload signed lambda artifact for current workflow"
166+
uses: actions/upload-artifact@v6
167+
with:
168+
name: lambda-${{ needs.metadata.outputs.tag }}
169+
path: ./dist/lambda.zip
170+
171+
deploy:
172+
name: "Deploy to TEST (approval required)"
173+
runs-on: ubuntu-latest
174+
needs: [metadata, sign-lambda-artifact]
175+
environment: test
176+
timeout-minutes: 10080
177+
permissions:
178+
id-token: write
179+
contents: read
180+
steps:
181+
- name: "Checkout same commit"
182+
uses: actions/checkout@v6
183+
with:
184+
ref: ${{ github.event.workflow_run.head_sha }}
185+
186+
- name: "Setup Terraform"
187+
uses: hashicorp/setup-terraform@v3
188+
with:
189+
terraform_version: ${{ needs.metadata.outputs.terraform_version }}
190+
191+
- name: "Download signed lambda artefact"
192+
uses: actions/download-artifact@v7
193+
with:
194+
name: lambda-${{ needs.metadata.outputs.tag }}
195+
path: ./dist
196+
197+
- name: "Configure AWS Credentials"
198+
uses: aws-actions/configure-aws-credentials@v6
199+
with:
200+
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/service-roles/github-actions-api-deployment-role
201+
aws-region: eu-west-2
202+
83203
- name: "Terraform Apply (TEST)"
84204
env:
85205
ENVIRONMENT: test
@@ -92,7 +212,6 @@ jobs:
92212
TF_VAR_OPERATOR_EMAILS: ${{ vars.SECRET_ROTATION_OPERATOR_EMAILS }}
93213
TF_VAR_PROXYGEN_PRIVATE_KEY_PTL: ${{ secrets.PROXYGEN_PRIVATE_KEY_PTL }}
94214
TF_VAR_PROXYGEN_PRIVATE_KEY_PROD: ${{ secrets.PROXYGEN_PRIVATE_KEY_PROD }}
95-
96215
run: |
97216
mkdir -p ./build
98217
echo "Deploying tag: ${{ needs.metadata.outputs.tag }}"
@@ -109,17 +228,10 @@ jobs:
109228
pip install boto3
110229
python scripts/feature_toggle/validate_toggles.py
111230
112-
- name: "Extract S3 bucket name from Terraform output"
113-
id: tf_output
114-
run: |
115-
BUCKET=$(terraform output -raw lambda_artifact_bucket)
116-
echo "bucket_name=$BUCKET" >> $GITHUB_OUTPUT
117-
working-directory: ./infrastructure/stacks/api-layer
118-
119-
- name: "Upload lambda artifact to S3"
231+
- name: "Upload signed lambda artifact to S3"
120232
run: |
121233
aws s3 cp ./dist/lambda.zip \
122-
s3://${{ steps.tf_output.outputs.bucket_name }}/artifacts/${{ needs.metadata.outputs.tag }}/lambda.zip \
234+
s3://${{ needs.sign-lambda-artifact.outputs.bucket_name }}/artifacts/${{ needs.metadata.outputs.tag }}/lambda.zip \
123235
--region eu-west-2
124236
125237
regression-tests:
@@ -130,4 +242,3 @@ jobs:
130242
ENVIRONMENT: "test"
131243
VERSION_NUMBER: "main"
132244
secrets: inherit
133-

infrastructure/modules/lambda/signing.tf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@ resource "aws_lambda_code_signing_config" "signing_config" {
2222

2323
description = "Only allow Lambda bundles signed by our trusted signer profile"
2424
}
25+
26+
output "lambda_signing_profile_name" {
27+
value = aws_signer_signing_profile.lambda_signing.name
28+
}

0 commit comments

Comments
 (0)