본문 바로가기
프로젝트 일지/BMT

"The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint." 에러 해결 & GitHub Action Secrets를 활용하여 .env 파일 생성하기 (or .env 파일 기능 구현하..

by 데브겸 2023. 5. 25.

1. S3 Bucket 에러 해결

S3 Bucket을 람다와 동일한 계정이 아닌 다른 AWS 계정의 것으로 설정하게 되었더니 

"api error PermanentRedirect: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint." 에러가 계속 발생.

 

원인

쭉 찾아보니 코드 위의 region과 버킷의 region이 다르면 발생한다고 함.

 

분석

버킷의 생성된 리전은 아래 빨간 박스 영역에서 확인 가능

그런데 분명 내 코드(정확히는 람다가 돌아가는 위치)도 버킷 위치도 일치하는데 자꾸 저 에러가 나는 것임;;

 

그래서 다시 한 번 봤더니 AWS Configure 해주는 부분에 Region에 대한 설정이 없었음. 명시적으로 표현해주면 좋을 것 같아 코드 수정

func AWSConfigure() BucketBasics {
	staticProvider := credentials.NewStaticCredentialsProvider(
		"AWS_ACCESS_KEY",
		"AWS_SECRET_KEY",
		"")

	sdkConfig, err := config.LoadDefaultConfig(
		context.Background(),
		config.WithCredentialsProvider(staticProvider),
		config.WithRegion("ap-northeast-2"), // 이 부분 추가
	)
	checkErr(err)

	s3Client := s3.NewFromConfig(sdkConfig)
	bucketBasics := BucketBasics{s3Client}

	return bucketBasics
}

 

결과

아주 잘 돌아감. 굿~

 

 

 

2. GitHub Action Secrets를 활용하여 .env 파일 생성하기 (or .env 파일 기능 구현하기?)

내 코드의 특성상 docker image를 굽고 -> 이미지에 태그 달고 -> AWS ECR에 push -> lambda에서 배포 해야 함. 

그런데 이 과정이 너무너무 귀찮고 시간이 정말 많이 들게 됨. 코드 조금만 수정해도 이미지 굽고 push하고,,,

이 과정이 귀찮기도 하고, 다른 팀원들에게 과정을 인수인계하기도 어려울 것 같아 GitHub Action으로 자동화하기로 결정.

 

그런데 가장 큰 고민이 환경변수 관련된 것.

AWS 계정을 두 개 이상 사용해야 하기 때문에, 그리고 그 중 하나는 Access Key와 Secret Key가 코드 안에 들어가야 하기 때문에 반드시 환경변수 설정을 하고 .env 파일을 생성해야 함. 하지만, GitHub 위에 올릴 때는 .env 파일을 올리면 안 되니까,,, 이걸 해결할 줄 몰라서 GitHub Action 자동화를 못하고 일일이 내 로컬에서 코드에 Access Key와 Secret Key 넣고 이미지 굽고 있었음.

 

뭔가 GitHub Action Secrets 처럼 환경 변수를 숨겨서 사용할 수 있는 기능이 없나 계~~~속 찾고 있었음.

그러다가 발견한 혁신적인 방법

 

https://ji5485.github.io/post/2021-06-26/create-env-with-github-actions-secrets/

 

Github Actions에서 Secrets을 통해 env 파일 생성하기

일반적으로 Github에 업로드하지 않는 env 파일을 어떻게 Github Actions에서 생성하고, 환경 변수를 추가할 수 있는지 알아봅시다.

ji5485.github.io

 

.env 파일에 존재하는 환경 변수를 Actions Secret에 넣고, Action이 돌아갈 때 echo를 활용하여 환경 변수 파일이 그 안에서만 생성, 그걸 바탕으로 build하는 방법이 있었던 것임!

 

    - name: Generate Environment Variables File for Production
      run: |
       echo "AWS_BUCKET_ACCESS_KEY=$AWS_BUCKET_ACCESS_KEY" >> .env.production
       echo "AWS_BUCKET_SECRET_KEY=$AWS_BUCKET_SECRET_KEY" >> .env.production
       echo "AWS_BUCKET_NAME=$AWS_BUCKET_BUCKET_NAME" >> .env.production
       echo "AWS_REGION=$AWS_REGION" >> .env.production
      env:
        AWS_BUCKET_ACCESS_KEY: ${{ secrets.AWS_BUCKET_ACCESS_KEY }}
        AWS_BUCKET_SECRET_KEY: ${{ secrets.AWS_BUCKET_SECRET_KEY }}
        AWS_BUCKET_NAME: ${{ secrets.AWS_BUCKET_NAME }}
        AWS_REGION: ${{ secrets.AWS_REGION }}

 

위와 같이 env로 Actions Secret들을 변수에 담아주고, echo하여 .env 파일에 적는 것이다.

참고로 '>'는 동일한 파일명을 가진 파일이 있다면 새로운 파일로 덮어쓰기 하기 때문에 여러 줄을 입력하는데 적합하지 않음. 

동일한 파일명의 파일이 있을 때 아래에 내용을 추가하는 '>>'를 사용해야 한다!

 

secrets는 workflow log에서도 가려져서 나오기 때문에 괜춘!