aws configure
명령을 통해 해당 Access key를 등록하고, Python SDK인 Boto3의 경우에는 특정 서비스에 대한 Client나 Resource 객체를 생성할 때 코드에 참조시켜준다.유출의 위험
이다. 실수로 코드에 하드코딩을 해놓는다거나, 별도의 파일에 잘 보관해두었는데 git push 할 때 github에 그대로 올라간다거나 할 때는 해당 Key가 그대로 노출되어 다른 사람이 나의 AWS 리소스에 대한 자유로운 접근 권한이 생기게 된다. 물론 github이나 aws 내부적으로 이러한 경우에 Key를 사용할 수 없게 만든다거나, 즉시 알림을 준다거나하는 안전장치들이 있지만 100% 의 안전성을 보장해주지는 못한다.Assume Role
이다. 이는 유저가 A 리소스에 대한 접근 권한이 없더라도 A 리소스 접근 Policy를 사용할 수 있는 임시 Token을 받아 특정 시간동안만 해당 권한을 행사할 수 있도록 하는 것이다. STSassumeRoleFullAccess
Policy 하나만 등록해준다.User > Security credentials > Access keys
탭에서 해당 유저에 대한 Access key를 생성해준다.S3에 대한 Full Access 정책을 가진 Role을 생성해준다.
aws configure
명령을 통해 위에서 생성한 Access key를 등록해준다.> aws configure
AWS Access Key ID [****************ZP4G]:
AWS Secret Access Key [****************Jb0N]:
Default region name [ap-northeast-2]:
Default output format [None]:
STSassumeRoleFullAccess
밖에 없기 때문에 S3 버킷 리스트를 조회하는 aws s3 ls
명령을 치면 아래와 같이 권한이 없다는 메세지가 나온다.> aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
assumeS3Full
역할에 대한 임시 권한을 획득한다.aws sts assume-role \
--role-arn arn:aws:iam::1234567842:role/assumeS3Full \ # assumeS3Full Role에 대한 ARN
--role-session-name tempSession \ # assume role 이름
--duration-seconds 1000 \ # 유효 기간
assumeS3Full
Role을 사용할 수 있다.{
"Credentials": {
"AccessKeyId": "ASIAWQNYUB2T2HP5QUQA",
"SecretAccessKey": "Rc7hmKiO2bwvVMiVxUTJPySf5EcchIxS+nD4hsd2",
"SessionToken": "IQoJb3JpZ2luX2VjEIb//////////wEaDmFwLW5vcnRoZWFzdC0yIkcwRQIhAMDTXbJAYwP/T3QQRznAIAJ3cp78+S0rlMCXjdSAhKQ9AiBuZ8j+Ul5S78V3+9Dp9aoLPlKIdMQTLZ+hnNjmEn3I5SqYAghfEAEaDDQ0NzYwMDY2MDEzNSIMP94euOVuqYCJc162KvUB1SblMSvQt80kexKM8Z0rs/ZBOBpNPei26/2eyW40a0AYchbK2bdx7bQzbOrIMAOuyFX1qEY8Udp7irJ8MehqBd0MQ9L1aYTAZai2llkL/MHJmW1s2I12FGerJpjiwm1a1hM+FlJLvLAsvmXGRbrCYbNePiTHdqFhBSjl6m0Xc+dtKm9cFJ8i65GXe7Kq2dMW1pkEEr6cJDJzY5h+fswPfTzBub02RxhS9tGPO1gkeOFCFoAEG79GLl+9bW+Q3mm15iRt10widUQZFP/FAUxrWg7rmjCcnl+fh7tny7ReOQDoVQFIn6Pc86xLFCPnEiThoQzCWNowu9CorgY6nQGw6fjADladfRkr620wyTDGz1ZDsJLh6j64+CEvgprN374bNt8nw5mc6azRxKGtOfvuRrSeCpKlJqsxFfCSHFbVFcU5n+S5eaqfiD/mnxLEreuZDd3AadKItXX9GCdITWNGQNjkYg9PZORR5bV9jTJGVWnOze4NlfgI+AfJHBIuLvFd8qLkQS/O2aRDttxnRlljdraSQq+4MTTVLyuA",
"Expiration": "2024-02-12T14:33:07+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROAWQNYUB2TZNTIFO6PO:tempSession",
"Arn": "arn:aws:sts::1234567842:assumed-role/assumeS3Full/tempSession"
}
}
aws configure set --profile s3 aws_access_key_id [AccessKeyId]
aws configure set --profile s3 aws_secret_access_key [SecretAccessKey]
aws configure set --profile s3 aws_session_token [SessionToken]
> aws s3 ls --profile s3
2023-07-18 06:16:53 aws-athena-query-results-xxxxxxxxxxx
2023-03-20 23:38:26 aws-cloudtrail-logs-xxxxxxxxxxx
2023-11-30 14:12:57 aws-glue-assets-xxxxxxxxxxx
2023-06-05 00:47:42 cdk-hnb659fds-assets-xxxxxxxxxxx
2022-06-11 09:28:22 cdktoolkit-stagingbucket-xxxxxxxxxxx
2021-04-25 07:53:24 cf-templates-1low35rftz23v-xxxxxxxxxxx
import boto3
from pytz import timezone
# 함수 선언
def assume_role(
role_arn, # 권한을 받으려는 Role에 대한 ARN
role_session_name="TestRole", # assume role 이름
duration_seconds=1000 # 유효기간
):
sts_client = boto3.client('sts', region_name='ap-northeast-2')
response = sts_client.assume_role(
RoleArn=role_arn,
RoleSessionName=role_session_name,
DurationSeconds=duration_seconds,
)
credentials = response['Credentials']
return {
'AccessKeyId': credentials['AccessKeyId'],
'SecretAccessKey': credentials['SecretAccessKey'],
'SessionToken': credentials['SessionToken'],
'Expiration': credentials['Expiration'].astimezone(timezone('Asia/Seoul')).strftime("%Y.%m.%d, %H:%M:%S")
}
# 변수 선언
role_arn = "arn:aws:iam::1234567842:role/assumeS3Full"
role_name = "tempSession"
role_time = 1000
# 함수 실행
tempCred = assume_role(role_arn, role_name, role_time)
import subprocess
# 함수 선언
def configure_aws_profile(profile_name, access_key_id, secret_access_key, session_token):
key_type = ['aws_access_key_id', 'aws_secret_access_key', 'aws_session_token']
temp_key_list = [access_key_id, secret_access_key, session_token]
[subprocess.run(['aws', 'configure', 'set', '--profile', profile_name, key_type[i], temp_key_list[i]]) for i in range(3)]
print(f"AWS profile '{profile_name}' configured successfully.")
# 변수 선언
profile_name = "s3"
access_key_id = tempCred["AccessKeyId"]
secret_access_key = tempCred["SecretAccessKey"]
session_token = tempCred["SessionToken"]
region = "ap-northeast-2"
# 함수 실행
configure_aws_profile(profile_name, access_key_id, secret_access_key, session_token)
aws s3 ls --profile s3
import boto3
# 함수 선언
def list_s3_buckets(access_key_id, secret_access_key, session_token, region):
# boto3 클라이언트 생성
s3_client = boto3.client('s3',
aws_access_key_id=access_key_id,
aws_secret_access_key=secret_access_key,
aws_session_token=session_token,
region_name=region
)
# 버킷 목록을 저장할 리스트 생성
bucket_list = []
# 버킷 목록 가져오기
try:
response = s3_client.list_buckets()
# 가져온 버킷 목록 처리
if 'Buckets' in response:
for bucket in response['Buckets']:
bucket_list.append(bucket['Name'])
else:
print("No buckets found")
except Exception as e:
print(f"An error occurred: {e}")
return bucket_list
# 변수 선언
access_key_id = tempCred["AccessKeyId"]
secret_access_key = tempCred["SecretAccessKey"]
session_token = tempCred["SessionToken"]
region = "ap-northeast-2"
# 함수 실행
list_s3_buckets(access_key_id, secret_access_key, session_token, region)
aws cli
와 python boto3
두 가지 방법으로 다뤄보았다.