Несоответствие предположений учетной записи AWS между GH runner и приложением .NETC#

Место общения программистов C#
Ответить
Anonymous
 Несоответствие предположений учетной записи AWS между GH runner и приложением .NET

Сообщение Anonymous »

Мое приложение .NET (версия 8, C#) загружает и отправляет данные из и в корзины S3.
Я запускаю действие GH, которое:
  • < li>работает на автономной среде (Linux)
  • выполняет тривиальные действия (оформление заказа, установка .NET и т. д.)
  • берёт на себя роль конкретный аккаунт ( окружение учетной записи) и устанавливает необходимые переменные окружения.
  • запускает проект с переменными окружения.
Когда я перечисляю сегменты S3 во время сеанса GH runner, я вижу ожидаемые сегменты.
Когда я перечисляю сегменты S3 в своем приложении .NET, я вижу сегменты из другой учетной записи, но не ожидаемую учетную запись.
Совершенно не понимаю, что происходит, и буду признателен за вашу помощь.
Некоторые проверки, которые я сделал:
  • сравнили «AWS_ACCESS_KEY_ID», «AWS_SECRET_ACCESS_KEY» и «AWS_SESSION_TOKEN» после принятия роли и во время выполнения приложения. они существуют и одинаковы.
  • проверено, что корзина S3 и путь существуют
  • проверено, что корзина S3 позволяет моей предполагаемой роли действовать
    убедился, что моя роль существует и имеет разрешения на работу с s3 в ожидаемой среде.
  • запустил код в другом экземпляре, который принял на себя роль во время создания экземпляра, и проверил его. что это работает (имеется в виду - вероятно, это не прямая ошибка в коде и т. д.)
код:
  • Мой рабочий процесс GH:

Код: Выделить всё

name: my workflow name
on: [push]
jobs:
run_update_tests:
runs-on: some-linux-self-hosted-runner
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.ref }}

- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 8.0.105

- name: Build project
working-directory: path/to/project
run: |
echo "Building project"
dotnet build

- name: Copy test configuration file - Linux
working-directory: some-config-path
run: |
echo "Copying test configuration file"
mkdir -p /tmp/path
cp some/json/file/path some/path
sed -i 's/SOME_SECRET_PLACEHOLDER/${{ secrets.SOME_SECRET }}/' some/path

- name: Assume role
uses: ./.github/actions/assume-role

- name: Check env vars
run: |
echo "AWS_ACCESS_KEY_ID is set: ${{ env.AWS_ACCESS_KEY_ID != '' }}"
echo "AWS_SECRET_ACCESS_KEY is set: ${{ env.AWS_SECRET_ACCESS_KEY != '' }}"
echo "AWS_SESSION_TOKEN is set: ${{ env.AWS_SESSION_TOKEN != '' }}"

- name: Run project
working-directory: some/path
run: |
echo "Running project"
sudo -E dotnet run
  • действие «присвоить роль»:

Код: Выделить всё

name: 'Assume Role'
description: 'Assuming role in AWS'

runs:
using: "composite"

steps:

- name: Install AWS cli
shell: bash
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update

- name: Assume role
shell: bash
run: |
ASSUME_ROLE_OUTPUT=$(aws sts assume-role --role-arn "some:arn:some:role" --role-session-name "AWSCLI-lab")
AWS_ACCESS_KEY_ID=$(echo $ASSUME_ROLE_OUTPUT | jq -r '.Credentials.AccessKeyId')
AWS_SECRET_ACCESS_KEY=$(echo $ASSUME_ROLE_OUTPUT | jq -r '.Credentials.SecretAccessKey')
AWS_SESSION_TOKEN=$(echo $ASSUME_ROLE_OUTPUT | jq -r '.Credentials.SessionToken')
echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID"
echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY"
echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN"
echo "AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID" >> $GITHUB_ENV
echo "AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY" >> $GITHUB_ENV
echo "AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" >>  $GITHUB_ENV

# validate assumed role
- name: Validate assumed role success
shell: bash
run: |
aws ec2 describe-vpcs | grep VpcId
aws s3 ls
после перечисления сегментов s3 здесь я вижу ожидаемые сегменты (то есть ожидаемый аккаунт)
  • < li>мой код, который пытается загрузить с S3 и выводит список сегментов S3:

