У меня есть рабочий процесс GitHub, в котором я запускаю контейнер, и в этом контейнере набор тестов, требующих доступа к частному AWS S3. Проблема в том, что внутри контейнера я получаю сообщение об отсутствии учетных данных, а снаружи все в порядке.
Вот как я настраиваю учетные данные:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: "arn:aws:iam::ACCOUNTID:role/MYROLE"
aws-region: "us-east-1"
Теперь, если я получу доступ к своей корзине S3 из рабочего процесса, все будет работать нормально:
- name: Test S3 credentials
run: aws s3 ls s3://misery/
Однако то же самое в контейнере Docker приведет к ошибке:
- name: Run tests in Docker container
run: docker run my-image /bin/bash -c "aws s3 ls s3://misery/"
Читая этот ТАК-пост, я думал, что получение учетных данных должно происходить автоматически, но, видимо, я что-то упускаю. Есть какие-нибудь подсказки?
Спасибо, я попробовал, но это не сработало - смотрите мой ответ ниже.





Оказывается, один из способов передать учетные данные — передать их как переменные среды. Последние производятся aws-actions/configure-aws-credentials@v4 и доступны по env.
Пример:
- name: Run tests
run: |
docker run \
-e AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }} \
-e AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }} \
-e AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }} \
-e AWS_REGION = "us-east-1" \
run: docker run my-image /bin/bash -c "aws s3 ls s3://misery/"
Важно отметить, что это НЕ будет работать:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: "arn:aws:iam::ACCOUNTID:role/MYROLE"
aws-region: "REGION"
output-credentials: true
- name: Run tests
run: |
docker run \
-e AWS_ACCESS_KEY_ID=${{ steps.creds.outputs.aws-access-key-id }} \
-e AWS_SECRET_ACCESS_KEY=${{ steps.creds.outputs.aws-secret-access-key }} \
-e AWS_REGION = "REGION" \
run: docker run my-image /bin/bash -c "aws s3 ls s3://misery/"
При печати steps.creds.outputs он окажется пустым.
Пробовали ли вы второй пример, добавив id: creds на шаг настройки учетных данных AWS? В противном случае вывод будет недоступен.
Нет, не видел, возможно, дело в этом. Я попробую и дополню ответ. Или, если хотите, вы можете опубликовать свое, и я приму.
Я добавил ответ, в котором более подробно описывается, как работают выходные данные в этом случае.
Вы действительно можете использовать действие aws-actions/configure-aws-credentials со своей ролью AWS IAM, поскольку оно автоматически генерирует следующие выходные данные:
При этом вы можете использовать эти выходные данные в качестве переменных среды с помощью команды docker run.
Вот пример того, как этого добиться, используя outputs из шага Configure aws credentials (используя ссылку id aws-cred) на шаге Run tests:
- name: Configure aws credentials
id: creds
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: "arn:aws:iam::ACCOUNTID:role/MYROLE"
aws-region: "us-east-1"
output-credentials: true
- name: Run tests
run: |
docker run \
-e AWS_ACCESS_KEY_ID=${{ steps.creds.outputs.aws-access-key-id }} \
-e AWS_SECRET_ACCESS_KEY=${{ steps.creds.outputs.aws-secret-access-key }} \
-e AWS_SESSION_TOKEN=${{ steps.creds.outputs.aws-session-token }} \
-e AWS_REGION = "us-east-1" \
my-image /bin/bash -c "aws s3 ls s3://misery/"
shell: bash
Обратите внимание: если вы используете бегун self hosted с уже управляемыми там учетными данными AWS, вы можете напрямую сообщить переменные среды из контекста Github. Пример:
- name: Run tests
run: |
docker run \
-e AWS_ACCESS_KEY_ID=${{ env.AWS_ACCESS_KEY_ID }} \
-e AWS_SECRET_ACCESS_KEY=${{ env.AWS_SECRET_ACCESS_KEY }} \
-e AWS_SESSION_TOKEN=${{ env.AWS_SESSION_TOKEN }} \
-e AWS_REGION = "us-east-1" \
my-image /bin/bash -c "aws s3 ls s3://misery/"
shell: bash
Пробовали ли вы добавить учетные данные AWS, сгенерированные с помощью
aws-actions/configure-aws-credentials@v4, в команду docker cli, используя флаг-e? Пример:docker run -e AWS_ACCESS_KEY_ID=${{ steps.aws-cred.outputs.aws-access-key-id }}". Это действие на github использует нечто похожее с Docker.