

Avis de fin de support : le 15 décembre 2025, AWS le support de AWS IoT Analytics. Après le 15 décembre 2025, vous ne pourrez plus accéder à la AWS IoT Analytics console ni aux AWS IoT Analytics ressources. Pour plus d'informations, voir [AWS IoT Analytics fin du support](https://docs.aws.amazon.com/iotanalytics/latest/userguide/iotanalytics-end-of-support.html).

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisation d'un conteneur personnalisé pour l'analyse
<a name="automate-custom-container"></a>

Cette section contient des informations sur la création d'un conteneur Docker à l'aide d'un bloc-notes Jupyter. Un risque de sécurité existe si vous réutilisez des blocs-notes créés par des tiers : ces conteneurs peuvent exécuter du code arbitraire avec vos autorisations utilisateur. En outre, le code HTML généré par le bloc-notes peut être affiché dans la AWS IoT Analytics console, fournissant ainsi un vecteur d'attaque potentiel sur l'ordinateur qui affiche le code HTML. Assurez-vous que vous faites confiance à l'auteur de tout bloc-notes tiers avant de l'utiliser.

Vous pouvez créer votre propre conteneur personnalisé et l'exécuter avec le AWS IoT Analytics service. Pour ce faire, vous configurez une image Docker et vous la chargez sur Amazon ECR, puis vous configurez un ensemble de données pour exécuter une action de conteneur. Cette section fournit un exemple de cette procédure avec Octave. 

Ce didacticiel présume également que les actions suivantes ont été effectuées :
+ Octave a été installé sur votre ordinateur local.
+ Un compte Docker configuré sur votre ordinateur local
+ Un AWS compte Amazon ECR ou un accès AWS IoT Analytics 

**Étape 1 : Configurer une image Docker**

Il existe trois fichiers principaux dont vous avez besoin pour ce didacticiel. Voici leur nom et leur contenu :
+ `Dockerfile`— Configuration initiale du processus de conteneurisation de Docker.

  ```
  FROM ubuntu:16.04
  
  # Get required set of software
  RUN apt-get update
  RUN apt-get install -y software-properties-common
  RUN apt-get install -y octave
  RUN apt-get install -y python3-pip
  
  # Get boto3 for S3 and other libraries
  RUN pip3 install --upgrade pip
  RUN pip3 install boto3
  RUN pip3 install urllib3
  
  # Move scripts over
  ADD moment moment
  ADD run-octave.py run-octave.py
  
  # Start python script
  ENTRYPOINT ["python3", "run-octave.py"]
  ```
+ `run-octave.py`— Analyse le code JSON depuis AWS IoT Analytics, exécute le script Octave et télécharge les artefacts sur Amazon S3.

  ```
  import boto3
  import json
  import os
  import sys
  from urllib.parse import urlparse
  
  # Parse the JSON from IoT Analytics
  with open('/opt/ml/input/data/iotanalytics/params') as params_file:
      params = json.load(params_file)
  
  variables = params['Variables']
  
  order = variables['order']
  input_s3_bucket = variables['inputDataS3BucketName']
  input_s3_key = variables['inputDataS3Key']
  output_s3_uri = variables['octaveResultS3URI']
  
  local_input_filename = "input.txt"
  local_output_filename = "output.mat"
  
  # Pull input data from S3...
  s3 = boto3.resource('s3')
  s3.Bucket(input_s3_bucket).download_file(input_s3_key, local_input_filename)
  
  # Run Octave Script
  os.system("octave moment {} {} {}".format(local_input_filename, local_output_filename, order))
  
  # # Upload the artifacts to S3
  output_s3_url = urlparse(output_s3_uri)
  output_s3_bucket = output_s3_url.netloc
  output_s3_key = output_s3_url.path[1:]
  
  s3.Object(output_s3_bucket, output_s3_key).put(Body=open(local_output_filename, 'rb'), ACL='bucket-owner-full-control')
  ```
