프로젝트 환경 : Java, Spring
SVN : Github
문제 상황 : Sonar Cloud의 Actions 동작 중 문제 발생
문제 발생 상황
프로젝트를 진행하며 이미지 파일을 AWS의 S3 버킷에 올려하는 상황이 생겼습니다.
S3에 업로드하기 위해서는 S3의 버킷 이름, IAM의 ACCESS-KEY, SECRET-KEY가 필요합니다.
앞서 언급한 정보들은 github에 올라가는 경우 악용할 수 있어 보통 credential yaml 파일을 생성하고, github에는 올리지 않고 로컬, 배포 환경 서버에 yaml 파일을 두고 다음과 같이 yaml 파일을 include 해 사용합니다.
spring:
profiles:
active: local # 기본 환경
include: credential # 비밀 정보들 관리 관련 yaml
[application-credential.yaml]
cloud:
aws:
s3:
bucket: S3 버킷 이름
credentials:
access-key: IAM ACCESS KEY
secret-key: IAM SECRET KEY
region:
static: ap-northeast-2
auto: false
stack:
auto: false
그러고 Java Code 에서는 다음과 같이 설정 정보들을 가져오도록 구현합니다.
@Configuration
public class S3Configuration {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Value("${cloud.aws.region.static}")
private String region;
@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder
.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
.build();
}
로컬에서 이와 관련된 테스트 코드들을 작성하고 github에 push 후, Actions가 작업을 수행한 후 Sonar Cloud의 분석 리포트를 봤는데 다음과 같이 테스트 코드 몇 개가 깨져있었습니다.
해당 원인을 찾아가 보니 @Value를 선언한 코드에 대해 테스트 하는 경우 application-credential.yaml에 들어있는 값들을 불러올 수 없기 때문에 Bean을 생성하지 못해 테스트가 깨지는 상황이 발생했습니다.
해결책
Github에서는 환경변수를 저장할 수 있는 공간이 있습니다.
Github Repository -> Settings -> Secrets and variables -> Actions 탭 클릭 후 New Repository secret 클릭
yaml에 적었던 값들을 여기에 key value 형식으로 적어주면 됩니다.
그 후 action을 명세하는 yml에 다음의 명령어를 적어주면 됩니다.
- name: Setup environment variables
run: |
echo "CLOUD_AWS_REGION_STATIC=ap-northeast-2" >> $GITHUB_ENV
echo "CLOUD_AWS_CREDENTIALS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY_ID }}" >> $GITHUB_ENV
echo "CLOUD_AWS_CREDENTIALS_SECRET_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> $GITHUB_ENV
echo "CLOUD_AWS_S3_BUCKET=${{ secrets.BUCKET_NAME }}" >> $GITHUB_ENV
credential.yaml에 있던 key값들을 echo 명령어를 통해 값을 저장하면 됩니다.
여기서 CLOUD_AWS_REGION_STATIC부분 (= 왼쪽 부분)은 yaml 혹은 properties에 적힌 key 값을 적어주면 됩니다.
예시는 다음과 같습니다.
cloud:
aws:
s3:
bucket: S3-Value # CLOUD_AWS_S3_BUCKET
credentials:
access-key: ACCESS-KEY-VALUE # CLOUD_AWS_CREDENTIALS_ACCESS_KEY
secret-key: SECRET-KEY-VALUE # CLOUD_AWS_CREDENTIALS_SECRET_KEY
#{{ }} 안의 값은 Github Repository Secret에 적어준 key 값을 적어주면 됩니다.
그런 후 테스트를 다시 실행해 보면
다음과 같이 정상적으로 테스트를 진행하는 것을 확인할 수 있습니다.
'개발일지' 카테고리의 다른 글
kafka 성능 개선기 (feat. 배치 리스너) (0) | 2024.09.02 |
---|---|
[Git] SubModule에 대해서 (0) | 2024.04.16 |
커플 재결합 관련 Code Refactoring (2) | 2023.11.22 |
asciidoc를 통해 생성된 html이 jar에 포함되지 않은 이유는 무엇일까? (1) | 2023.11.03 |