開発環境のEC2にIAM Roleをアタッチし、AWS CLIを使用できる様にする
目的
開発環境として使用しているEC2でIAM RoleのアタッチによりAWS CLIを使用できる様にする。
背景
開発環境としてEC2を利用しているが、EC2にログインした後、AWS Cliのcredentialsを設定する必要があった。その際IAMを設定を設定することで、credentialsの漏洩事故のリスクをなくすことができる為
具体的方法
今回はローカルマシン(EC2への接続元)からAWS CLIにてIAMを作成します。(ローカルマシンにセキュリティリスクが残りますが、作業完了後にCredential情報を削除予定です)
インスタンスプロファイルを作成する
aws iam create-instance-profile --instance-profile-name ec2_profile
インスタンスプロファイルとは
EC2が自分自身にアタッチされるIAM roleを引き受ける場所。EC2がIam roleを引き受ける際に使用する。
使用するIam roleにアタッチするpolicyを決める
Iam roleを作成するために、roleにアタッチするpolicyを探します。AWS管理ポリシーの中に、使えそうなものがないか探します。今回は全てのリソースにアクセスしたいので全リソースにアクセスできそうなpolicyを探します。名前にAdministratorが含まれているものの中から該当するものがないか探します。
aws iam list-policies --query Policies[].PolicyName | grep Administrator
"AWSSSODirectoryAdministrator",
"DatabaseAdministrator",
"AWSSSOMasterAccountAdministrator",
"AWSCloud9Administrator",
"AWSSSOMemberAccountAdministrator",
"SystemAdministrator",
"AdministratorAccess",
"AmazonAPIGatewayAdministrator",
"AWSAppSyncAdministrator",
"NetworkAdministrator",
"AdministratorAccess-Amplify",
"AdministratorAccess-AWSElasticBeanstalk",
"AWSAuditManagerAdministratorAccess",
"AWSGrafanaAccountAdministrator",
AdministratorAccess
というpolicyが使えそうな気がします。内容を確認すると全リソースに対してfull accessを持っているとあるため、このpolicyを使用します。
aws iam get-policy --policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==`AdministratorAccess`].Arn' --output text)
{
"Policy": {
"PolicyName": "AdministratorAccess",
"PolicyId": "ANPAIWMBCKSKIEE64ZLYK",
"Arn": "arn:aws:iam::aws:policy/AdministratorAccess",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 1,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"Description": "Provides full access to AWS services and resources.",
"CreateDate": "2015-02-06T18:39:46+00:00",
"UpdateDate": "2015-02-06T18:39:46+00:00"
}
}
assume role policyファイルを作成する。
iam roleは AWSのリソースに権限を付与するものとなります。従って主語であるAWSリソースを指定することが必要となります。今回はEC2にAdminの権限を付与するため、以下の様に設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
iam roleを作成する
aws iam create-role --role-name ec2_for_aws_cli --assume-role-policy-document file://ec2_role_policy.json
{
"Role": {
"Path": "/",
"RoleName": "ec2_for_aws_cli",
"RoleId": "AROA3JOKV5PCJZLFS22QU",
"Arn": "arn:aws:iam::776203529156:role/ec2_for_aws_cli",
"CreateDate": "2022-04-03T15:11:05+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
}
}
作成したiam roleにiam policyをアタッチする
aws iam attach-role-policy \
--role-name ec2_for_aws_cli \
--policy-arn $(aws iam list-policies --query 'Policies[?PolicyName==`AdministratorAccess`].Arn' --output text)
インスタンスプロファイルにロールをアタッチする
aws iam add-role-to-instance-profile --instance-profile-name ec2_profile --role-name ec2_for_aws_cli
インスタンスプロファイルをEC2インスタンスにアタッチする
aws ec2 associate-iam-instance-profile --iam-instance-profile Name=ec2_profile --instance-id i-0c6ea430a2b8a49ba
EC2からAWS CLIが使用できる様になったか確認する
EC2にログインし以下のコマンドを打ちます。
確かにアタッチしたポリシーがstsによってassume roleされており、全てのリソースにアクセスできる様になっています。
[ec2-user@ip-10-0-1-187 ~]$ aws sts get-caller-identity
{
"Account": "776203529156",
"UserId": "AROA3JOKV5PCJZLFS22QU:i-0c6ea430a2b8a49ba",
"Arn": "arn:aws:sts::776203529156:assumed-role/ec2_for_aws_cli/i-0c6ea430a2b8a49ba"
}
これでcredential情報を保存することなく、EC2でAWS CLIが使用できる様になりました。
参考文献
Discussion