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/
.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에서도 가려져서 나오기 때문에 괜춘!
'프로젝트 일지 > BMT' 카테고리의 다른 글
6. Go를 이용한 스크래퍼 리팩토링하기 (2) - goquery, Goroutine, sync.WaitGroup (0) | 2023.08.09 |
---|---|
5. Go를 이용한 스크래퍼 리팩토링하기 (1) - Introduction, 그런데 goquery, S3 Upload, Lambda 활용 코드를 곁들인 (0) | 2023.08.08 |
2. 파이썬 크롤링 코드 AWS Lambda에 올리고 결과물 S3에 업로드하기 - Lambda, IAM, S3 편 (1) | 2023.05.07 |
4. 파이썬 크롤링 코드에 Process, Pipe 적용하기 (0) | 2023.04.07 |
3. 크롤링 코드에 멀티프로세싱 적용하기 (Feat. AWS Lambda & Pool) (0) | 2023.04.03 |