1+ # Rename Layer
2+ # ---
3+ # This workflow copies a specific layer version in an AWS account, renaming it in the process
4+ #
5+ # Using a matrix, we pull each architecture and python version of the layer and store them as artifacts
6+ # we upload them to each of the AWS accounts.
7+ #
8+ # A number of safety checks are performed to ensure safety.
9+
10+ on :
11+ workflow_dispatch :
12+ inputs :
13+ environment :
14+ description : Deployment environment
15+ type : choice
16+ options :
17+ - beta
18+ - prod
19+ default : Gamma
20+ required : true
21+ version :
22+ description : Layer version to duplicate
23+ type : number
24+ required : true
25+ workflow_call :
26+ inputs :
27+ environment :
28+ description : Deployment environment
29+ type : string
30+ default : Gamma
31+ required : true
32+ version :
33+ description : Layer version to duplicate
34+ type : number
35+ required : true
36+
37+ name : Layer Rename
38+ run-name : Layer Rename - ${{ inputs.environment }}
39+
40+ jobs :
41+ download :
42+ runs-on : ubuntu-latest
43+ permissions :
44+ id-token : write
45+ contents : read
46+ strategy :
47+ matrix :
48+ layer :
49+ - AWSLambdaPowertoolsPythonV3-python38
50+ - AWSLambdaPowertoolsPythonV3-python39
51+ - AWSLambdaPowertoolsPythonV3-python310
52+ - AWSLambdaPowertoolsPythonV3-python311
53+ - AWSLambdaPowertoolsPythonV3-python312
54+ environment : layer-prod
55+ steps :
56+ - name : Configure AWS Credentials
57+ uses : aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
58+ with :
59+ role-to-assume : ${{ secrets.AWS_LAYERS_ROLE_ARN }}
60+ aws-region : us-east-1
61+ mask-aws-account-id : true
62+ - name : Grab Zip
63+ run : |
64+ aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-x86:${{ inputs.version }} --query 'Content.Location' | xargs curl -L -o ${{ matrix.layer }}_x86_64.zip
65+ aws --region us-east-1 lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:017000801446:layer:${{ matrix.layer }}-x86:${{ inputs.version }} > ${{ matrix.layer }}_x86_64.json
66+ - name : Store Zip
67+ uses : actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
68+ with :
69+ name : ${{ matrix.layer }}_x86_64.zip
70+ path : ${{ matrix.layer }}_x86_64.zip
71+ retention-days : 1
72+ if-no-files-found : error
73+ - name : Store Metadata
74+ uses : actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
75+ with :
76+ name : ${{ matrix.layer }}_x86_64.json
77+ path : ${{ matrix.layer }}_x86_64.json
78+ retention-days : 1
79+ if-no-files-found : error
80+
81+ copy :
82+ name : Copy
83+ needs : download
84+ runs-on : ubuntu-latest
85+ permissions :
86+ id-token : write
87+ contents : read
88+ strategy :
89+ matrix :
90+ layer :
91+ - AWSLambdaPowertoolsPythonV3-python38
92+ - AWSLambdaPowertoolsPythonV3-python39
93+ - AWSLambdaPowertoolsPythonV3-python310
94+ - AWSLambdaPowertoolsPythonV3-python311
95+ - AWSLambdaPowertoolsPythonV3-python312
96+ region :
97+ - " af-south-1"
98+ - " ap-east-1"
99+ - " ap-northeast-1"
100+ - " ap-northeast-2"
101+ - " ap-northeast-3"
102+ - " ap-south-1"
103+ - " ap-south-2"
104+ - " ap-southeast-1"
105+ - " ap-southeast-2"
106+ - " ap-southeast-3"
107+ - " ap-southeast-4"
108+ - " ca-central-1"
109+ - " ca-west-1"
110+ - " eu-central-1"
111+ - " eu-central-2"
112+ - " eu-north-1"
113+ - " eu-south-1"
114+ - " eu-south-2"
115+ - " eu-west-1"
116+ - " eu-west-2"
117+ - " eu-west-3"
118+ - " il-central-1"
119+ - " me-central-1"
120+ - " me-south-1"
121+ - " sa-east-1"
122+ - " us-east-1"
123+ - " us-east-2"
124+ - " us-west-1"
125+ - " us-west-2"
126+ environment : layer-${{ inputs.environment }}
127+ steps :
128+ - name : Download Zip
129+ uses : actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
130+ with :
131+ name : ${{ matrix.layer }}_x86_64.zip
132+ - name : Download Metadata
133+ uses : actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
134+ with :
135+ name : ${{ matrix.layer }}_x86_64.json
136+ - name : Verify Layer Signature
137+ run : |
138+ SHA=$(jq -r '.Content.CodeSha256' ${{ matrix.layer }}_x86_64.json)
139+ test $(openssl dgst -sha256 -binary ${{ matrix.layer }}_x86_64.zip | openssl enc -base64) == $SHA && echo "SHA OK: ${SHA}" || exit 1
140+ - name : Configure AWS Credentials
141+ uses : aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
142+ with :
143+ role-to-assume : ${{ secrets.AWS_LAYERS_ROLE_ARN }}
144+ aws-region : ${{ matrix.region }}
145+ mask-aws-account-id : true
146+ - name : Create Layer
147+ run : |
148+ aws --region ${{ matrix.region }} lambda publish-layer-version \
149+ --layer-name ${{ matrix.layer }}-x86_64 \
150+ --zip-file fileb://./${{ matrix.layer }}_x86_64.zip \
151+ --compatible-runtimes $(jq -r ".CompatibleRuntimes[0]" ${{ matrix.layer }}_x86_64.json) \
152+ --compatible-architectures $(jq -r ".CompatibleArchitectures[0]" ${{ matrix.layer }}_x86_64.json) \
153+ --license-info "MIT-0" \
154+ --description "$(jq -r \".Description\" ${{ matrix.layer }}_x86_64.json)" \
155+ --query 'Version' | \
156+ xargs aws --region ${{ matrix.region }} lambda add-layer-version-permission \
157+ --layer-name ${{ matrix.layer }}-x86_64 \
158+ --statement-id 'PublicLayer' \
159+ --action lambda:GetLayerVersion \
160+ --principal '*' \
161+ --version-number
0 commit comments