+ `moment`— Un script Octave simple qui calcule le moment en fonction d'un fichier d'entrée ou de sortie et d'un ordre spécifié.

  ```
  #!/usr/bin/octave -qf
  
  arg_list = argv ();
  input_filename = arg_list{1};
  output_filename = arg_list{2};
  order = str2num(arg_list{3});
  
  [D,delimiterOut]=importdata(input_filename)
  M = moment(D, order)
  
  save(output_filename,'M')
  ```

1. Téléchargez le contenu de chaque fichier. Créez un nouveau répertoire et placez-y tous les fichiers, puis `cd` dans ce répertoire.

1. Exécutez la commande suivante.

   ```
   docker build -t octave-moment .
   ```

1. Vous devriez voir une nouvelle image dans votre dépôt Docker. Vérifiez-le en exécutant la commande suivante.

   ```
   docker image ls | grep octave-moment
   ```

**Étape 2 : télécharger l'image Docker dans un référentiel Amazon ECR**

1. Créez un référentiel dans Amazon ECR.

   ```
   aws ecr create-repository --repository-name octave-moment
   ```

1. Connectez-vous à votre environnement Docker.

   ```
   aws ecr get-login
   ```

1. Copiez la sortie et exécutez-la. Le résultat devrait ressembler à ce qui suit.

   ```
   docker login -u AWS -p {{password}} -e none https://{{your-aws-account-id}}.dkr.ecr..amazonaws.com
   ```

1. Marquez l'image que vous avez créée avec le tag du référentiel Amazon ECR.

   ```
   docker tag {{your-image-id}}  {{your-aws-account-id}}.dkr.ecr.{{region}}.amazonaws.com/octave-moment
   ```

1. Poussez l'image vers Amazon ECR.

   ```
   docker push {{your-aws-account-id}}.dkr.ecr.{{region}}.amazonaws.com/octave-moment
   ```

**Étape 3 : Chargez vos exemples de données dans un compartiment Amazon S3**

1. Téléchargez ce qui suit dans un fichier`input.txt`.

   ```
   0.857549  -0.987565  -0.467288  -0.252233  -2.298007
    0.030077  -1.243324  -0.692745   0.563276   0.772901
   -0.508862  -0.404303  -1.363477  -1.812281  -0.296744
   -0.203897   0.746533   0.048276   0.075284   0.125395
    0.829358   1.246402  -1.310275  -2.737117   0.024629
    1.206120   0.895101   1.075549   1.897416   1.383577
   ```

1. Créez un compartiment Amazon S3 appelé`octave-sample-data-{{your-aws-account-id}}`.

1. Téléchargez le fichier dans `input.txt` le compartiment Amazon S3 que vous venez de créer. Vous devriez maintenant avoir un bucket nommé `octave-sample-data-{{your-aws-account-id}}` contenant le `input.txt` fichier.

**Étape 4 : Créer un rôle d'exécution de conteneur**

