Я запускаю действие GH, которое:
- < li>работает на автономной среде (Linux)
- выполняет тривиальные действия (оформление заказа, установка .NET и т. д.)
- берёт на себя роль конкретный аккаунт (окружение учетной записи) и устанавливает необходимые переменные окружения.
Код: Выделить всё
QA - запускает проект с переменными окружения.
Когда я перечисляю сегменты 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
- < 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;
}
}
}
ПРИМЕЧАНИЕ. Если чего-то не хватает, что поможет вам лучше понять мою ситуацию, дайте мне знать, и я сделаю все возможное, чтобы добавить это.
еще раз — буду рад вашей помощи.
Код: Выделить всё
EDIT - 1
когда я таким же образом назначил роль в коде — я получил правильную роль и перечислил правильные сегменты.
чего я не понимаю, так это того, почему я предполагаю роль и получить учетные данные одного типа роли - и, используя их в коде, я получаю другую роль?
Подробнее здесь: https://stackoverflow.com/questions/786 ... nd-net-app
Мобильная версия