Skip to content

Commit 73a1cca

Browse files
authored
Add script to check AWS regions missing lambda layers (#96)
* Script to add layers to new region * Script to check regions missing layers * Call check regions after publishing to prod * Bugfixes + get regions from aws * Logic to make script idempotent * Show regions missing layers * Run list layers before publishing to prod * Fix condition logic * Get regions from AWS * Set default batch size to 1 * Return 0 if no version found for region
1 parent b2de689 commit 73a1cca

File tree

4 files changed

+106
-17
lines changed

4 files changed

+106
-17
lines changed

scripts/add_new_region.sh

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#!/bin/bash
2+
3+
OLD_REGION='us-east-1'
4+
5+
LAYER_NAMES=("Datadog-Node10-x" "Datadog-Node12-x")
6+
NODE_VERSIONS_FOR_AWS_CLI=("nodejs10.x" "nodejs12.x")
7+
NEW_REGION=$1
8+
9+
publish_layer() {
10+
region=$1
11+
layer_name=$2
12+
aws_version_key=$3
13+
layer_path=$4
14+
15+
version_nbr=$(aws lambda publish-layer-version --layer-name $layer_name \
16+
--description "Datadog Lambda Layer for Node" \
17+
--zip-file "fileb://$layer_path" \
18+
--region $region \
19+
--compatible-runtimes $aws_version_key \
20+
| jq -r '.Version')
21+
22+
aws lambda add-layer-version-permission --layer-name $layer_name \
23+
--version-number $version_nbr \
24+
--statement-id "release-$version_nbr" \
25+
--action lambda:GetLayerVersion --principal "*" \
26+
--region $region
27+
28+
echo "Published layer for region $region, version $aws_version_key, layer_name $layer_name, layer_version $version_nbr"
29+
}
30+
31+
get_max_version() {
32+
layer_name=$1
33+
region=$2
34+
last_layer_version=$(aws lambda list-layer-versions --layer-name $layer_name --region $region | jq -r ".LayerVersions | .[0] | .Version")
35+
if [ "$last_layer_version" == "null" ]; then
36+
echo 0
37+
else
38+
echo $last_layer_version
39+
fi
40+
}
41+
42+
if [ -z "$1" ]; then
43+
echo "Region parameter not specified, exiting"
44+
exit 1
45+
fi
46+
47+
j=0
48+
for layer_name in "${LAYER_NAMES[@]}"; do
49+
# get latest version
50+
last_layer_version=$(get_max_version $layer_name $OLD_REGION)
51+
starting_version=$(get_max_version $layer_name $NEW_REGION)
52+
starting_version=$(expr $starting_version + 1)
53+
54+
# exit if region is already all caught up
55+
if [ $starting_version -gt $last_layer_version ]; then
56+
echo "INFO: $NEW_REGION is already up to date for $layer_name"
57+
continue
58+
fi
59+
60+
# run for each version of layer
61+
for i in $(seq 1 $last_layer_version); do
62+
layer_path=$layer_name"_"$i.zip
63+
aws_version_key="${NODE_VERSIONS_FOR_AWS_CLI[$j]}"
64+
65+
# download layer versions
66+
URL=$(AWS_REGION=$OLD_REGION aws lambda get-layer-version --layer-name $layer_name --version-number $i --query Content.Location --output text)
67+
curl $URL -o $layer_path
68+
69+
# publish layer to new region
70+
publish_layer $NEW_REGION $layer_name $aws_version_key $layer_path
71+
rm $layer_path
72+
done
73+
74+
j=$(expr $j + 1)
75+
done

scripts/list_layers.sh

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,21 @@
1111
set -e
1212

1313
LAYER_NAMES=("Datadog-Node10-x" "Datadog-Node12-x")
14-
AVAILABLE_REGIONS=(us-east-2 us-east-1 us-west-1 us-west-2 ap-east-1 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-north-1 eu-central-1 eu-west-1 eu-west-2 eu-west-3 sa-east-1)
14+
AVAILABLE_REGIONS=$(aws ec2 describe-regions | jq -r '.[] | .[] | .RegionName')
15+
LAYERS_MISSING_REGIONS=()
1516

1617
# Check region arg
1718
if [ -z "$2" ]; then
1819
>&2 echo "Region parameter not specified, running for all available regions."
19-
REGIONS=("${AVAILABLE_REGIONS[@]}")
20+
REGIONS=$AVAILABLE_REGIONS
2021
else
22+
2123
>&2 echo "Region parameter specified: $2"
22-
if [[ ! " ${AVAILABLE_REGIONS[@]} " =~ " ${2} " ]]; then
23-
>&2 echo "Could not find $2 in available regions: ${AVAILABLE_REGIONS[@]}"
24+
if [[ ! "$AVAILABLE_REGIONS" == *"$2"* ]]; then
25+
>&2 echo "Could not find $2 in available regions:" $AVAILABLE_REGIONS
2426
>&2 echo ""
2527
>&2 echo "EXITING SCRIPT."
26-
return 1
28+
exit 1
2729
fi
2830
REGIONS=($2)
2931
fi
@@ -43,15 +45,24 @@ else
4345
LAYERS=($1)
4446
fi
4547

46-
for region in "${REGIONS[@]}"
48+
for region in $REGIONS
4749
do
4850
for layer_name in "${LAYERS[@]}"
4951
do
5052
last_layer_arn=$(aws lambda list-layer-versions --layer-name $layer_name --region $region | jq -r ".LayerVersions | .[0] | .LayerVersionArn")
51-
if [ -z $last_layer_arn ]; then
52-
>&2 echo "No layer found for $region, $layer_name"
53+
if [ "$last_layer_arn" == "null" ]; then
54+
>&2 echo "No layer found for $region, $layer_name"
55+
if [[ ! " ${LAYERS_MISSING_REGIONS[@]} " =~ " ${region} " ]]; then
56+
LAYERS_MISSING_REGIONS+=( $region )
57+
fi
5358
else
5459
echo $last_layer_arn
5560
fi
5661
done
57-
done
62+
done
63+
64+
if [ ${#LAYERS_MISSING_REGIONS[@]} -gt 0 ]; then
65+
echo "WARNING: Following regions missing layers: ${LAYERS_MISSING_REGIONS[@]}"
66+
echo "Please run ./add_new_region.sh <new_region> to add layers to the missing regions"
67+
exit 1
68+
fi

scripts/publish_layers.sh

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ trap "pkill -P $$; exit 1;" INT
1616
NODE_VERSIONS_FOR_AWS_CLI=("nodejs10.x" "nodejs12.x")
1717
LAYER_PATHS=(".layers/datadog_lambda_node10.15.zip" ".layers/datadog_lambda_node12.13.zip")
1818
LAYER_NAMES=("Datadog-Node10-x" "Datadog-Node12-x")
19-
AVAILABLE_REGIONS=(us-east-2 us-east-1 us-west-1 us-west-2 ap-east-1 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-north-1 eu-central-1 eu-west-1 eu-west-2 eu-west-3 sa-east-1)
19+
AVAILABLE_REGIONS=$(aws ec2 describe-regions | jq -r '.[] | .[] | .RegionName')
2020

2121
# Check that the layer files exist
2222
for layer_file in "${LAYER_PATHS[@]}"
@@ -30,19 +30,19 @@ done
3030
# Check region arg
3131
if [ -z "$1" ]; then
3232
echo "Region parameter not specified, running for all available regions."
33-
REGIONS=("${AVAILABLE_REGIONS[@]}")
33+
REGIONS=$AVAILABLE_REGIONS
3434
else
3535
echo "Region parameter specified: $1"
36-
if [[ ! " ${AVAILABLE_REGIONS[@]} " =~ " ${1} " ]]; then
37-
echo "Could not find $1 in available regions: ${AVAILABLE_REGIONS[@]}"
36+
if [[ ! "$AVAILABLE_REGIONS" == *"$1"* ]]; then
37+
echo "Could not find $1 in available regions: $AVAILABLE_REGIONS"
3838
echo ""
3939
echo "EXITING SCRIPT."
4040
exit 1
4141
fi
4242
REGIONS=($1)
4343
fi
4444

45-
echo "Starting publishing layers for regions: ${REGIONS[*]}"
45+
echo "Starting publishing layers for regions: $REGIONS"
4646

4747
publish_layer() {
4848
region=$1
@@ -66,7 +66,7 @@ publish_layer() {
6666
echo "Published layer for region $region, node version $aws_version_key, layer_name $layer_name, layer_version $version_nbr"
6767
}
6868

69-
BATCH_SIZE=60
69+
BATCH_SIZE=1
7070
PIDS=()
7171

7272
wait_for_processes() {
@@ -76,7 +76,7 @@ wait_for_processes() {
7676
PIDS=()
7777
}
7878

79-
for region in "${REGIONS[@]}"
79+
for region in $REGIONS
8080
do
8181
echo "Starting publishing layer for region $region..."
8282

scripts/publish_prod.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ if [ -z "$AWS_SESSION_TOKEN" ]; then
2222
exit 1
2323
fi
2424

25+
echo 'Checking Regions'
26+
./scripts/list_layers.sh
27+
2528
yarn login
2629

2730
PACKAGE_VERSION=$(node -pe "require('./package.json').version")
@@ -36,4 +39,4 @@ git push origin "refs/tags/v$PACKAGE_VERSION"
3639

3740
echo 'Publishing Lambda Layer'
3841
./scripts/build_layers.sh
39-
./scripts/publish_layers.sh
42+
./scripts/publish_layers.sh

0 commit comments

Comments
 (0)