Код: Выделить всё

public class RemoteObjectsHandler: IRemoteObjectsHandler
{
private readonly ITransferUtility _transferUtility;
private readonly ILogger _logger;
private readonly AmazonS3Client _s3Client;

public RemoteObjectsHandler(ITransferUtility transferUtility, ILogger logger)
{
_transferUtility = transferUtility;
_logger = logger;

var awsAccessKeyId = Environment.GetEnvironmentVariable("AWS_ACCESS_KEY_ID");
var awsSecretAccessKey = Environment.GetEnvironmentVariable("AWS_SECRET_ACCESS_KEY");
var awsSessionToken = Environment.GetEnvironmentVariable("AWS_SESSION_TOKEN");
Console.WriteLine($"awsAccessKeyId = {awsAccessKeyId}");
Console.WriteLine($"awsSecretAccessKey = {awsSecretAccessKey}");
Console.WriteLine($"awsSessionToken = {awsSessionToken}");

var credentials = new Amazon.Runtime.SessionAWSCredentials(awsAccessKeyId, awsSecretAccessKey, awsSessionToken);
_s3Client = new AmazonS3Client(credentials, Amazon.RegionEndpoint.EUCentral1);
}

public async Task DownloadObject(string bucketName, string objectName, string destinationPath)
{
try
{
// this is for test purposes - not logic
await ListBucketsAsync();

_logger.SafeLog($"Downloading object from bucket {bucketName} in {objectName} to {destinationPath}");

var request = new TransferUtilityDownloadRequest
{
BucketName = bucketName,
Key = objectName,
FilePath = destinationPath
};

var s3Cts = new CancellationTokenSource(Consts.S3_ACTION_TIME_LIMIT_MS);
await _transferUtility.DownloadAsync(request, s3Cts.Token);
}
catch (Exception e)
{
_logger.SafeLogException($"DownloadObject failed. bucketName = {bucketName}. objectName = {objectName}. destinationPath = {destinationPath}", e);
throw;
}
}

public async Task UploadObject(string objectPath, string bucketName, string uploadPath)
{
try
{
_logger.SafeLog($"Uploading object from {objectPath} to bucket {bucketName} in {uploadPath}");
var s3Cts = new CancellationTokenSource(Consts.S3_ACTION_TIME_LIMIT_MS);
await _transferUtility.UploadAsync(objectPath, bucketName, uploadPath, s3Cts.Token);
}
catch (Exception e)
{
_logger.SafeLogException($"UploadObject failed. objectPath = {objectPath}. bucketName = {bucketName}. uploadPath = {uploadPath}", e);
throw;
}
}

public async Task ListBucketsAsync()
{
try
{
_logger.SafeLog("Listing S3 buckets");

var response = await _s3Client.ListBucketsAsync();

foreach (var bucket in response.Buckets)
{
Console.WriteLine(bucket.BucketName);
}
}
catch (AmazonS3Exception e)
{
_logger.SafeLogException("Error occurred while listing buckets.", e);
throw;
}
}
}
здесь — при выводе корзин после использования клиента, который использует те же кредиты, что и в бегуне GH — я получаю корзины s3 из другой учетной записи — в которой эта роль не существует и т. д.
ПРИМЕЧАНИЕ. Если чего-то не хватает, что поможет вам лучше понять мою ситуацию, дайте мне знать, и я сделаю все возможное, чтобы добавить это.
еще раз — буду рад вашей помощи.

Код: Выделить всё

EDIT - 1
при печати предполагаемой роли в коде я вижу, что эта роль полностью отличается от той, которая описана в действии, и фактически принадлежит другой счет. вот почему в нем указан другой набор сегментов.
когда я таким же образом назначил роль в коде — я получил правильную роль и перечислил правильные сегменты.
чего я не понимаю, так это того, почему я предполагаю роль и получить учетные данные одного типа роли - и, используя их в коде, я получаю другую роль?

Подробнее здесь: https://stackoverflow.com/questions/786 ... nd-net-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»