やりたいこと
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...
以上。