1. Copiez ce qui suit dans un fichier nommé`role1.json`. {{your-aws-account-id}}Remplacez-le par votre numéro de AWS compte et {{aws-region}} par la AWS région de vos AWS ressources.
**Note**  
Cet exemple inclut une clé de contexte de condition globale pour se protéger contre le problème confus de sécurité adjoint. Pour de plus amples informations, veuillez consulter [Prévention du cas de figure de l’adjoint désorienté entre services](cross-service-confused-deputy-prevention.md).

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": [
                       "sagemaker.amazonaws.com",
                       "iotanalytics.amazonaws.com"
                   ]
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceAccount": "{{123456789012}}"
                   },
                   "ArnLike": {
                       "aws:SourceArn": "arn:aws:iotanalytics:{{us-east-1}}:{{123456789012}}:dataset/{{your-dataset}}"
                   }
               }
           }
       ]
   }
   ```

------

1. Créez un rôle qui donne des autorisations d'accès à SageMaker AI et AWS IoT Analyticsà l'aide du fichier `role1.json` que vous avez téléchargé.

   ```
   aws iam create-role --role-name container-execution-role --assume-role-policy-document file://role1.json
   ```

1. Téléchargez ce qui suit dans un fichier nommé `policy1.json` et remplacez-le {{`your-account-id`}} par votre identifiant de compte (voir le deuxième ARN ci-dessous`Statement:Resource`).

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetBucketLocation",
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:PutObjectAcl"
               ],
               "Resource": [
                   "arn:aws:s3:*:*:dataset/*",
                   "arn:aws:s3:*:*:octave-sample-data-{{123456789012}}/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iotanalytics:*"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ecr:GetAuthorizationToken",
                   "ecr:GetDownloadUrlForLayer",
                   "ecr:BatchGetImage",
                   "ecr:BatchCheckLayerAvailability",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:DescribeLogStreams",
                   "logs:GetLogEvents",
                   "logs:PutLogEvents"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetBucketLocation",
                   "s3:ListBucket",
                   "s3:ListAllMyBuckets"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. Créez une politique IAM à l'aide du `policy.json` fichier que vous venez de télécharger.

   ```
   aws iam create-policy --policy-name ContainerExecutionPolicy --policy-document file://policy1.json
   ```

1. Attachez la stratégie au rôle.

   ```
   aws iam attach-role-policy --role-name container-execution-role --policy-arn arn:aws:iam::{{your-account-id}}:policy/ContainerExecutionPolicy
   ```

**Étape 5 : Création d'un ensemble de données avec une action de conteneur**

1. Téléchargez ce qui suit dans un fichier nommé `cli-input.json` et remplacez toutes les instances de {{`your-account-id`}} et {{`region`}} par les valeurs appropriées.

   ```
   {
       "datasetName": "octave_dataset",
       "actions": [
           {
               "actionName": "octave",
               "containerAction": {
                   "image": "{{your-account-id}}.dkr.ecr.{{region}}.amazonaws.com/octave-moment",
                   "executionRoleArn": "arn:aws:iam::{{your-account-id}}:role/container-execution-role",
                   "resourceConfiguration": {
                       "computeType": "ACU_1",
                       "volumeSizeInGB": 1
                   },
                   "variables": [
                       {
                           "name": "octaveResultS3URI",
                           "outputFileUriValue": {
                               "fileName": "output.mat"
                           }
                       },
                       {
                           "name": "inputDataS3BucketName",
                           "stringValue": "octave-sample-data-{{your-account-id}}"
                       },
                       {
                           "name": "inputDataS3Key",
                           "stringValue": "input.txt"
                       },
                       {
                           "name": "order",
                           "stringValue": "3"
                       }
                   ]
               } 
           }
       ]
   }
   ```

1. Créez un jeu de données à l'aide du fichier `cli-input.json` que vous venez de télécharger et de modifier.

   ```
   aws iotanalytics create-dataset —cli-input-json file://cli-input.json
   ```

**Étape 6 : Invoquer la génération de contenu du jeu de données**

1. Exécutez la commande suivante.

   ```
   aws iotanalytics create-dataset-content --dataset-name octave-dataset
   ```

**Étape 7 : Obtenir le contenu du jeu de données**

1. Exécutez la commande suivante.

   ```
   aws iotanalytics get-dataset-content --dataset-name octave-dataset --version-id \$LATEST
   ```

1. Vous devrez peut-être attendre plusieurs minutes jusqu'à ce que ce `DatasetContentState` soit le cas`SUCCEEDED`.

**Étape 8 : Imprimer la sortie sur Octave**

1. Utilisez le shell Octave pour imprimer la sortie du conteneur en exécutant la commande suivante.

   ```
   bash> octave
   octave> load output.mat
   octave> disp(M)
   -0.016393 -0.098061 0.380311 -0.564377 -1.318744
   ```