ようへいの日々精進XP

よかろうもん

ラムダこりゃ外伝 - Lambda ファンクションから IAM role の AWS クレデンシャル情報を取得する for Python

tl;dr

  • Lambda ファンクションから IAM role の AWS クレデンシャル情報を取得したい

どうするのか

参考

qiita.com

ありがとうございます!!mm

環境変数から取得する

以下のようなサンプルファンクション。

import os

def lambda_handler(event, context):
    
    print "----------------------------------------"
    print os.environ.get('AWS_ACCESS_KEY_ID')
    print os.environ.get('AWS_SECRET_ACCESS_KEY')
    print os.environ.get('AWS_SESSION_TOKEN')
    print "----------------------------------------"

IAM role には他の Lambda ファンクション作成時に自動的に作成された IAM role の lambda_basic_execution を付与。

実行してみると...

START RequestId: aae46b65-97e5-11e6-8038-c5c1480ca076 Version: $LATEST
----------------------------------------
Axxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
----------------------------------------
END RequestId: aae46b65-97e5-11e6-8038-c5c1480ca076
REPORT RequestId: aae46b65-97e5-11e6-8038-c5c1480ca076 Duration: 0.22 ms   Billed Duration: 100 ms    Memory Size: 128 MB    Max Memory Used: 7 MB

いい感じ。

Amazon Elasticsearch に接続する例

AWS4Auth との合わせ技。

  • IAM role

サービスロールには AWS Lambda を選択し、以下のようなポリシーをインラインポリシーにて付与。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "es:*"
            ],
            "Resource": "*"
        }
    ]
}
  • ファンクション
from elasticsearch import Elasticsearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth
import requests
import json, os

def lambda_handler(event, context):
    awsauth     = AWS4Auth(
        os.environ.get('AWS_ACCESS_KEY_ID'),
        os.environ.get('AWS_SECRET_ACCESS_KEY'),
        'ap-northeast-1',
        'es',
        session_token=os.environ.get('AWS_SESSION_TOKEN')
    )

    es = Elasticsearch(
        hosts=[{'host': 'search-oreno-es-xxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com', 'port': 443}],
        http_auth=awsauth,
        use_ssl=True,
        verify_certs=True,
        connection_class=RequestsHttpConnection
    )

    return json.dumps(es.info())

実行してみると以下のような感じ。

"{\"cluster_name\": \"xxxxxxxxxxxxxx:oreno-es\", \"tagline\": \"You Know, for Search\", \"version\": {\"lucene_version\": \"5.5.0\", \"build_hash\": \"0944b4bae2d0f7a126e92b6133caf1651ae316cc\", \"number\": \"2.3.2\", \"build_timestamp\": \"2016-05-20T07:46:04Z\", \"build_snapshot\": false}, \"name\": \"Wraith\"}"

おけ。

以上

メモでした。