やりたいこと
Lambdaを利用してEC2に特定のRoleを付与する。
尚、言語はPythonとした上でAWSリソースをPython から操作するためのライブラリであるboto3を利用する。
環境情報
aws --version aws-cli/1.19.112 Python/2.7.18 Linux/4.14.322-244.536.amzn2.x86_64 botocore/1.20.112
やり方
「ec2.associate_iam_instance_profile」を利用する。
Cloud Trialのイベントを引数にした場合の具体的なコードは以下。
import boto3, json def lambda_handler(event, content): instanceId = event['detail']['responseElements']['instancesSet']['items'][0]['instanceId'] ec2 = boto3.client('ec2') ec2.associate_iam_instance_profile( IamInstanceProfile={ 'Arn': 'arn:aws:iam::xx:instance-profile/yy', 'Name': 'yy' }, InstanceId=instanceId ) return { 'statusCode': 200, 'body': json.dumps('Excuted!') }
実行に成功するとCloudTrailのEvent history(Event name/AssociateIamInstanceProfile)にてstatusが「associating」となる。
"responseElements": {
"AssociateIamInstanceProfileResponse": {
"xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
"requestId": "...",
"iamInstanceProfileAssociation": {
"instanceId": "...",
"state": "associating",
...以下、補足です。
補足
EC2に権限を渡す際はIAMポリシーがアタッチされているIAMロールを作成した上で同IAMロールをEC2に付与します。
一方でEC2から見るとRoleは「インスタンスプロファイル」として内部で管理されています。下記コマンドで確認ができ、名称はロールと同じです。
$ aws ec2 describe-instances --query "Reservations[].Instances[].IamInstanceProfile.Arn"
[
"arn:aws:iam::xx:instance-profile/yy"
]LambdaでEC2にRoleを付与する場合もインスタンスプロファイル(InstanceProfile)として記述する必要があり、上記を
ec2.associate_iam_instance_profile(
IamInstanceProfile={
'Arn': 'arn:aws:iam::xx:role/yy',
'Name': 'yy'
},と記載すると以下のようなエラーとなります。
[ERROR] ClientError: An error occurred (InvalidParameterValue) when calling the AssociateIamInstanceProfile operation: Value (arn:aws:iam::xx:role/yy) for parameter iamInstanceProfile.arn is invalid. Invalid IAM Instance Profile ARN...
以上。