diff --git a/.github/workflows/layers_dispatch.yaml b/.github/workflows/layers_dispatch.yaml index d4212de..f485243 100644 --- a/.github/workflows/layers_dispatch.yaml +++ b/.github/workflows/layers_dispatch.yaml @@ -34,65 +34,90 @@ jobs: id: latest_release run: | JSON_RESPONSE=$(curl -s https://api.github.com/repos/Sparticuz/chromium/releases/latest) - LATEST_RELEASE_URL=$(echo $JSON_RESPONSE | grep -Po '"browser_download_url": "\K[^"]+' | awk 'NR==1') TAG_VERSION=$(echo $JSON_RESPONSE | grep -Po '"tag_name": "\K[^"]+') if [[ "$TAG_VERSION" == "${{ steps.prev_tag_version.outputs.tag }}" ]]; then echo "Skipping as the tag version is the same as the previous run." - exit 78 + echo "skip=true" >> $GITHUB_OUTPUT + exit 0 fi - echo "LATEST_RELEASE_URL=$LATEST_RELEASE_URL" >> $GITHUB_ENV + echo "skip=false" >> $GITHUB_OUTPUT echo "TAG_VERSION=$TAG_VERSION" >> $GITHUB_ENV - echo "FILENAME=chromium-$TAG_VERSION.zip" >> $GITHUB_ENV + echo "X64_URL=https://github.com/Sparticuz/chromium/releases/download/$TAG_VERSION/chromium-$TAG_VERSION-layer.x64.zip" >> $GITHUB_ENV + echo "ARM64_URL=https://github.com/Sparticuz/chromium/releases/download/$TAG_VERSION/chromium-$TAG_VERSION-layer.arm64.zip" >> $GITHUB_ENV + echo "X64_FILENAME=chromium-$TAG_VERSION-layer.x64.zip" >> $GITHUB_ENV + echo "ARM64_FILENAME=chromium-$TAG_VERSION-layer.arm64.zip" >> $GITHUB_ENV - name: Update Tag Version + if: steps.latest_release.outputs.skip == 'false' run: echo ${{ env.TAG_VERSION }} > .tag_version - name: Download Latest Release + if: steps.latest_release.outputs.skip == 'false' run: | - curl -LO ${{ env.LATEST_RELEASE_URL }} - FILEPATH=$(basename ${{ env.LATEST_RELEASE_URL }}) - echo "FILEPATH=$FILEPATH" >> $GITHUB_ENV + curl -LO ${{ env.X64_URL }} + curl -LO ${{ env.ARM64_URL }} - name: Upload to S3 + if: steps.latest_release.outputs.skip == 'false' run: | for REGION in ${{ env.AWS_REGIONS }}; do BUCKET_NAME="${{ env.S3_BUCKET_NAME }}-$REGION" aws configure set region $REGION - aws s3 cp ${{ env.FILEPATH }} s3://$BUCKET_NAME/${{ env.FILENAME }} & + aws s3 cp ${{ env.X64_FILENAME }} s3://$BUCKET_NAME/${{ env.X64_FILENAME }} & + aws s3 cp ${{ env.ARM64_FILENAME }} s3://$BUCKET_NAME/${{ env.ARM64_FILENAME }} & done wait - name: Publish to AWS Regions with Permissions + if: steps.latest_release.outputs.skip == 'false' run: | for REGION in ${{ env.AWS_REGIONS }}; do BUCKET_NAME="${{ env.S3_BUCKET_NAME }}-$REGION" - aws configure set region $REGION { - NEW_VERSION_NUMBER=$(aws lambda publish-layer-version \ - --layer-name chrome-aws-lambda \ - --content S3Bucket=$BUCKET_NAME,S3Key=${{ env.FILENAME }} \ + X64_VERSION=$(aws lambda publish-layer-version \ + --layer-name chrome-aws-lambda-x64 \ + --content S3Bucket=$BUCKET_NAME,S3Key=${{ env.X64_FILENAME }} \ + --region $REGION \ + --compatible-architectures x86_64 \ + --description "@sparticuz/chromium v${{ env.TAG_VERSION }} x64" \ + --query Version \ + --output text) + + aws lambda add-layer-version-permission \ + --region "$REGION" \ + --layer-name chrome-aws-lambda-x64 \ + --statement-id sid1 \ + --action lambda:GetLayerVersion \ + --principal '*' \ + --version-number $X64_VERSION + + ARM64_VERSION=$(aws lambda publish-layer-version \ + --layer-name chrome-aws-lambda-arm64 \ + --content S3Bucket=$BUCKET_NAME,S3Key=${{ env.ARM64_FILENAME }} \ --region $REGION \ - --compatible-architecture x86_64 \ - --description "@sparticuz/chromium v${{ env.TAG_VERSION }} & Chromium v${{ env.TAG_VERSION }}" \ + --compatible-architectures arm64 \ + --description "@sparticuz/chromium v${{ env.TAG_VERSION }} arm64" \ --query Version \ --output text) aws lambda add-layer-version-permission \ --region "$REGION" \ - --layer-name chrome-aws-lambda \ + --layer-name chrome-aws-lambda-arm64 \ --statement-id sid1 \ --action lambda:GetLayerVersion \ --principal '*' \ - --version-number $NEW_VERSION_NUMBER - echo "Published and permissions added for ${{ env.FILENAME }} in $REGION" + --version-number $ARM64_VERSION + + echo "Published x64:$X64_VERSION and arm64:$ARM64_VERSION for $REGION" } & done wait - name: Commit Tag Version + if: steps.latest_release.outputs.skip == 'false' run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" diff --git a/.github/workflows/update_readme.yaml b/.github/workflows/update_readme.yaml index ff79b55..2e69c04 100644 --- a/.github/workflows/update_readme.yaml +++ b/.github/workflows/update_readme.yaml @@ -37,20 +37,30 @@ jobs: run: | TAG_VERSION=${{ env.TAG_VERSION }} ARN_BASE="arn:aws:lambda:" - ARN_SUFFIX=":764866452798:layer:chrome-aws-lambda:" + ACCOUNT_ID="764866452798" sed -i -e "s|Has Chromium v[0-9\.]*|Has Chromium $TAG_VERSION|g" readme.md for REGION in ${{ env.AWS_REGIONS }}; do - LAYER_VERSION=$(aws lambda list-layer-versions --layer-name chrome-aws-lambda --region $REGION --query 'LayerVersions[0].LayerVersionArn' --output text | grep -oE '[0-9]+$') - ARN="$ARN_BASE$REGION$ARN_SUFFIX$LAYER_VERSION" - sed -i -e "s|arn:aws:lambda:$REGION:[0-9]*:layer:chrome-aws-lambda:[0-9]*|$ARN|g" readme.md + X64_VERSION=$(aws lambda list-layer-versions --layer-name chrome-aws-lambda-x64 --region $REGION --query 'LayerVersions[0].Version' --output text 2>/dev/null || echo "1") + ARM64_VERSION=$(aws lambda list-layer-versions --layer-name chrome-aws-lambda-arm64 --region $REGION --query 'LayerVersions[0].Version' --output text 2>/dev/null || echo "1") + + X64_ARN="$ARN_BASE$REGION:$ACCOUNT_ID:layer:chrome-aws-lambda-x64:$X64_VERSION" + ARM64_ARN="$ARN_BASE$REGION:$ACCOUNT_ID:layer:chrome-aws-lambda-arm64:$ARM64_VERSION" + + sed -i -e "s|arn:aws:lambda:$REGION:[0-9]*:layer:chrome-aws-lambda-x64:[0-9]*|$X64_ARN|g" readme.md + sed -i -e "s|arn:aws:lambda:$REGION:[0-9]*:layer:chrome-aws-lambda-arm64:[0-9]*|$ARM64_ARN|g" readme.md done - name: Commit and Push run: | git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git add readme.md - git commit -m "Update README with new version details [ci skip]" - git push + if ! git diff --quiet readme.md; then + git add readme.md + git commit -m "Update README with new version details [ci skip]" + git push + echo "README updated and pushed" + else + echo "No changes to README, skipping commit" + fi diff --git a/readme.md b/readme.md index 2d493da..521540d 100644 --- a/readme.md +++ b/readme.md @@ -4,15 +4,20 @@ [Sparticuz/chromium](https://github.com/Sparticuz/chromium) published as a Lambda Layer. -Tested with Node.js 16x/18x. Compatible with x86_64 only. Has Chromium v131.0.0 +Tested with Node.js 16x/18x/20x. Compatible with x86_64 and arm64 architectures. Has Chromium v133.0.0 ## Getting Started -Click on Layers and choose "Add a layer", and "Provide a layer version -ARN" and enter the following ARN. +Click on Layers and choose "Add a layer", and "Provide a layer version ARN" and enter one of the ARNs below based on your Lambda architecture. +**For x86_64 (Intel/AMD)**: ``` -arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda:50 +arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda-x64:1 +``` + +**For arm64 (Graviton2)**: +``` +arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda-arm64:1 ``` When importing the module within lambda, make sure you import `@sparticuz/chromium` not `chrome-aws-lambda` @@ -28,39 +33,67 @@ const chromium = require('@sparticuz/chromium'); **lambda container settings**: -- x86_64 architecture -- > =1024mb memory +- x86_64 or arm64 architecture +- >=1024mb memory - `@sparticuz/chromium` marked as an externalModule in the bundling settings - A lambda layer marked like so (this is CDK code, but convert to SAM or whatever at will): +**For x86_64**: +```ts +layers: [LayerVersion.fromLayerVersionArn(this, 'chromium-lambda-layer', + 'arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda-x64:1' +)] +``` + +**For arm64**: ```ts layers: [LayerVersion.fromLayerVersionArn(this, 'chromium-lambda-layer', - 'arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda:50' + 'arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda-arm64:1' )] ``` **In the deployed lambda code** -You can just use a regular ES6 or CommonJS import statement for `@sparticuz/chrome-aws-lambda`, and just use as -indicated. +You can just use a regular ES6 or CommonJS import statement for `@sparticuz/chromium`, and just use as indicated. ## Available regions -* ap-northeast-1: `arn:aws:lambda:ap-northeast-1:764866452798:layer:chrome-aws-lambda:50` -* ap-northeast-2: `arn:aws:lambda:ap-northeast-2:764866452798:layer:chrome-aws-lambda:49` -* ap-south-1: `arn:aws:lambda:ap-south-1:764866452798:layer:chrome-aws-lambda:50` -* ap-southeast-1: `arn:aws:lambda:ap-southeast-1:764866452798:layer:chrome-aws-lambda:50` -* ap-southeast-2: `arn:aws:lambda:ap-southeast-2:764866452798:layer:chrome-aws-lambda:50` -* ca-central-1: `arn:aws:lambda:ca-central-1:764866452798:layer:chrome-aws-lambda:50` -* eu-north-1: `arn:aws:lambda:eu-north-1:764866452798:layer:chrome-aws-lambda:50` -* eu-central-1: `arn:aws:lambda:eu-central-1:764866452798:layer:chrome-aws-lambda:50` -* eu-west-1: `arn:aws:lambda:eu-west-1:764866452798:layer:chrome-aws-lambda:50` -* eu-west-2: `arn:aws:lambda:eu-west-2:764866452798:layer:chrome-aws-lambda:50` -* eu-west-3: `arn:aws:lambda:eu-west-3:764866452798:layer:chrome-aws-lambda:50` -* sa-east-1: `arn:aws:lambda:sa-east-1:764866452798:layer:chrome-aws-lambda:50` -* us-east-1: `arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda:50` -* us-east-2: `arn:aws:lambda:us-east-2:764866452798:layer:chrome-aws-lambda:50` -* us-west-1: `arn:aws:lambda:us-west-1:764866452798:layer:chrome-aws-lambda:50` -* us-west-2: `arn:aws:lambda:us-west-2:764866452798:layer:chrome-aws-lambda:50` +### x86_64 (Intel/AMD) + +* ap-northeast-1: `arn:aws:lambda:ap-northeast-1:764866452798:layer:chrome-aws-lambda-x64:1` +* ap-northeast-2: `arn:aws:lambda:ap-northeast-2:764866452798:layer:chrome-aws-lambda-x64:1` +* ap-south-1: `arn:aws:lambda:ap-south-1:764866452798:layer:chrome-aws-lambda-x64:1` +* ap-southeast-1: `arn:aws:lambda:ap-southeast-1:764866452798:layer:chrome-aws-lambda-x64:1` +* ap-southeast-2: `arn:aws:lambda:ap-southeast-2:764866452798:layer:chrome-aws-lambda-x64:1` +* ca-central-1: `arn:aws:lambda:ca-central-1:764866452798:layer:chrome-aws-lambda-x64:1` +* eu-north-1: `arn:aws:lambda:eu-north-1:764866452798:layer:chrome-aws-lambda-x64:1` +* eu-central-1: `arn:aws:lambda:eu-central-1:764866452798:layer:chrome-aws-lambda-x64:1` +* eu-west-1: `arn:aws:lambda:eu-west-1:764866452798:layer:chrome-aws-lambda-x64:1` +* eu-west-2: `arn:aws:lambda:eu-west-2:764866452798:layer:chrome-aws-lambda-x64:1` +* eu-west-3: `arn:aws:lambda:eu-west-3:764866452798:layer:chrome-aws-lambda-x64:1` +* sa-east-1: `arn:aws:lambda:sa-east-1:764866452798:layer:chrome-aws-lambda-x64:1` +* us-east-1: `arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda-x64:1` +* us-east-2: `arn:aws:lambda:us-east-2:764866452798:layer:chrome-aws-lambda-x64:1` +* us-west-1: `arn:aws:lambda:us-west-1:764866452798:layer:chrome-aws-lambda-x64:1` +* us-west-2: `arn:aws:lambda:us-west-2:764866452798:layer:chrome-aws-lambda-x64:1` + +### arm64 (Graviton2) + +* ap-northeast-1: `arn:aws:lambda:ap-northeast-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* ap-northeast-2: `arn:aws:lambda:ap-northeast-2:764866452798:layer:chrome-aws-lambda-arm64:1` +* ap-south-1: `arn:aws:lambda:ap-south-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* ap-southeast-1: `arn:aws:lambda:ap-southeast-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* ap-southeast-2: `arn:aws:lambda:ap-southeast-2:764866452798:layer:chrome-aws-lambda-arm64:1` +* ca-central-1: `arn:aws:lambda:ca-central-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* eu-north-1: `arn:aws:lambda:eu-north-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* eu-central-1: `arn:aws:lambda:eu-central-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* eu-west-1: `arn:aws:lambda:eu-west-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* eu-west-2: `arn:aws:lambda:eu-west-2:764866452798:layer:chrome-aws-lambda-arm64:1` +* eu-west-3: `arn:aws:lambda:eu-west-3:764866452798:layer:chrome-aws-lambda-arm64:1` +* sa-east-1: `arn:aws:lambda:sa-east-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* us-east-1: `arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* us-east-2: `arn:aws:lambda:us-east-2:764866452798:layer:chrome-aws-lambda-arm64:1` +* us-west-1: `arn:aws:lambda:us-west-1:764866452798:layer:chrome-aws-lambda-arm64:1` +* us-west-2: `arn:aws:lambda:us-west-2:764866452798:layer:chrome-aws-lambda-arm64:1` ## License