Я пытаюсь взять на себя роль AWS, используя OIDC в моем файле действий GitHub, но он говорит: «Ошибка: не разрешено выполнять sts: AssumeRoleWithWebIdentity». Когда мы объединяем PR с основным, но если я изменю настройку для работы при нажатии на основную, тогда оно работает. Ниже я делюсь всем вариантом использования.
В моем AWS я добавил своего поставщика удостоверений со следующими настройками.
имя провайдера: token.actions.githubusercontent.com
аудитория: sts.amazonaws.com
В моих ролях я добавил следующую политику доверия.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::5599526xxxxx:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": [
"repo:organisation-name/repo:ref:refs/heads/main",
"repo:organisation-name/repo:pull_request"
]
}
}
}
]
}
В разделе разрешений я также добавил 1 пользовательское разрешение, которое прикрепляю.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRoleWithWebIdentity",
"Resource": "*"
}
]
}
Ниже приведен файл действий Github.
name: Deploy to Amazon ECS
on:
pull_request: #If I change setting for push it will work but on this setting it throws the error
branches:
- main
types:
- closed
env:
AWS_REGION: us-east-1
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
jobs:
deploy:
runs-on: ubuntu-latest
environment: sandbox
steps:
- name: Git clone the repository
uses: actions/checkout@v4
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::5599526xxxxx:role/github-role
role-session-name: samplerolesession
aws-region: ${{ env.AWS_REGION }}
Кто-нибудь может подсказать, что здесь не так?
Добавьте этот шаг, чтобы явно сгенерировать токен OIDC и проверить токен OIDC на наличие претензий на jwt.io. Полный рабочий процесс:
name: id-token
on:
workflow_dispatch:
pull_request:
types: [closed]
branches: [main]
jobs:
get-id-token:
runs-on: ubuntu-latest
permissions:
id-token: write
steps:
- run: |
ID_TOKEN=$(curl -s -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=api://demo" | jq -r .value)
echo $ID_TOKEN | base64
Вам нужно будет декодировать токен в Base64, прежде чем просматривать его на jwt.io.
Когда я слил ПР, я увидел
"sub": "repo:owner-name/repo-name:pull_request"
Что ты видишь?
Обновил мой ответ - значения уже установлены как переменные среды, их не нужно вводить.
Он показывает мне правильные дополнительные данные, а именно «sub»: «repo: имя-организации/имя-репо: pull_request», но я все еще не могу войти в систему через OIDC. выдает ту же ошибку. Ошибка: не удалось принять роль с OIDC: не разрешено выполнять sts: AssumeRoleWithWebIdentity.
Пробовали ли вы просто использовать aws CLI, чтобы вызвать STS и взять на себя роль? Возможно, вы получите более подробную информацию об ошибках. У вас уже есть токен.
В CLI отображается следующая ошибка: «Произошла ошибка (InvalidIdentityToken) при вызове операции AssumeRoleWithWebIdentity: неверная аудитория токена». В вашем ответе выше я обновил аудиторию с помощью «sts.amazonaws.com», но она все равно выдает ту же ошибку. в интерфейсе командной строки
Привет @delta, наконец-то это сработало!! Когда я декодировал токен JWT, я понял, что есть одна небольшая проблема с политикой доверия: в моем тестовом проекте она работала нормально, но в моем реальном файле она меняла подпрограмму следующим образом: repo:owner/repo:environment:sandbox. Итак, когда Я добавил это как вспомогательный файл, он начал работать, поэтому сработало декодирование токена JWT. Поэтому любому, кто сталкивается с такой проблемой, необходимо декодировать этот токен и сопоставить его, и если он отличается от политики доверия AWS, то его следует сделать таким же, и все будет работать нормально.
Что определяет «песочницу»?
извините за задержку ответа, но я обновил файл действий GitHub в вопросе, и это было похоже на развертывание: run-on: ubuntu-latest Environment: sandbox
env.ACTIONS_ID_TOKEN_REQUEST_URL и env.ACTIONS_ID_TOKEN_REQUEST_TOKEN имеют значение NULL, поэтому ничего не происходит