AWS SDK не может читать переменные окружения - PullRequest
3 голосов
/ 22 февраля 2020

Я устанавливаю переменные AWS_ env, как показано ниже для Jenkins

    sudo apt-get update -y
    sudo apt-get install -y python3 python-pip python-devel
    sudo pip install awscli
    S3_LOGIN=$(aws sts assume-role --role-arn rolename --role-session-name s3_session)
    export AWS_CREDENTIAL_PROFILES_FILE=~/.aws/credentials
    export AWS_ACCESS_KEY_ID=$(echo ${S3_LOGIN}| jq --raw-output '.Credentials|"\(.AccessKeyId)"')
    export AWS_SECRET_ACCESS_KEY=$(echo ${S3_LOGIN} | jq --raw-output '.Credentials|"\(.SecretAccessKey)"')
    export AWS_SESSION_TOKEN=$(echo ${S3_LOGIN} | jq --raw-output '.Credentials|"\(.SessionToken)"')
    aws configure set default.region us-east-2
    aws configure set AWS_ACCESS_KEY_ID $AWS_ACCESS_KEY_ID
    aws configure set AWS_SECRET_ACCESS_KEY $AWS_SECRET_ACCESS_KEY

Но когда я пытаюсь получить их из кода, sdk не может прочитать уже установленные переменные env

 AWSCredentials evc = new EnvironmentVariableCredentialsProvider().getCredentials();
 AmazonS3Client amazonS3 = new AmazonS3Client(evc);
 amazonS3.setRegion(RegionUtils.getRegion("us-east-2"));

com.amazon aws .AmazonClientException: невозможно загрузить AWS учетные данные из переменных среды (AWS_ACCESS_KEY_ID (или AWS_ACCESS_KEY) и AWS_SECRET_KEY (или AWS_SECRET_ACCESS_KEY))

* * * * * * * * * * SDK выглядит ниже,
public AWSCredentials getCredentials() {
        String accessKey = System.getenv(ACCESS_KEY_ENV_VAR);
        if (accessKey == null) {
            accessKey = System.getenv(ALTERNATE_ACCESS_KEY_ENV_VAR);
        }

        String secretKey = System.getenv(SECRET_KEY_ENV_VAR);
        if (secretKey == null) {
            secretKey = System.getenv(ALTERNATE_SECRET_KEY_ENV_VAR);
        }

        accessKey = StringUtils.trim(accessKey);
        secretKey = StringUtils.trim(secretKey);
        String sessionToken =
            StringUtils.trim(System.getenv(AWS_SESSION_TOKEN_ENV_VAR));

        if (StringUtils.isNullOrEmpty(accessKey)
                || StringUtils.isNullOrEmpty(secretKey)) {

            throw new AmazonClientException(
                    "Unable to load AWS credentials from environment variables " +
                    "(" + ACCESS_KEY_ENV_VAR + " (or " + ALTERNATE_ACCESS_KEY_ENV_VAR + ") and " +
                    SECRET_KEY_ENV_VAR + " (or " + ALTERNATE_SECRET_KEY_ENV_VAR + "))");
        }

        return sessionToken == null ?
                new BasicAWSCredentials(accessKey, secretKey)
                :
                new BasicSessionCredentials(accessKey, secretKey, sessionToken);
    }

РЕДАКТИРОВАТЬ: я пытаюсь подход ниже также,

 ProfileCredentialsProvider  evc = new ProfileCredentialsProvider();
        AmazonS3Client amazonS3 = new AmazonS3Client(evc);
        amazonS3.setRegion(RegionUtils.getRegion("us-east-2"));

Но даже я установил AWS_CREDENTIAL_PROFILES_FILE в сценарии, потому что файл учетных данных находится в ~ /. aws / credentials, я все еще получаю ниже,

файл профилей учетных данных не найден по указанному пути: /root/.aws/credentials

Несмотря на то, что код AwsProfileFileLocationProvider говорит ниже, я не уверен, почему он пытается посмотреть /root/.aws/credentials

Сначала проверяет переопределение переменной окружения *, затем проверяет расположение по умолчанию (~ / .aws / credentials) и, наконец, возвращается к * устаревшему файлу конфигурации (~ / .aws / config), который мы все еще поддерживаем загрузкой учетных данных из

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я предполагаю, что вы конфигурируете задание Jenkins с различными шагами сборки между заданными учетными данными и потреблением учетных данных.
Jenkins не разделяет переменную среды между этапами сборки.

Если вы используете задание Jenkins в старом стиле, вам нужно будет использовать какой-нибудь плагин, например envinject, или использовать файл для обмена переменными между шагами. Как показано ниже (просто в качестве примера).

Шаг 1

echo "export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}" > credential
echo "export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}" >> credential
echo "export AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}" >> credential

Шаг 2

source credential && ./your_command_here

Но если вы подаете в суд на Jenkins Pipeline, вы можете использовать env. Как ниже (как в примере).

  pipeline {
        parameters {
            string(name: 'AWS_ACCESS_KEY_ID', defaultValue: '')
        }

        stage("set credential") {
             steps {
               tmp_AWS_ACCESS_KEY_ID =  sh (script: 'your shell script here', returnStdout: true).trim()
               env.AWS_ACCESS_KEY_ID = tmp_AWS_ACCESS_KEY_ID
              }
        }
        stage("consume credential") {
            steps {
              echo "${env.AWS_ACCESS_KEY_ID}"
            }
        }
  }
1 голос
/ 25 февраля 2020

Вы сможете изменить местоположение файла учетных данных, используя AWS_CREDENTIAL_PROFILES_FILE переменная среды

...