(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【AWS】LambdaでEC2にRole/InstanceProfileを付与する

スポンサーリンク

やりたいこと

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...

以上。