Archivos por Etiqueta: aws

Amazon: Protect Instance Metadata and User Data

Es una practica extendida almacenar las credenciales en el “user-data”, el problema es que desde una instancia de EC2 cualquier usuario de la maquina, autorizado o no, puede acceder a estos datos.

Ejemplo:

curl http://169.254.169.254/latest/user-data

Una regla de iptables para evitar estos accesos, salvo para el usuario “root” (uid=0):

iptables -A OUTPUT \
  -d 169.254.169.254/32 -p tcp --dport 80 \
  -m owner ! --uid-owner 0 \
  -j REJECT --reject-with tcp-reset

References:
EC2 – Instance Metadata and User Data
The best method for passing AWS credentials as user data to an EC2 instance?

Anuncios

Amazon: Simple WhatIsMyIP with Lambda and API-Gateway

Un ejemplo de como montar un sencillo WhatIsMyIP usando Amazon Lambda con el Backend de NodeJS y API-Gateway.

El código del Lambda (Runtime: NodeJS, Handler: index.handler, Role: Basic Execution Role):

exports.handler = function(event, context) {
    context.succeed({ "ip": event.ip });
};

Aunque para que sea funcional tienes que publicarlo a través de API-Gateway. Crear un resource, por ejemplo “text” y un metodo (GET). Tambien hacen falta algunas configuraciones de integración:

Integration Request (Content-Type: application/json, Mapping Template):

{
"ip" : "$context.identity.sourceIp"
}

Integration Response (Status 200, Content-Type: text/plain, Mapping Template):

#set($inputRoot = $input.path('$'))
$inputRoot.ip

Method Response (Status 200, Content-Type: text/plain, Model: Empty).

Si prefieres respuestas json en realidad es más sencillo aún, podrías ahorrarte la customización de la parte del Integration Response y el Method Response (Por defecto los mime-types ya son application/json y el Integration es Output passthrough).

Solo tienes que publicarla en un stage (“prod” por ejemplo) y al invocar la URL con curl tendrás algo como esto:

# curl -sL https://xxxxxxxxxx.execute-api.eu-west-1.amazonaws.com/prod/text
219.12.34.56

NOTA-1: Si clonas un API, es posible que deje de funcionar (bug?) y tendrás que ir al “Integration Request” y volver a asignar la función, aunque aparezca la correcta, para que le asigne los permisos de ejecución.
NOTA-2: Si vas a usar Lambdas o API-Gateway para datos “binarios” (todo lo que no sea texto, de momento no está soportado), verás tus datos corromperse.

Referencias:
API-Gateway Developer Guide
API-Gateway Developer Guide: Mapping Template Reference
Lambda Developer Guide

Java: Repositorio Maven con Amazon S3

Si quieres montarte un repositorio Maven en Amazon S3 sin calentarte mucho la cabeza con un Nexus-OSS, aqui va el resumen (en los enlaces -ingles- los detalles completos):

Primero debes crear un par de buckets en S3, REPONAME-release y REPONAME-snapshot.
Nota: Donde REPONAME podria ser algo como por ejemplo: com-acme-maven-repo
Luego debes crear un usuario en el servicio IAM, eso te dara un Access Key ID que usaras como “username” y un Secret Access Key que usaras como “passphrase” en el settings.xml

Una vez creado el usuario debes adjuntarle una policy en la seccion de Permissions como esta:

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::REPONAME-snapshot",
        "arn:aws:s3:::REPONAME-snapshot/*", 
        "arn:aws:s3:::REPONAME-release", 
        "arn:aws:s3:::REPONAME-release/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "arn:aws:s3:::REPONAME-*"
    }
  ]
}

Debes configurar las credenciales que se usaran para acceder a los buckets del S3 (~/.m2/settings.xml)

<settings>
    ...cut...
    <servers>
        ...cut...
        <server>
            <id>REPONAME-s3-release-repo</id>
            <username>0123456789ABCDEFGHIJ</username>
            <password>0123456789abcdefghijklmnopqrstuvwxyzABCD</password>
        </server>
        <server>
            <id>REPONAME-s3-snapshot-repo</id>
            <username>0123456789ABCDEFGHIJ</username>
            <password>0123456789abcdefghijklmnopqrstuvwxyzABCD</password>
        </server>
        ...cut...
    </servers>
    ...cut...
</settings>

Luego en el pom.xml de tu proyecto le indicas que repositorio debe usar para la publicacion:

<project ...cut...>
    <build>
        <extensions>
            <extension>
                <groupId>org.springframework.build</groupId>
                <artifactId>aws-maven</artifactId>
                <version>5.0.0.RELEASE</version>
            </extension>
        </extensions>
    </build>

    <!-- Deployment -->
    <distributionManagement>
        <repository>
            <name>S3 Release Repository</name>
            <id>REPONAME-s3-release-repo</id>
            <url>s3://REPONAME-release/release</url>
        </repository>
        <snapshotRepository>
            <name>S3 Snapshot Repository</name>
            <id>REPONAME-s3-snapshot-repo</id>
            <url>s3://REPONAME-snapshot/snapshot</url>
        </snapshotRepository>
    </distributionManagement>
</project>

Para hacer el deploy del artefacto… maven deploy

Para usarlo desde otros proyectos:

<project ...cut...>
    <repositories>
        <repository>
            <id>REPONAME-s3-release-repo</id>
            <url>https://REPONAME-release.s3.amazonaws.com/release/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>REPONAME-s3-snapshot-repo</id>
            <url>https://REPONAME-snapshot.s3.amazonaws.com/snapshot/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

Fuentes y detalles:
Hosting Maven repository on Amazon-S3
Giving access to a single S3 Bucket using Amazon IAM
Maven Wagon for Amazon S3

A %d blogueros les gusta esto: