안녕하세요?
곰군입니다.
오랜만에 클라우드 카테고리에 글을 쓰네요.
도커에서 데이터베이스 계정 정보 같은 프라이빗한 정보들을 어떻게 관리하는지에 대한 질문을 보고,
환경변수에 대해 정리를 하고자 합니다.
실행 시 환경변수를 직접 주입하거나 파일로 주입하는 방법입니다.
잘 정리해놓으신 글이 있어서 퍼왔습니다.
https://imjeongwoo.tistory.com/118
[Docker] 컨테이너 시작 환경을 지정하기
컨테이너의 환경변수, 작업 디렉토리 등을 지정하여 생성/실행 docker run [환경설정 옵션] 이미지명[:태그][인수] 옵션 설명 --env=[환경변수], -e 환경변수 설정 --env-file=[파일명] 환경변수를 파일로
imjeongwoo.tistory.com
실행 코드
docker run [환경설정 옵션] 이미지명[:태그][인수]
션 설명
--env=[환경변수], -e 환경변수 설정
--env-file=[파일명] 환경변수를 파일로부터 설정
1-1. -e 옵션을 이용하여 도커 컨테이너 실행 시에 아규먼트로 환경변수 주입(docker run --env옵션)
[user@localhost ~]$ docker run -it -e TEST1=Hello -e TEST2=World --rm centos:latest
[root@aed51cb6343c /]# echo $TEST1
Hello
[root@aed51cb6343c /]# echo $TEST2
World
1-2. 파일로 환경변수 주입(docker run --env-file옵션)
[user@localhost ~]$ cat > env_file
TEST1=Hello
TEST2=World
TEST3=Merong
[user@localhost ~]$ docker run -it --env-file env_file --rm centos:latest
[root@a57793a9cfdd /]# echo $TEST1 $TEST2 $TEST3
Hello World Merong
정답은 테스트정의에서 설정해주면 됩니다.
데스크 정의를 보시면 상기 이미지와 같이 Container definitions 항목이 보입니다.
컨테이너 정의를 누르고 설정을 하실 때 환경변수를 입력하거나 파일위치를 지정할 수 있습니다.
구체적으로 어떻게 정의하면 되는지는 하기 링크를 참조하시면 됩니다.
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/taskdef-envfiles.html
환경 변수 지정 - Amazon Elastic Container Service
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
상기 링크에서 안내해주는 2가지 방법입니다.
environment 컨테이너 정의 파라미터를 개별적으로 사용합니다. 이것은 docker run에 대한 --env 옵션에 매핑됩니다.
대량으로 environmentFiles 컨테이너 정의 파라미터를 사용하여 환경 변수를 포함하는 하나 이상의 파일을 나열합니다. 파일은 Amazon S3에서 호스팅되어야 합니다. 이것은 docker run에 대한 --env-file 옵션에 매핑됩니다.
많이 본 것 같으시다면 맞습니다.
1번 도커에서 환경변수 설정하기의 내용과 거의 같습니다.
2-1 . ecs에서 개별 환경변수 지정하기
environment 컨테이너 정의 파라미터를 개별적으로 사용합니다. 이것은 docker run에 대한 --env 옵션에 매핑됩니다. 이 내용은 위에 1-1번에서 -e 옵션을 이용하여 도커 컨테이너 실행 시에 아규먼트로 환경변수 주입(docker run --env옵션)과 같은 내용입니다.
하기와 같이 작성하시면 됩니다.
{
"family": "",
"containerDefinitions": [
{
"name": "",
"image": "",
...
"environment": [
{
"name": "variable",
"value": "value"
}
],
...
}
],
...
}
2-2 . ecs에서 환경변수 파일 지정하기
대량으로 environmentFiles 컨테이너 정의 파라미터를 사용하여 환경 변수를 포함하는 하나 이상의 파일을 나열합니다. 파일은 Amazon S3에서 호스팅되어야 합니다. 이것은 docker run에 대한 --env-file 옵션에 매핑됩니다.
이것은 위의 1-2번 파일로 환경변수 주입(docker run --env-file옵션)과 같은 내용입니다.
하기와 같이 작성하시면 됩니다.
{
"family": "",
"containerDefinitions": [
{
"name": "",
"image": "",
...
"environmentFiles": [
{
"value": "arn:aws:s3:::s3_bucket_name/envfile_object_name.env",
"type": "s3"
}
],
...
}
],
...
}
쉽게 설명했지만 파일 지정하기 위해서는 사전 작업 및 검토해야할 사항이 있습니다.
내용 정리해보겠습니다.
환경변수 파일을 저장할 S3버켓을 사전 생성하고 환경변수 파일을 위치시켜놔야 합니다.
파일은 .env 파일 확장명과 UTF-8 인코딩을 사용해야 합니다.
Amazon ECS 태스크 실행 IAM 역할 - Amazon Elastic Container Service
GetAuthorizationToken API 호출이 태스크의 탄력적 네트워크 인터페이스가 아닌 AWS Fargate 소유의 탄력적 네트워크 인터페이스를 통과하므로 ecr:GetAuthorizationToken API 작업에 aws:sourceVpc 또는 aws:sourceVpce
docs.aws.amazon.com
3-2. 런타임시 -e 옵션으로 환경변수를 제공하는 경우
docker inspect등으로 평문으로 전송한 환경변수가 노출될 수 있어서 보안 위험이 존재합니다.
ecs의 경우 "태스크 정의에 지정된 환경 변수는 태스크 정의에 대해 DescribeTaskDefinition 작업이 허용된 모든 IAM 사용자 및 역할에서 읽을 수 있습니다." 라고 안내하고 있습니다.
3-3. env파일을 활용하는 경우
봇넷들, 노출된 ENV 파일을 찾기 위해 은밀한 대규모 스캔 작전 실행해
Botnets have been silently mass-scanning the internet for unsecured ENV files 공격자들이 지난 2~3년 동안 인터넷에 실수로 업로드되어 웹 서버에 노출된 ENV 파일을 탐색하는 대규모 스캔을 진행해온 것으로..
blog.alyac.co.kr
많은 해커들이 노출된 env파일을 노리고 있기 때문에 파일로 환경변수를 관리하는 경우 버킷엑세스에 대한 관리를 철저히 해야 합니다.
3-4. aws의 권장사항
민감한 데이터는 AWS Secrets Manager 암호 또는 AWS Systems Manager 파라미터 스토어 파라미터에 저장하는 것이 좋습니다. 자세한 정보는 민감한 데이터 지정을 참조하십시오.
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/specifying-sensitive-data.html
민감한 데이터 지정 - Amazon Elastic Container Service
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
이상 오랜만에 작성한 기술 글이었습니다.
읽어주셔서 감사합니다.
위 내용과 동일한 고민을 며칠동안 하고 있었는데 어느정도 해소가 되는 내용이네요. 감사합니다.