Table des matières

AWS

AWS est le service cloud d'Amazon.

CLI

Pour configurer un compte avec un access key et secret:

$ aws configure

Variables d'environnement

$ export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_DEFAULT_REGION=us-west-2

Dans le cas d'utilisation d'un session token, on peut ajouter:

AWS_SESSION_TOKEN

Utiliser un rôle qui requiert un MFA

Dans le fichier ~/.aws/credentials, ajouter par exemple les credentials nécessaires:

[aws_account_name_or_username]
aws_access_key_id = AKIAQ75CXLP2PEXAMPLE
aws_secret_access_key = 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                               

Après dans le fichier ~/.aws/config ajouter un profil:

[profile nom_du_profil]
output = json
region = us-east-1
role_arn = arn:aws:iam::976567865786:role/super_duper_power_users
source_profile = aws_account_name
mfa_serial=arn:aws:iam::987653456789:mfa/myusername

La valeur de source_profile fait référence au nom de la section dans le fichier credential, dans l'exemple plus haut c'est aws_account_name_or_username (qui est lui-même un exemple bidon).

Outils qui peuvent aider à gérer ça:

Exemple:

$  aws sts assume-role --role-arn arn:aws:iam::XXXXXXXXXXXX:role/org-super_users --role-session-name "RoleSessionName1" --profile org-super_users --output json > assume-role-output.txt

Source: Using an IAM role in the AWS CLI

Sortie au stdout

Les sorties de commandes peuvent se faire dans nano, ce qui n'est pas idéal pour copier les informations. L'option cli_pager= (avec aucune valeur) dans le ~/.aws/config [default] ne semble pas fonctionner, comme la documentation le suggère.

Plutôt faire avec un export:

$ export AWS_PAGER=

IAM

Créer un rôle IAM:

aws iam create-role --role-name SomeRoleName --assume-role-policy-document file://./subdir/some-file.json

Attach to policy:

aws iam attach-role-policy --role-name SomeRoleName --policy-arn arn:aws:iam::aws:policy/GameLiftGameServerGroupPolicy

Cognito

Login par requêtes directes

Les requêtes ci-dessous sont effectuées avec REST Client, extension de VS Code.

Prérequis:

Pour effectuer des tests, par exemple pour obtenir un JWT d'identification, il faut appeler le service IDP de Cognito avec un initAuth:

POST https://cognito-idp.us-east-1.amazonaws.com/
Content-Type: application/x-amz-json-1.1
X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth

{
    "AuthParameters" : {
        "USERNAME" : "test@domain",
        "PASSWORD" : "initialPassword"
    },
    "AuthFlow" : "USER_PASSWORD_AUTH",
    "ClientId" : "{{cognitoClientId}}"
}

Si la réponse retourne un challenge NEW_PASSWORD_REQUIRED, il faut envoyer une requête RespondToAuthChallenge:

POST https://cognito-idp.us-east-1.amazonaws.com/
Content-Type: application/x-amz-json-1.1
X-Amz-Target: AWSCognitoIdentityProviderService.RespondToAuthChallenge

{
    "ChallengeName": "NEW_PASSWORD_REQUIRED",
    "ChallengeResponses": {
      "USERNAME" : "test@domain",
      "NEW_PASSWORD" : "newPassword"
    },
    "ClientId": "{{cognitoClientId}}",
    "Session": "{{initAuth.response.body.Session}}"
}

La réponse au challenge retourne le id token si ça a bien fonctionné.

Obtenir un id token avec un refresh token:

POST https://cognito-idp.us-east-1.amazonaws.com/
Content-Type: application/x-amz-json-1.1
X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth

{
    "AuthParameters" : {
        "REFRESH_TOKEN" : "{{normalAuth.response.body.AuthenticationResult.RefreshToken}}"
    },
    "AuthFlow" : "REFRESH_TOKEN_AUTH",
    "ClientId" : "{{cognitoClientId}}"
}

Ressources

GameLift

Référence générale du AWS CLI pour GameLift.

Accéder par SSH sur une instance Linux:

aws gamelift describe-instances --fleet-id fleet-c938a965-0d10-4bd5-bba6-912f5578aa45

Exemple de réponse reçu:

{
    "Instances": [
        {
            "Status": "Active", 
            "InstanceId": "i-06bc89c264c000000", 
            "Type": "c5.large", 
            "CreationTime": 1605559806.411, 
            "DnsName": "ec2-35-153-100-100.compute-1.amazonaws.com", 
            "FleetId": "fleet-c938a965-0d10-4bd5-bba6-000000000000", 
            "IpAddress": "35.153.100.100", 
            "OperatingSystem": "AMAZON_LINUX_2"
        }
    ]
}

Ensuite avec l'instance Id on peut récupérer la clé privée.

aws gamelift get-instance-access --fleet-id fleet-c938a965-0d10-4bd5-bba6-000000000000 --instance i-06bc89c264c000000 --query "InstanceAccess.Credentials.Secret" --output text > instancekey.pem

Il est possible que le port SSH ne soit pas ouvert sur l'instance:

# Linux par ssh
aws gamelift update-fleet-port-settings --fleet-id fleet-c938a965-0d10-4bd5-bba6-000000000000 --inbound-permission-authorizations "FromPort=22,ToPort=22,IpRange=###.###.###.###/32,Protocol=TCP"

# Windows avec RemoteDesktop:
aws gamelift update-fleet-port-settings --fleet-id fleet-c938a965-0d10-4bd5-bba6-000000000000 --inbound-permission-authorizations "FromPort=3389,ToPort=3389,IpRange=###.###.###.###/32,Protocol=TCP"

Donner des permission plus restreintes sur la clé privée

chmod 400 instancekey.pem

ou bien utiliser sudo pour le ssh:

sudo ssh -i instancekey.pem gl-user-remote@35.153.207.14

Source

Upload Build

Exemple de commande qui peut être utilisée pour téléverser un build vers AWS:

aws gamelift upload-build --operating-system WINDOWS_2012 --build-root ~/path-to/BuildDirectory --name "MyBuild" --build-version "0.0.1" --region us-east-1

Fleet Configuration

On peut avoir besoin de l'identifiant de l'instance sur lequel le fleet se retrouve:

aws gamelift describe-runtime-configuration --fleet-id fleet-00000000-0000-0000-0000-000000000000

On aura des informations intéressantes tel que l'IP, le port et l'instanceId:

{
    "Instances": [
        {
            "Status": "Active", 
            "InstanceId": "i-00000000000000000", 
            "Type": "c5.large", 
            "CreationTime": 1600000000.000, 
            "DnsName": "ec2-54-100-100-100.compute-1.amazonaws.com", 
            "FleetId": "fleet-00000000-0000-0000-0000-000000000000", 
            "IpAddress": "54.100.100.100", 
            "OperatingSystem": "WIN_2012"
        }
    ]
}

Runtime Configuration

Exemple de modification de Runtime Configuration pour changer le LaunchPath, ou même le ConcurrentExecutions:

aws gamelift update-runtime-configuration --fleet-id fleet-c938a965-0d10-4bd5-bba6-912f5578aa45 --runtime-configuration "ServerProcesses=[{LaunchPath=/local/game/RealtimeServerScript.js,ConcurrentExecutions=10}],MaxConcurrentGameSessionActivations=2147483647,GameSessionActivationTimeoutSeconds=3600"