Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Uncluster SAR release from tag release, and place it along ESF terraform dependencies #809

Merged
merged 5 commits into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 4 additions & 50 deletions .github/workflows/release.yml → .github/workflows/create-tag.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
## Workflow to create a new git tag if version.py variable version gets updated
name: release
# Workflow to create a new git tag if version.py variable version gets updated
name: create-tag

permissions:
contents: write # write permission is required to create a GitHub release
Expand All @@ -14,14 +14,10 @@ on:

jobs:

release:
create-tag:
runs-on: ubuntu-latest
timeout-minutes: 5

outputs:
version: ${{ steps.version.outputs.version }}
enabled: ${{ steps.version.outputs.enabled }}
tag: ${{ steps.version.outputs.tag }}
steps:

- uses: actions/checkout@v4
Expand Down Expand Up @@ -66,10 +62,6 @@ jobs:
echo "::notice::Current version is ${{ env.VERSION }}."
echo "::notice::The result for creating tag is $CREATE_TAG."

echo "version=${{ env.VERSION }}" >> "$GITHUB_OUTPUT"
echo "enabled=${CREATE_TAG}" >> "$GITHUB_OUTPUT"
echo "tag=lambda-v${{ env.VERSION }}" >> "$GITHUB_OUTPUT"

- name: Create tag
if: env.CREATE_TAG == 'true' # run only in case CREATE_TAG is true
uses: actions/github-script@v7
Expand All @@ -78,44 +70,6 @@ jobs:
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: 'refs/tags/' + "${{ steps.version.outputs.tag }}",
ref: 'refs/tags/lambda-v' + "${{ env.VERSION }}",
sha: context.sha
})

regular-sar:
if: ${{ needs.release.outputs.enabled == 'true' }}
runs-on: ubuntu-latest
needs: release
permissions:
# The OIDC permissions can be found at https://github.com/elastic/oblt-infra/tree/main/conf/resources/repos/elastic-serverless-forwarder
id-token: write
contents: read
env:
BUCKET_NAME : "elastic-serverless-forwarder"
AWS_REGION : "eu-central-1"
# elastic-observability-prod
AWS_ACCOUNT_ID: "267093732750"
steps:
- uses: actions/checkout@v4
with:
ref: ${{ needs.release.outputs.tag }}

- uses: elastic/oblt-actions/aws/auth@v1
with:
aws-account-id: "${{ env.AWS_ACCOUNT_ID }}"
aws-region: "${{ env.AWS_REGION }}"

- uses: aws-actions/setup-sam@2360ef6d90015369947b45b496193ab9976a9b04 # v2
with:
use-installer: true
token: ${{ secrets.GITHUB_TOKEN }}

- name: Build and package
run: |
.internal/aws/scripts/dist.sh \
elastic-serverless-forwarder \
${{ needs.release.outputs.version }} \
${{ env.BUCKET_NAME }} \
${{ env.AWS_ACCOUNT_ID }} \
${{ env.AWS_REGION }} \
"Elastic"
123 changes: 123 additions & 0 deletions .github/workflows/releases-production.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
---
# IMPORTANT:
# If you change the name of this file, you will have to update
# https://github.com/elastic/oblt-infra/blob/main/conf/resources/repos/elastic-serverless-forwarder/01-aws-oidc-github.tf
# to include the current one!

# Workflow to push zip with dependencies to S3 bucket every time the ESF version is updated
# (we need this for ESF terraform), and to publish the new SAR version
name: releases-production
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will require a change in the infra part, so the terraform definition for the OIDC is configured for the releases-production

Suggested change
name: releases-production
# If you change the name, please adjust the changes in https://github.com/elastic/oblt-infra/tree/main/conf/resources/repos/elastic-serverless-forwarder
name: releases-production

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will require a change in the infra part, so the terraform definition for the OIDC is configured for the create-tag

Wouldn't it be better to create a role in the AWS account? This way the team could change the permissions if necessary. So:

  1. A role for the dependencies bucket (that part is done and was working)
  2. A role for the SAR

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't it be better to create a role in the AWS account? This way the team could change the permissions if necessary. So:

I understand your question about flexibility, but we are not using that approach anymore for various security reasons:

  • Changes are not tracked through IasC but click-ops
  • No PRs or code changes in place that can be reviewed
  • Eventually remove the permissions to AWS prod and use IasC for it

In other words, there should be a separation of concerns when running things in the CI. I'll ping you to the original request to do the separation of concerns when accessing cloud accounts in the CI.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand, and it makes sense. In that case, for this PR to work:

  1. We need to update this with the correct filename like you mentioned.
  2. We need to create a PR to add a new file for the role for the ESF dependencies. How to do this?
  3. Remove the role we are using to upload the dependencies in this job, since 2. already takes care of that.

Copy link
Contributor Author

@constanca-m constanca-m Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found this guide, but I don't understand how the job will ever know about this *.tf file. And would the role assumed scope to the job? Can we have 2 different roles, one being used for each job, for the same workflow?

Copy link
Member

@v1v v1v Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand how the job will ever know about this *.tf file.

