AWS 노트

역할(Role) 없이 움직이던 EC2인스턴스에 새로 만든 역할 연계하기 (aws cli 사용)

Jonchann 2022. 3. 16. 19:35

전제조건: 기존에 사용하던 EC2인스턴스는 CDK로 만들어져 있지 않음.

 

AWS console에서 직접 버튼 누르면서 만들 수도 있으나 권한이 없는 경우 상사(들이 권한을 갖기 때문)에게 부탁할 일이 생긴다. 마냥 알아서 만들어 주세요 하면 시간 없는 상사들은 굉장히 귀찮아할 수도 있기 때문에 가급적이면 스크립트를 작성해서 넘기는 편이다.
때문에 이번에는 aws cli만을 이용했다.
참고 document: https://aws.amazon.com/jp/blogs/news/new-attach-an-aws-iam-role-to-an-existing-amazon-ec2-instance-by-using-the-aws-cli/

 

예를 들어, 기존에 사용하던 EC2가 S3에 파일을 생성/수정/삭제/읽어오기 등의 처리를 수행해야 한다고 하자.
(shell언어는 아직 모르는 것이 많아서 더 좋은 command가 있을 수 있다)

 

정책(policy) 작성

$ echo '
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": "arn:aws:s3:::my-bucket"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
        }
    ]
}
' > /tmp/SearchEsAccessToS3.json
$ aws iam create-policy --policy-name EC2AccessToS3Policy --policy-document file:///tmp/EC2AccessToS3Policy.json --profile mfa-production

 

역할(role) 작성

$ echo '
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Principal": {
            "Service": "ec2.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
    }
}
' > /tmp/EC2AccessToS3Role.json
$ aws iam create-role --role-name EC2AccessS3Role --assume-role-policy-document file:///tmp/EC2AccessToS3Role.json --profile mfa-production

 

instance profile 작성

$ aws iam create-instance-profile --instance-profile-name EC2AccessToS3RoleInstanceProfile --profile mfa-production

 

정책을 역할에 attach

$ account_id=`aws sts get-caller-identity --query 'Account' --profile mfa-production`
$ aws iam attach-role-policy --role-name EC2AccessToS3Role --p
olicy-arn arn:aws:iam::${account_id:1:-1}:policy/EC2AccessS3Policy --profile mfa-production

 

EC2 인스턴스에 역할 연계

$ aws iam add-role-to-instance-profile --role-name EC2AccessToS3Role --instance-profile-name EC2AccessToS3RoleInstanceProfile --profile mfa-production

# 역할을 연계해야 하는 EC2 인스턴스가 한대일 경우
# Name tag가 붙어있을 경우
$ instance_id=`aws ec2 describe-instances --filters "Name=tag:Name,Values=my-instance-001" --query 'Reservations[].Instances[].[InstanceId][0][0]' --profile mfa-production`
# query로 취득한 값에서 큰 따음표 제거
$ aws ec2 associate-iam-instance-profile --instance-id ${instance_id:1:-1} --iam-instance-profile Name=EC2AccessToS3RoleInstanceProfile --profile mfa-production

# 역할을 연계해야 하는 EC2 인스턴스가 여러대일 경우
$ for i in {01..10}; do
instance_id=`aws ec2 describe-instances --filters "Name=tag:Name,Values=my-instance-0$i" --query 'Reservations[].Instances[].[InstanceId][0][0]' --profile mfa-production`
aws ec2 associate-iam-instance-profile --instance-id ${instance_id:1:-1} --iam-instance-profile Name=EC2AccessToS3RoleInstanceProfile --profile mfa-production
done

 

다만 제일 좋은 방법은 처음부터 CDK로 구축하는 것이다.