Я пишу приложение для весенней загрузки, которое читает сообщения из SQS. Я могу запустить приложение, используя переменные среды AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY. Однако мне было интересно, что было бы проще передать эту конфигурацию через файл, похожий на application.properties. Как этого добиться?
Мне нужно управлять обоими случаями. Для разработки он работает на моем Mac, а в производстве он будет работать на EC2.




Есть несколько способов справиться с этим.
Вы можете настроить конфигурацию aws (на вашем локальном компьютере или компьютере с Linux), для которого потребуются ваш секретный ключ и ключ доступа, тогда вам не нужно передавать их в api по умолчанию конструктор, вы можете создать соединение, поскольку он выберет секретный ключ и т. д. системный путь.
AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
Если вы используете AWS EC2, то при создании экземпляра ec2 обязательно назначьте ему роль, которая имеет разрешение на SQS, тогда вам даже не нужно настраивать на этом компьютере.
Вы можете определить свой КЛЮЧ ДОСТУПА И СЕКРЕТНЫЙ КЛЮЧ в application/properties и загрузить в класс sqs с помощью @Value.
Вы можете создать aws.keys в вашем classpath и можете загружать свойства из файла.
Конечно, вы можете определить их как постоянные в вашем Constant class.
В приложении весенней загрузки вы можете получить доступ к свойствам, упомянутым в файле application.yml, с аннотацией @value. Вы можете создать такую услугу:
@Service
public class AmazonClient {
private AmazonSQS sqsClient;
@Value("${amazonProperties.accessKey}")
private String accessKey;
@Value("${amazonProperties.secretKey}")
private String secretKey;
@PostConstruct
private void initializeAmazon() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
this.sqsClient = AmazonSQSClientBuilder
.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
В файле application.yml:
amazonProperties:
accessKey: <your_access_key>
secretKey: <your_secret_key>
Если вы используете Spring Cloud AWS с весенней загрузкой, некоторые клиенты AWS (например, SQS и SNS) и метаданные EC2 могут быть настроены для вас с помощью автоматической настройки. Для локального тестирования вы можете использовать статические поставщики, установленные через свойства приложения.
В частности, вы можете установить такие свойства, как cloud.aws.credentials.accessKey и cloud.aws.region.static.
Изменение для aws sdk 2.0 выглядит следующим образом ..
AwsBasicCredentials awsCreds = AwsBasicCredentials.create(this.accessKey, this.secretKey);
S3Client client = S3Client.builder().region(Region.AP_SOUTH_1)
.credentialsProvider(StaticCredentialsProvider.create(awsCreds))
.build();
Я избегаю использования файла свойств, лучше использую здесь Credential Provider Chain, Документация AWS
Хотя файл свойств также может быть переопределен переменной среды, но если мне всегда нужно это делать, зачем мне вообще упоминать об этом в файле свойств. Также я хотел бы избежать фиксации ключей в коде (в файле свойств)
Более того, когда я смотрю на свой CI / CD, имеет смысл, а также легко просто установить переменную среды для вашей Spring Boot Environment - особенно в облаке. Если использовать docker env, еще проще и намного чище.
Если вы запускаете свой сервис в EC2 (в основном в средах, не предназначенных для разработки), то нет необходимости настраивать AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, поскольку из-за EC2ContainerCredentialsProviderWrapper учетные данные будут автоматически извлечены из контейнера AWS.
@Profile({"non-prod", "prod"})
@Bean("AWSCredentialsProvider")
public AWSCredentialsProvider amazonAWSCredentialsProvider() {
return new EC2ContainerCredentialsProviderWrapper();
}
ПРИМЕЧАНИЕ: Если вы решили использовать любой из нижеупомянутых AWSCredentialsProviderChain, используйте AWSCredentialsProvider, а не AWSStaticCredentialsProvider, иначе вы получите исключение
com.amazonaws.AmazonServiceException: The security token included in the request is expired.
Если приложение работает за пределами AWS, вы можете использовать AWSStaticCredentialsProvider с жестко заданными значениями awsAccessKeyId и awsSecretAccessKey.
aws.awsAccessKeyId:AWS_ACCESS_KEY_ID
aws.awsSecretAccessKey:AWS_SECRET_ACCESS_KEY
@Value("${aws.awsAccessKeyId:}")
private String awsAccessKeyId;
@Value("${aws.awsSecretAccessKey:}")
private String awsSecretAccessKey;
@Profile({"dev", "test"})
@Bean("AWSCredentialsProvider")
public AWSStaticCredentialsProvider amazonAWSCredentialsProviderDevelopment() {
return new AWSStaticCredentialsProvider(new BasicAWSCredentials(
awsAccessKeyId, awsSecretAccessKey));
}
Где работает ваше приложение: в AWS на EC2 или вне AWS?