There are two parts:

  1. The GitHub workflow using the id-token: write and https://github.com/elastic/oblt-actions/tree/main/aws/auth
  2. The AWS OIDC configuration using the *.tf files

2) needs to be applied before 1) can run, for such, it's required to list all the required permissions so it can be configured accordingly. Those *.tf files are the ones saying what's the permissions for the given GitHub workflow. To apply tho *.tf files, that's only possible by a few people for the reasons I mentioned above.

And would the role assumed scope to the job? Can we have 2 different roles, one being used for each job, for the same workflow?

Let me ping @reakaleek; he did all the heavy lifting and can answer your questions better than I can.

Copy link
Member

@reakaleek reakaleek Sep 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @constanca-m,

You can find our official documentation about our keyless setup at https://github.com/elastic/observability-robots/blob/main/docs/teams/ci/keyless/github-actions/amazon-web-services.md

And would the role assumed scope to the job? Can we have 2 different roles, one being used for each job, for the same workflow?

Unfortunately, we don't differentiate between jobs in a workflow. We only separate between workflows. Essentially, we set up OIDC for a workflow. For each workflow that is defined, a role is created which can be assumed by the workflow.

In the linked documentation, you can find how we are attaching policies to a given role.

Hence, in this case we would attach the permissions needed for both jobs to a single role.

If you think it's crucial to give each job in a workflow different permissions, then let's discuss, and we can try to figure out how to extend the existing functionality to also accomodate this need.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the detailed answer. Since this is just the permissions to execute the workflow, I don't think there is an issue with granting both jobs permissions to just one role.

I have opened https://github.com/elastic/oblt-infra/pull/194 to fix this issue.


on:
workflow_run:
workflows: [create-tag]
types:
- completed

permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout

env:
AWS_REGION: "eu-central-1"
AWS_ACCOUNT_ID: "267093732750" # account 'elastic-observability-prod'

jobs:

get-esf-version:
runs-on: ubuntu-latest
timeout-minutes: 5

outputs:
version: ${{ steps.get-version.outputs.version }}

steps:
- uses: actions/checkout@v4

- name: Get version number
id: get-version
shell: bash
run: |
version=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+(\-[a-zA-Z]+[0-9]+)?' share/version.py)
echo "version=${version}" >> $GITHUB_OUTPUT
echo "::notice::ESF version is ${version}."


build-and-upload-dependencies:
runs-on: ubuntu-latest
timeout-minutes: 30
needs: get-esf-version

env:
BUCKET_NAME: "esf-dependencies"

steps:
# See https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-create-dependencies

- uses: actions/checkout@v4
with:
ref: 'lambda-v${{ needs.get-esf-version.outputs.version }}'

- uses: actions/setup-python@v5
with:
python-version: '3.9'
cache: 'pip' # caching pip dependencies

- name: Install requirements in a directory and zip it.
shell: bash
run: |
pip3 install -r requirements.txt -t ./dependencies
cd dependencies && zip -r ../lambda-v${{ needs.get-esf-version.outputs.version }}.zip .

- name: Place handlers in the zip file.
shell: bash
run: |
zip -r ./lambda-v${{ needs.get-esf-version.outputs.version }}.zip main_aws.py
zip -r ./lambda-v${{ needs.get-esf-version.outputs.version }}.zip handlers
zip -r ./lambda-v${{ needs.get-esf-version.outputs.version }}.zip share
zip -r ./lambda-v${{ needs.get-esf-version.outputs.version }}.zip storage
zip -r ./lambda-v${{ needs.get-esf-version.outputs.version }}.zip shippers

- name: Configure AWS credentials
constanca-m marked this conversation as resolved.
Show resolved Hide resolved
uses: elastic/oblt-actions/aws/auth@v1
with:
aws-account-id: "${{ env.AWS_ACCOUNT_ID }}"
aws-region: "${{ env.AWS_REGION }}"

- name: Copy file to s3
run: |
aws s3 cp ./lambda-v${{ needs.get-esf-version.outputs.version }}.zip s3://${{ env.BUCKET_NAME }}/


release-sar:
runs-on: ubuntu-latest
timeout-minutes: 30
needs: get-esf-version

env:
BUCKET_NAME: "elastic-serverless-forwarder"

steps:
- uses: actions/checkout@v4
with:
ref: 'lambda-v${{ needs.get-esf-version.outputs.version }}'

- uses: elastic/oblt-actions/aws/auth@v1
with:
aws-account-id: "${{ env.AWS_ACCOUNT_ID }}"
aws-region: "${{ env.AWS_REGION }}"

- uses: aws-actions/setup-sam@2360ef6d90015369947b45b496193ab9976a9b04 # v2
with:
use-installer: true
token: ${{ secrets.GITHUB_TOKEN }}

- name: Build and package
run: |
.internal/aws/scripts/dist.sh \
elastic-serverless-forwarder \
${{ needs.get-esf-version.outputs.version }} \
${{ env.BUCKET_NAME }} \
${{ env.AWS_ACCOUNT_ID }} \
${{ env.AWS_REGION }} \
"Elastic"
70 changes: 0 additions & 70 deletions .github/workflows/upload-dependencies.yml

This file was deleted.