AWS est le service cloud d'Amazon.
Pour configurer un compte avec un access key et secret:
$ aws configure
$ 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
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
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=
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
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}}" }
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
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
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" } ] }
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"