Logo

dev-resources.site

for different kinds of informations.

CICD deployment in conditions of limited access (Go language)

Published at
2/15/2024
Categories
go
cicd
aws
backenddevelopment
Author
Oleg Sydorov
Categories
4 categories in total
go
open
cicd
open
aws
open
backenddevelopment
open
CICD deployment in conditions of limited access (Go language)

In an environment with increased requirements for information security, a situation is possible when the CICD runner does not have access to external resources: the Docker image repository (for example, public.ecr.aws), external dependency packages, etc. In such conditions, I suggest the following actions (examples of the Go language):

Image problem:

We create a Docker image that meets our requirements (let it be minimal, golang 1.21 + AWS CDK based on Alpine):

FROM golang:1.21-alpine

RUN apk update && apk add --update --no-cache \
git \
bash \
nodejs \
npm
RUN npm update -g
# Install AWSCDK
RUN npm install -g
RUN cdk --version
ENTRYPOINT []

Build your image:
docker build --network host -t go-cdk-image .

Let's look at the result, and get the ID of the image:

docker images
REPOSITORY TAG IMAGE
ID CREATED SIZE
go-cdk-image latest f93a28e7b39a 2 hours ago 324MB

Adding a tag:
docker tag f93a28e7b39a 1234567890.dkr.ecr.eu-central-1.amazonaws.com/golang-cdk-image:latest

Add credentials, if not created (File: ./aws/config):

[profile mydevprofile]
sso_start_url = https://my-auth.awsapps.com/start
sso_region = eu-west-1
sso_account_id = 1234567890
sso_role_name = infosec-full
region = eu-central-1
output = json

Login using SSO:
aws sso login --profile mydevprofile

Logging in to the AWS elastic container registry:

aws ecr get-login-password --region eu-central-1 --profile mydevprofile | docker login --username AWS --passwordstdin
1234567890.dkr.ecr.eu-central-1.amazonaws.com

Pushing the image:
docker push 1234567890.dkr.ecr.eu-central-1.amazonaws.com/golang-cdk-image:latest

Thus, at the moment, this Docker image is available within the corporate AWS in conditions of blocked internet. It is possible to use it in the pipeline by adding to .gitlab-ci.yml
image: 989668876111.dkr.ecr.eu-central-1.amazonaws.com/golang-cdk-image:latest

For cross-account use, you need to configure additional access rights to the downloaded image.

Working with dependencies

To work with dependencies, we will use the Golang module vendoring mechanism.
In the CICD config .gitlab-ci.yml we add (in the script section):

script:
 - export GO111MODULE=on

Also, we can add here the GOFLAGS=-mod=vendor option, but we can do this in the code as well.

lambdaFunction := awscdklambdagoalpha.NewGoFunction(stack, jsii.String("BackendLambda"),
        &awscdklambdagoalpha.GoFunctionProps{
            // Fill all the necessary attributes here...
            Bundling: &awscdklambdagoalpha.BundlingOptions{
                GoBuildFlags: jsii.Strings(`-ldflags "-s -w" -mod=vendor`), //see here
            },
        })

In the root folder of the project we should execute:

go mod init my-progect-name
go mod tidy
go mod vendor

The go.mod and go.sum files will be created, as well as the vendor directory with all dependencies. These artifacts should also be included in the git commit.

Nota bene!

It seems that everything is ready, but there is one important point related to the options of the AWS CDK Golang itself. If we look at the code of the cdk.json file, which the CDK created automatically, we see the following code:

{
  "app": "go mod download && go run backend-lambda2.go", // see here!
  "watch": {
    "include": [
      "**"
    ],
    "exclude": [
      "README.md",
      "cdk*.json",
      "go.mod",
      "go.sum",
      "**/*test.go"
    ]
  }
}

The code go mod download && go run backend-lambda2.go destroys the scheme and forces work with the internet.
That is, our last action is to change the code to go run backend-lambda2.go, excluding go mod download.
Now, when performing a git push, our pipeline will work even in conditions of limited access.

Congrats, it works!

Featured ones: