開発環境の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が使用できる様になりました。

参考文献

https://aws.amazon.com/jp/premiumsupport/knowledge-center/attach-replace-ec2-instance-profile/

https://awsjp.com/AWS/glossary/instance_profile.html