[AWS] 안전한 환경변수 전달 to ECR + ECS

Falcon·2022년 5월 20일
1

aws

목록 보기
21/35
post-thumbnail

🎯 Goals

  • 환경변수를 AWS 리소스에 안전하게 보관하기위한 서비스 'Parameter Store' 사용방법
  • Parameter Store 에 등록한 환경변수 CLI 로 불러오기
  • dotenv , 컨테이너에서 사용하기

환경변수를 S3 오브젝트에 저장하여 전달할 수도 있지만
Task , Task-Definition 에 평문형태로 노출될 수도 있기 때문에 권장하지 않는다.

1. IAM Role 정책 생성

AWS Console - IAM - 역할 - 인라인 정책 생성

아래와 같이 인라인 정책 설정 후 EC2에 부여한 IAM Role 에 추가하자.

1. inline-policy.json

  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:<region>:<account_id>:parameter/*",
        "arn:aws:secretsmanager:<region>:<account_id>:secret:*",
        "arn:aws:kms:<region>:<account_id>:key/*"
      ]
    }
  ]
}

ECS 컨테이너 인스턴스로 등록할 EC2에 필요한 IAM Role 은 다음과 같다.

2. Trust Relationship (신뢰 관계)

IAM - Role - Trust Relationship 에서 다음과 같이 ECS-Task 신뢰정책을 추가해야한다.

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "ec2.amazonaws.com"
			},
			"Action": "sts:AssumeRole"
		},
		{
			"Sid": "",
			"Effect": "Allow",
			"Principal": {
              // ✅ 필수
				"Service": "ecs-tasks.amazonaws.com"
			},
          // sts: Security Token Service
          // Attached Role 리소스에 접근할 수 있는 임시 토큰 값을 받는다.
			"Action": "sts:AssumeRole"
		}
	]
}

정책 Resource - Action 이 권한의 '대상'이라면
Trust Relationship 의 Principal - Service 는 대상에 접근할 수 있는 '주체'다.
👉🏻 EC2 와 ECS Task 서비스에게 1. inline-policy 에서 정의한 Role 의 권한(키값 받아오기,복호화 등)을 갖게한다.

2. 파라미터 스토어 파라미터 생성

끝났다.

CLI에서 파라미터 불러오기

정말 쉽게 등록한 파라미터 값을 불러 올 수 있다.

# aws ssm get-parameter --name [파라미터 경로/이름]
$ aws ssm get-parameter /test/PASSWD
{
    "Parameter": {
        "Name": "/test/PASSWD",
        "Type": "SecureString",
      // 🔒 암호화된 값
        "Value": "AQICAHjO+oxHYVYYQfE/5Jd//8xKbBm7GrWjm5p~~<...>",
        "Version": 1,
        "LastModifiedDate": "2022-05-20T20:24:34.445000+09:00",
        "ARN": "arn:aws:ssm:<region>:<account_id>:parameter/test/PASSWD",
        "DataType": "text"
    }
}
# 복호화된 체로 불러오기
# aws ssm get-parameter --name [파라미터 경로/이름] -- with-decryption
$ aws ssm get-parameter /test/PASSWD --with-decryption
{
    "Parameter": {
        "Name": "/test/PASSWD",
        "Type": "SecureString",
      // 🔓 복호화된 값
        "Value": "jonna gin password kimori",
        "Version": 1,
        "LastModifiedDate": "2022-05-20T20:24:34.445000+09:00",
        "ARN": "arn:aws:ssm:<region>:<account_id>:parameter/test/PASSWD",
        "DataType": "text"
    }
}

ECS Container 에서 키값 불러오기

중요: 민감한 데이터는 컨테이너가 처음 시작될 때 컨테이너에 삽입됩니다. 보안 또는 Parameter Store 파라미터가 업데이트되거나 순환되면 컨테이너는 업데이트된 값을 자동으로 수신하지 못합니다. 새 태스크를 시작해야 합니다. - AWS Document

🤔 대체 어디에 환경변수가 주입되는가?

⚠️ EC2 Instance 가 아니라 'Container' (Task) 에 주입된다.

컨테이너를 실행시켜 확인해보자

# 우선 EC2 인스턴스에 접속한다.
$ ssh -i [Host-IP]
# 실행중인 컨테이너 목록 확인
$ docker ps
# bash shell 로 접속
$ docker exec -it [실행중인 컨테이너 아이디] /bin/bash
$ echo $PASSWD
--print: jonna gin password kimori

🔗 Reference

profile
I'm still hungry

0개의 댓글