Amazon Elasticsearch Service est Elasticsearch. Vous pouvez utiliser normalement le point de terminaison comme recherche élastique et choisir l'une des stratégies d'accès suivantes.
Au fait, j'ai pensé à une demande de Lambda basée sur IAM pour analyser légèrement le fichier placé dans S3 pour un peu de commodité et le placer dans Elasticsearch, mais pour le moment, il semble que je fasse ma propre demande de signature et la jette.
résultat. Je l'ai essayé, mais il semble maintenant plus facile de le diffuser dans le flux CloudWatch Logs, puis d'utiliser les fonctions prédéfinies. Si la ressource boto3 est implémentée pour ES, il semble qu'il n'y aura aucun problème.
Cela a fonctionné pour le moment, alors prenez note du code.
--Autoriser les rôles appliqués à Lambda dans le modèle IAM
--ʻEs: * , ʻes: ESHttpGet, etc.
Mis à part EventSource, envoyez simplement un GET à l'ES / pour le moment.
Les documents suivants ont été utiles.
LogsToElasticsearch qui peut être créé avec CloudWatch LogsPrincipalement le code pour créer l'en-tête. .. ..
function.py
import urllib2, datetime, os, sys
import hashlib, hmac
endpoint = 'search-sandbox01-xxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com'
url = "https://" + endpoint
region = 'ap-northeast-1'
service = 'es'
method = 'GET'
access_key = os.environ.get('AWS_ACCESS_KEY_ID')
secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
if access_key is None or secret_key is None:
    print 'No access key is available.'
    sys.exit()
def sign(key, msg):
    return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def getSignatureKey(key, dateStamp, regionName, serviceName):
    kDate = sign(('AWS4' + key).encode('utf-8'), dateStamp)
    kRegion = sign(kDate, regionName)
    kService = sign(kRegion, serviceName)
    kSigning = sign(kService, 'aws4_request')
    return kSigning
def lambda_handler(event, context):
    t = datetime.datetime.utcnow()
    amzdate = t.strftime('%Y%m%dT%H%M%SZ')
    datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope
    
    canonical_uri = '/'
    canonical_querystring = ""
    canonical_headers = 'host:' + endpoint + '\n' + 'x-amz-date:' + amzdate + '\n'
    signed_headers = 'host;x-amz-date'
    payload_hash = hashlib.sha256('').hexdigest()
    canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
    
    algorithm = 'AWS4-HMAC-SHA256'
    credential_scope = datestamp + '/' + region + '/' + service + '/' + 'aws4_request'
    string_to_sign = algorithm + '\n' +  amzdate + '\n' +  credential_scope + '\n' +  hashlib.sha256(canonical_request).hexdigest()
    
    signing_key = getSignatureKey(secret_key, datestamp, region, service)
    signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()
    
    authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
    
    headers = {
          'Content-Type': 'application/json',
                'Host': endpoint,
                'X-Amz-Security-Token': os.environ.get('AWS_SESSION_TOKEN'),
                'X-Amz-Date': amzdate,
                'Authorization': authorization_header
    }
    
    req = urllib2.Request(url, None, headers)
    
    try:
        print urllib2.urlopen(req).read()
    except urllib2.URLError, e:
        print e.read()
Est-il possible de créer cet en-tête rapidement en utilisant le module botocore? En réfléchissant.
Addendum: Cliquez ici pour un exemple de "Faites-le rapidement en utilisant le module botocore". [Small story] Utilisez uniquement le processus de signature de la demande d'API AWS de botocore | Developers.IO
You Know, for Search
Lorsque j'essaye de boucler vers ES depuis ma main, il est correctement bloqué.
$ curl search-sandbox01-xxxxxxxxxx.ap-northeast-1.es.amazonaws.com
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:ap-northeast-1:xxxxxxxxx:domain/sandbox01/"}
Ouvrez Lambda, `Enregistrez et testez 'le code ci-dessus, et vous aurez une réponse réussie de ES.
START RequestId: b6ce7399-85eb-11e5-b2c3-99a74c2c1765 Version: $LATEST
{
  "status" : 200,
  "name" : "Chief Examiner",
  "cluster_name" : "xxxxxxxxxxx:sandbox01",
  "version" : {
    "number" : "1.5.2",
    "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c",
    "build_timestamp" : "2015-04-27T09:21:06Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
END RequestId: b6ce7399-85eb-11e5-b2c3-99a74c2c1765
REPORT RequestId: b6ce7399-85eb-11e5-b2c3-99a74c2c1765	Duration: 64.87 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 16 MB