SAML ProviderのメタデータをLambdaで更新する

年始にSAML Providerのメタデータを更新できるようにするって会社で言ったのに放置して忘れてました。
カシマです。

結果、やり方とか思い出せずに大惨事になりました(白目)

というわけで軽く書いていくのですが、こういうのあると便利だよねっていうお話です。

概要

AssumeRoleの知識がある前提で書きますので、AssumeRoleが何という方は以下のAWS資料をご参考に閲覧ください。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-function-assume-iam-role/

コードも掲載されているのですが、ややパクっています。

import boto3
import os

def lambda_handler(event, context):

    # AccountList
    print("AccountList")
    print(os.environ["AccountList"])

    # All Account List
    AccountList = os.environ["AccountList"].split(",")

    # Get federationmetadate.xml
    print("Get federationmetadate.xml")
    S3Client = boto3.client('s3')
    S3Object = S3Client.get_object(
        Bucket='adfs-metadata',
        Key='federationmetadata.xml'
    )
    S3ObjectResponse = S3Object["Body"].read()
    S3ObjectRaw = S3ObjectResponse.decode(encoding='utf-8')

    for AccountNo in AccountList:
        # Children AWS Account (IAM Role)
        print("[start]: This process update " + AccountNo + "'s metadate")
        STSClient = boto3.client('sts')
        acct_b = STSClient.assume_role(
            RoleArn="arn:aws:iam::" + AccountNo + ":role/ADFSRole",
            RoleSessionName="MetadataUpdate",
            ExternalId="XXXXXX"
        )

        ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
        SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
        SESSION_TOKEN = acct_b['Credentials']['SessionToken']

        # Get SAML Lists
        print("Get SAML Lists")
        IAMClient = boto3.client('iam')
        SAMLLists = IAMClient.list_saml_providers()

        # Update SAML Provider
        print("Target SAML Provider: " + SAMLLists["SAMLProviderList"][0]["Arn"])
        IAMClient.update_saml_provider(
            SAMLMetadataDocument = S3ObjectRaw,
            SAMLProviderArn = SAMLLists["SAMLProviderList"][0]["Arn"]
        )
        print("[end]: This process updated " + AccountNo + "'s metadate")

あと必要になるのはアカウント分だけループをぶん回すという作業です。
できた。環境変数のAccountListにはカンマ区切りでひたすらアカウントの情報をリストアップしてあげてください。
自動トリガーにしたい場合はS3にデータがアップロードされたら実施されるようにして良いと思いますが、まだそこまでの動作確認はできていないため来年チェックします。
処理自体は全部で3秒程度で終わるため15分あれば60アカウントぐらいなら耐えられるはずです。
ダメだった場合は処理を分けたり、並列処理にするなどもうちょっと工夫が必要ですね。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

%d人のブロガーが「いいね」をつけました。