目录
1. 迁移EC2的凭证
关于如何获取临时token可以参考:关于AWS IAM Role如何配置临时token访问S3 小结。
1) 假设我们目前有一台EC2并且赋予了IAM role(CloudWatchAgentServerRole)。
2) 连接上这台EC2之后输入:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/CloudWatchAgentServerRole
3) 打开到本地用户目录的credentials文件,加上temp_user这个profile。
aws_access_key_id = ASIA6ALYQ71TOA1CDPOZ
aws_secret_access_key = C/tRDDImnkcQp1Q0SBd1onzMqxtxd4cEFIGsLk8F
aws_session_token = IQoJb3JpZ2luX2VjEKL//1EaCXVzLXdlc3QtMSJHMEUCIQDdSNNMU/tLIDz7Dz7F4maySiga2Ucm/ug4wOyu3+tI9AIgI6BWayNRXHeodAr5Bqlb91ovPHGlqY8y3mBtphk/DHkq0gQIKxAAGgw5NjI4NjIzMTcwOTQiDHWJCyxkOdhoeoVnyCqvBIsbsJFmbfFBsSGJVZUsAjYh2HOTCLWz08mf3Uzkt0v668ARf8ffqk5QawZ/ndGcQWgkl2gUMJlDhpMsI7S9bTeeMDBR56bcYeYMHGKky6o/g+fcUYKBcvy67m6a1GrA0fC7U+cZFJgJGLyp608yWvoXAuhmb/jis1H/yoSTkSxmj4xPtuhtmboRnyHglhRXp6fcE5/DF1y/ob3DPNdIuqK9UA1yPRrC3DBuCYtwudB2IcrLXrmMucGC3ci7E0ZUgqNb/uE7B103V8Kb9hLqOWDaeeGaE7ZOaqRhJCWs2bbih56F1XGjowb9XH3CcSEcpwO/myieFiO9l+kOQz4mO96KyxcguBvsHPUTiSb7dhTaFwFuqSSrGcYUwbaStV24K26ccRiiuY1sxW1A7JIyPQFC9W5+k8+xvuDfkM9UeeKrLO6MMXsiOHSTcFQqWFLQN23jxV2Bcim1G4wL8mP3n+SOv6L+XW88OP+EqtFegM4hu5sBtbY9EGNAZnnuO09FjaZw7DOaUlRIr3pIH2e6Z2JvAlX3pOQ7uNd5Vco6aSw3Ix+89CfZig6znnRRU54weKk0O1BhZpgVU0Ov+Kyu61Ew1/uz0J6othLxzGAhSX5pvYxHM+o2CRLNC9GJQzCPoDNntOQYMwjKihQsb666hRJPaJ92oi6DIG8vilj1/Ap1KF/WP9PQZnXaLs3cQtf4gFVsdZQwuT86cdyC8WoFWxg7qv17YAQhiEqHTZ6ivMww5Z6ymAY6qQFeEOfmXCIe3Lzr+PLfVGn67GGgbr8/AL2Va+G+rOojRCUDR1tdOz/tmeakA48/xgM+Fmh5Z8sXsqLkS5IzL2a1mZapVcoewpV4dzm4NmLIuF04VcFDTZcEiKo/J/2pOWaPO9ijh8X7b+3zXa//Q21mL04UEbkYWzmhFF4XaPdEJAvyZT4azCJrEUYgDCvg+rUc1T2xZCmGweKzwo5AW1ucjHe894VbGJ4L
值得注意的是这里多了个aws_session_token。
4) 查看S3。
2. 设计IAM密钥
虽然通过第1步可以获取到临时的凭证,但这并不是aws推荐的最佳实践,而是通过sts assume role的方式,通过代码方式切换IAM role可以参考:关于应用程序中使用STS切换IAM角色。
以下通过aws cli方式对STS assume role进行测试。
2.1 配置IAM account
1) 创建IAM account(bas-developer)。
2) 把上一步创建account得到的new_user_credentials设置到本地用户目录的Credentials文件中。
3) cli访问S3,可以看到目前是被拒绝的。
2.2 配置IAM role
1) 创建IAM role(DeveloperRole)。
2.3 配置内联策略
1) 创建内联策略,注意是在账户bas-developer下创建。然后选择STS,并且资源这里我们要选择特定,意思是允许账户bas-developer承担这个角色。
2) 输入:
aws sts assume-role --role-arn arn:aws:iam::962812317094:role/DeveloperRole --role-session-name bas-developer --profile developer
然后复制更新到Credentials(别忘了aws_session_token也要复制进去,因为时临时凭据),就可以访问S3了。
3. 自动化获取临时凭证
经过上一步的操作,可能就会觉得每次需要手动更新Credentials文件很麻烦,所以下面总结一下自动更新Credentials文件的方法。
1) 更新Credentials(注意去掉aws_session_token):
[developer]
aws_access_key_id = AKIA1ALYQ8YTMHVTMWWQ
aws_secret_access_key = uAJ1qGVwJkR3I2n1XDucUoUqOsWatB5j+d4BRbpp
[automate_developer]
role_arn = arn:aws:iam::962812317094:role/DeveloperRole
source_profile = developer
2) cli输入:
aws sts assume-role --role-arn arn:aws:iam::962812317094:role/DeveloperRole --role-session-name bas-developer --profile developer
aws s3 ls --profile automate_developer
经过automate_developer这个profile,下次assume role就不需要手动再去更新Credentials了。
附:
1. 如果遇到An error occurred (AccessDenied) when calling the AssumeRole operation: User:xxx is not authorized to perform: sts:AssumeRole on resource,看看创建的内联策略是不是放在role下面了,应该创建在account下面,并指定principal为role的arn。
2. 如果遇到An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records,应该是更新Credentials文件的时候漏了更新aws_session_token。
3. 如果遇到An error occurred (InvalidClientTokenId) when calling the AssumeRole operation: The security token included in the request is invalid,Credentials去掉aws_session_token。