환경변수를 S3 오브젝트에 저장하여 전달할 수도 있지만
Task , Task-Definition 에 평문형태로 노출될 수도 있기 때문에 권장하지 않는다.
AWS Console - IAM - 역할 - 인라인 정책 생성
아래와 같이 인라인 정책 설정 후 EC2에 부여한 IAM Role 에 추가하자.
"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 은 다음과 같다.
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 의 권한(키값 받아오기,복호화 등)을 갖게한다.
끝났다.
정말 쉽게 등록한 파라미터 값을 불러 올 수 있다.
# 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"
}
}
중요: 민감한 데이터는 컨테이너가 처음 시작될 때 컨테이너에 삽입됩니다. 보안 또는 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