Hyppää sisältöön

Welcome to our weekly research support coffee hour on Zoom! Click here for more information.

Warning!

Puhti scratch disk is becoming very full (80+ % ) resulting in performance degradation. Everybody is advised to only keep actively processed data on scratch, all other data should be deleted, transferred to host institute or stored in Lumi-O. No new quota will be granted. Click here for a tool for examining your disk usage.

Kuvaputken käyttöönotto

Tavoitteet

  • Tutustua siihen, miten useita pilvipalveluja käytetään yhdessä.
  • Tutustua siihen, miten pilvipalveluja käytetään niiden komentorivikäyttöliittymien avulla.

Ohje keskittyy seuraaviin palveluihin:

  • Allas, objektitallennuspalvelumme
  • cPouta, julkisen pilven palvelumme
  • Pukki, tilauksesta käytettävä tietokantapalvelumme

Johdanto

Haluamme rakentaa yksinkertaisen putken, joka muuntaa sille syötteenä annetut kuvat.

picture-pipeline-diagram

Ensin lataamme kuvat työasemaltamme Altaan ämpäriin. cPoudassa oleva virtuaalikone hakee kuvat ämpäristä ja lataa ne paikallisesti. Virtuaalikone muuntaa kuvat ja kirjaa suoritetun toiminnon Pukissa ylläpidettyyn tietokantaan. Lopuksi virtuaalikone lataa muunnetut kuvat toiseen Altaan ämpäriin. Tämän jälkeen voimme ladata muunnetut kuvat ämpäristä työasemallemme.

Tässä ohjeessa muunnettu kuva tarkoittaa yksinkertaisesti syötekuvaa, jonka värit on käännetty, mitä kutsutaan joskus myös "reversed"-muunnokseksi.

Vaihe 1: ämpärien luominen Altaaseen

Avaamme uuden pääteikkunan, johon viittaamme nimellä terminal_allas. Käytämme terminal_allas-ikkunaa kaikkiin Allasta koskeviin komentoihin.

Jotta voimme luoda ämpäreitä Altaaseen, tarvitsemme toimivan komentorivikäyttöliittymän sitä varten. Jos emme ole aiemmin ottaneet tällaista käyttöliittymää käyttöön työasemallamme, seuraamme s3cmd:n asennus- ja määritysohjeita.

Voimme testata komentorivikäyttöliittymän toiminnan listaamalla kaikki projektissamme tällä hetkellä olevat ämpärit. Esimerkki komennosta ja sen odotetusta tulosteesta:

$ s3cmd ls
2021-07-14 15:14  s3://bucket1
2020-01-14 17:40  s3://bucket2
...
Huomaa, että lista voi olla myös tyhjä, jos emme ole aiemmin luoneet projektiimme yhtään ämpäriä.

Luomme nyt putkeamme varten syöte- ja tulosämpärit. Määrittelemme ensin ämpärien nimet ympäristömuuttujina:

$ export INPUT_BUCKET="input_bucket"
$ export OUTPUT_BUCKET="output_bucket"

Käytämme sitten seuraavia komentoja ämpärien varsinaiseen luomiseen:

$ s3cmd mb s3://$INPUT_BUCKET
Bucket 's3://input_bucket/' created
$ s3cmd mb s3://$OUTPUT_BUCKET
Bucket 's3://output_bucket/' created

Warning

Ämpärien nimien on oltava yksilöllisiä. Jos toinen käyttäjä on jo valinnut saman nimen, ämpärin luontikomento epäonnistuu:

$ s3cmd mb s3://$INPUT_BUCKET
ERROR: Bucket 'input_bucket' already exists
ERROR: S3 error: 409 (BucketAlreadyExists)
Tällöin voimme yksinkertaisesti yrittää komentoa uudelleen eri nimellä.

Vaihe 2: tietokannan luominen Pukkiin

Avaamme toisen pääteikkunan, johon viittaamme nimellä terminal_pukki. Käytämme terminal_pukki-ikkunaa kaikkiin Pukkia koskeviin komentoihin.

Toimiva komentorivikäyttöliittymä Pukkia varten on edellytys ohjeen jatkamiselle. Jos emme ole ottaneet sitä aiemmin käyttöön, seuraamme Pukin komentorivikäyttöliittymän asennus- ja määritysohjeita.

Voimme testata komentorivikäyttöliittymän toiminnan listaamalla esimerkiksi saatavilla olevat tietokantatyypit. Esimerkki komennosta ja sen odotetusta tulosteesta:

$ openstack datastore list
+--------------------------------------+------------+
| ID                                   | Name       |
+--------------------------------------+------------+
| 71920375-6967-466e-b955-8ee8629312b7 | postgresql |
| 1a8efda2-7bb7-4c52-9eab-e251fd18323c | mariadb    |
+--------------------------------------+------------+

Luomme nyt tietokannan, jota käytämme putken toimintojen kirjaamiseen. Määrittelemme ensin muutaman ympäristömuuttujan, joita käytämme myöhemmin:

$ export DB_INSTANCE_NAME="pipeline_db_instance" # tietokantaesiintymän nimi Pukissa
$ export DB_NAME="pipeline_db" # tietokannan nimi
$ export DB_USERNAME="db_admin" # tietokantaan määritettävän käyttäjän nimi
$ export DB_PASSWORD="xxxxxx" # lisää tähän tietokantaan määritettävän käyttäjän salasana 

Luomme sitten varsinaisen tietokantaesiintymän seuraavalla komennolla:

$ openstack database instance create $DB_INSTANCE_NAME \
--flavor standard.small \
--databases $DB_NAME \
--users $DB_USERNAME:$DB_PASSWORD \
--datastore postgresql \
--is-public \
--size 1
Komennon parametrit ovat seuraavat:

  • flavor määrittää tietokantaesiintymälle varattavien resurssien määrän (CPU, muisti), katso lisätietoja sivulta DBaaS-palvelun flavorit ja hinnat.
  • databases on luettelo niiden tietokantojen nimistä, jotka haluamme luoda esiintymän sisälle; tässä tapauksessa kyseessä on yksi tietokanta.
  • users on luettelo tunnuksista muodossa käyttäjänimi:salasana, joilla määritetään tietokantojen käyttäjät; tässä tapauksessa kyseessä on yksi tunnuspari.
  • datastore määrittää käytettävän tietokantatyypin, esimerkiksi postgresql tai mariadb.
  • is-public määrittää, että tietokantaesiintymä tehdään julkisesti saavutettavaksi.
  • size on tietokannan koko gigatavuina.

Komennon tulosteen pitäisi olla samankaltainen kuin seuraava:

+--------------------------+--------------------------------------+
| Field                    | Value                                |
+--------------------------+--------------------------------------+
| allowed_cidrs            | []                                   |
| created                  | 2025-02-04T13:08:51                  |
| datastore                | postgresql                           |
| datastore_version        | 17.2                                 |
| datastore_version_number | 17.2                                 |
| flavor                   | d4a2cb9c-99da-4e0f-82d7-3313cca2b2c2 |
| id                       | 2f347948-9460-4ac0-a588-32187c8b6ab1 |
| name                     | pipeline_db_instance                 |
| operating_status         |                                      |
| public                   | True                                 |
| region                   | regionOne                            |
| service_status_updated   | 2025-02-04T13:08:51                  |
| status                   | BUILD                                |
| updated                  | 2025-02-04T13:08:51                  |
| volume                   | 1                                    |
+--------------------------+--------------------------------------+

Vaihe 3: virtuaalikoneen luominen cPoutaan

Avaamme kolmannen pääteikkunan, johon viittaamme nimellä terminal_pouta. Käytämme terminal_pouta-ikkunaa kaikkiin cPoutaa koskeviin komentoihin.

Samalla tavalla kuin Altaan ja Pukin kohdalla, ohjeen jatkaminen edellyttää myös toimivaa komentorivikäyttöliittymää cPoutaa varten. Seuraamme cPoudan komentorivikäyttöliittymän asennus- ja määritysohjeita, jos emme ole tehneet sitä jo aiemmin.

Warning

Vaikka Pukin ja cPoudan komentorivikäyttöliittymät ovat monilta osin samankaltaisia, ne ovat erilaisia eikä niitä voi käyttää ristiin. Esimerkiksi Pukin komentojen suorittaminen cPoutaa varten määritetyssä päätteessä johtaa seuraavaan virheeseen:

public endpoint for database service in regionOne region not found
Käytä kahta eri päätettä niiden kanssa työskentelyyn, jotta vältät tämänkaltaiset ongelmat.

Jos haluat tarkistaa, mille palvelulle nykyinen päätteesi on määritetty, voit kirjoittaa seuraavan komennon:

$ printenv | grep OS_AUTH_URL
OS_AUTH_URL=https://pukki.dbaas.csc.fi:5000/v3 # päätteemme on määritetty Pukkia varten

$ printenv | grep OS_AUTH_URL
OS_AUTH_URL=https://pouta.csc.fi:5001/v3 # päätteemme on määritetty cPoutaa varten

Voimme testata komentorivikäyttöliittymän toiminnan näyttämällä esimerkiksi jonkin flavorin ominaisuudet. Esimerkki komennosta ja sen odotetusta tulosteesta:

$ openstack flavor show standard.tiny
+----------------------------+--------------------------------------+
| Field                      | Value                                |
+----------------------------+--------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                |
| OS-FLV-EXT-DATA:ephemeral  | 0                                    |
| access_project_ids         | None                                 |
| disk                       | 80                                   |
| id                         | 0143b0d1-4788-4d1f-aa04-4473e4a7c2a6 |
| name                       | standard.tiny                        |
| os-flavor-access:is_public | True                                 |
| properties                 | standard='true'                      |
| ram                        | 1000                                 |
| rxtx_factor                | 1.0                                  |
| swap                       |                                      |
| vcpus                      | 1                                    |
+----------------------------+--------------------------------------+

Nyt kun työskentelemme cPoudassa, luomme ensimmäiseksi avainparin, jota käytämme virtuaalikoneelle kirjautumiseen sen käynnistyttyä. Uuden avainparin luomiseksi määrittelemme ensin sen nimen ympäristömuuttujana ja suoritamme sitten siihen tarkoitetun komennon:

$ export POUTA_KEYPAIR="mykeypair"
$ ssh-keygen -t rsa -b 2048 -f $POUTA_KEYPAIR -N ''

Tarkistamme, että komento on todella luonut kaksi tiedostoa työasemamme nykyiseen kansioon.

$ ls $POUTA_KEYPAIR*
mykeypair mykeypair.pub
Ensimmäinen tiedosto ilman .pub-päätettä on yksityinen avain, kun taas .pub-päätteinen tiedosto on julkinen avain. Yksityisen avaimen ei pidä koskaan poistua työasemaltasi, eli sitä ei pitäisi olla tarpeen kopioida minnekään muualle. Sen sijaan julkisen avaimen voi vapaasti kopioida ja jakaa niihin kohteisiin, joihin haluat päästä juuri luodulla avainparilla. Tätä varten lataamme julkisen avaimen cPoutaan seuraavalla komennolla:
$ openstack keypair create $POUTA_KEYPAIR \
--public-key $POUTA_KEYPAIR.pub 
Komennon parametri public-key määrittää julkisen avaintiedoston polun.

Komennon tuloste on samankaltainen kuin seuraava:

+-------------+-------------------------------------------------+
| Field       | Value                                           |
+-------------+-------------------------------------------------+
| fingerprint | 0e:60:39:df:83:83:fb:18:91:87:67:25:a9:67:27:fd |
| name        | mykeypair                                       |
| user_id     | xxxxxxxx                                        |
+-------------+-------------------------------------------------+

Luomme nyt virtuaalikoneen, jota käytämme putkeamme varten. Määrittelemme ensin virtuaalikoneen nimen ympäristömuuttujana:

$ export POUTA_INSTANCE_NAME="pipeline_vm"

Komento, jolla luomme virtuaalikoneen, on seuraava:

$ openstack server create $POUTA_INSTANCE_NAME \
--flavor standard.tiny \
--image Ubuntu-24.04 \
--key-name $POUTA_KEYPAIR
Komennon parametrit ovat seuraavat:

Komennon tulosteen pitäisi olla samankaltainen kuin seuraava:

+-----------------------------+------------------------------------------------------+
| Field                       | Value                                                |
+-----------------------------+------------------------------------------------------+
| OS-DCF:diskConfig           | MANUAL                                               |
| OS-EXT-AZ:availability_zone |                                                      |
| OS-EXT-STS:power_state      | NOSTATE                                              |
| OS-EXT-STS:task_state       | scheduling                                           |
| OS-EXT-STS:vm_state         | building                                             |
| OS-SRV-USG:launched_at      | None                                                 |
| OS-SRV-USG:terminated_at    | None                                                 |
| accessIPv4                  |                                                      |
| accessIPv6                  |                                                      |
| addresses                   |                                                      |
| adminPass                   | xxxxxxxxxxxx                                         |
| config_drive                |                                                      |
| created                     | 2025-02-04T13:10:43Z                                 |
| flavor                      | standard.tiny (0143b0d1-4788-4d1f-aa04-4473e4a7c2a6) |
| hostId                      |                                                      |
| id                          | ae9f924b-f6c5-488c-b617-36809008e37e                 |
| image                       | Ubuntu-24.04 (bc68d79a-6dcc-446f-a8cd-c8313b885718)  |
| key_name                    | mykeypair                                            |
| name                        | pipeline_vm                                          |
| progress                    | 0                                                    |
| project_id                  | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                     |
| properties                  |                                                      |
| security_groups             | name='default'                                       |
| status                      | BUILD                                                |
| updated                     | 2025-02-04T13:10:43Z                                 |
| user_id                     | timo                                                 |
| volumes_attached            |                                                      |
+-----------------------------+------------------------------------------------------+

Vaihe 4: putken määrittäminen

Nyt kun olemme rakentaneet kaikki osat, määritämme ne toimimaan putkena. Ensin määritämme virtuaalikoneen niin, että voimme käyttää sitä työasemaltamme. Sitten varmistamme, että virtuaalikone voi käyttää Altaan ämpäreitä. Määritämme myös Pukissa olevan tietokantaesiintymämme hyväksymään virtuaalikoneelta tulevan liikenteen. Lopuksi asennamme ja määritämme virtuaalikoneeseen työkalut, joita tarvitaan putken toimintaan.

Liikenteen salliminen työasemalta virtuaalikoneelle

Oletusarvoisesti virtuaalikone ei salli Internetistä tulevaa liikennettä luvattomien käyttöyritysten estämiseksi. Pääsyä virtuaalikoneelle säädellään security group -ryhmien ja niiden sisältämien sääntöjen avulla. Luomme siis uuden security groupin, jossa on yksi sääntö ja joka sallii pääsyn virtuaalikoneelle työasemaltamme.

Palaamme terminal_pouta-ikkunaan.

Selvitämme ensin työasemamme käyttämän julkisen IP-osoitteen ja tallennamme sen ympäristömuuttujaan kirjoittamalla seuraavan komennon:

$ export WORKSTATION_IP=$(curl -4 ifconfig.me)

Luomme uuden security groupin määrittelemällä ensin sen nimen ympäristömuuttujana ja suorittamalla sitten siihen tarkoitetun komennon:

$ export POUTA_SEC_GROUP_NAME="pipeline_security_group"
$ openstack security group create $POUTA_SEC_GROUP_NAME

Tuloste näyttää seuraavan kaltaiselta:

+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                                                                                                      |
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_at      | 2025-02-04T13:12:43Z                                                                                                                                                       |
| description     | pipeline_security_group                                                                                                                                                    |
| id              | a8630776-db3d-408a-ba8e-8c52b5f2a8c9                                                                                                                                       |
| location        | cloud='', project.domain_id='default', project.domain_name=, project.id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', project.name='project_xxxxxxx', region_name='regionOne', zone= |
| name            | pipeline_security_group                                                                                                                                                    |
| project_id      | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                                                                                                                           |
| revision_number | 1                                                                                                                                                                          |
| rules           | created_at='2025-02-04T13:12:44Z', direction='egress', ethertype='IPv6', id='8e0cba6e-814d-4e70-92de-61389f9b6ca7', updated_at='2025-02-04T13:12:44Z'                      |
|                 | created_at='2025-02-04T13:12:43Z', direction='egress', ethertype='IPv4', id='cdf6527c-ca5a-4247-8e47-40213b601ee0', updated_at='2025-02-04T13:12:43Z'                      |
| tags            | []                                                                                                                                                                         |
| updated_at      | 2025-02-04T13:12:43Z                                                                                                                                                       |
+-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Lisäämme säännön, joka sallii pääsyn, seuraavalla komennolla:

$ openstack security group rule create $POUTA_SEC_GROUP_NAME \
--remote-ip $WORKSTATION_IP/32 \
--dst-port 22 \
--protocol tcp
Komennon parametrit ovat seuraavat:

  • remote-ip määrittää IP-osoitejoukon, jota varten sääntö on määritelty. Etä-IP-osoitteet vastaavat liikenteen lähdettä.
  • dst-port määrittää, mille kohteen portille sääntö on määritelty. Kohdeportti vastaa liikenteen määränpäätä.
  • protocol määrittää protokollan, jota varten sääntö on määritelty. Tässä tapauksessa sääntö koskee vain TCP-liikennettä.

Tuloste on samankaltainen kuin seuraava:

+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field             | Value                                                                                                                                                                      |
+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_at        | 2025-02-04T13:13:04Z                                                                                                                                                       |
| description       |                                                                                                                                                                            |
| direction         | ingress                                                                                                                                                                    |
| ether_type        | IPv4                                                                                                                                                                       |
| id                | 29ebe032-f09c-4cb5-9e49-bc75e6d1880c                                                                                                                                       |
| location          | cloud='', project.domain_id='default', project.domain_name=, project.id='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', project.name='project_xxxxxxx', region_name='regionOne', zone= |
| name              | None                                                                                                                                                                       |
| port_range_max    | 22                                                                                                                                                                         |
| port_range_min    | 22                                                                                                                                                                         |
| project_id        | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                                                                                                                           |
| protocol          | tcp                                                                                                                                                                        |
| remote_group_id   | None                                                                                                                                                                       |
| remote_ip_prefix  | xxx.xxx.xxx.xxx/32                                                                                                                                                         |
| revision_number   | 0                                                                                                                                                                          |
| security_group_id | a8630776-db3d-408a-ba8e-8c52b5f2a8c9                                                                                                                                       |
| tags              | []                                                                                                                                                                         |
| updated_at        | 2025-02-04T13:13:04Z                                                                                                                                                       |
+-------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Nyt liitämme security groupin aiemmin luotuun virtuaalikoneeseen, jotta tämä juuri luotu sääntö koskee sen liikennettä.

$ openstack server add security group $POUTA_INSTANCE_NAME $POUTA_SEC_GROUP_NAME
Onnistuneessa tapauksessa komento ei tulosta mitään.

Yhdistäminen virtuaalikoneeseen

Virtuaalikone on nyt määritetty sallimaan liikenne työasemaltamme, mutta siihen ei vielä saada yhteyttä. Virtuaalikoneelle annetaan käynnistyksen yhteydessä yksityinen IP-osoite, mutta sille ei anneta automaattisesti julkista IP-osoitetta, joka tarvitaan yhteyden muodostamiseen Internetin kautta.

Palaamme terminal_pouta-ikkunaan. Varaamme uuden osoitteen seuraavalla komennolla:

$ openstack floating ip create public

Tuloste on samankaltainen kuin seuraava:

+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field               | Value                                                                                                                                                                                                |
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| created_at          | 2025-02-04T13:13:38Z                                                                                                                                                                                 |
| description         |                                                                                                                                                                                                      |
| dns_domain          | None                                                                                                                                                                                                 |
| dns_name            | None                                                                                                                                                                                                 |
| fixed_ip_address    | None                                                                                                                                                                                                 |
| floating_ip_address | xxx.xxx.xxx.xxx                                                                                                                                                                                      |
| floating_network_id | 26f9344a-2e81-4ef5-a018-7d20cff891ee                                                                                                                                                                 |
| id                  | 1a38ae4f-1354-4958-b2be-72502b53c492                                                                                                                                                                 |
| location            | Munch({'cloud': '', 'region_name': 'regionOne', 'zone': None, 'project': Munch({'id': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'name': 'project_xxxxxxx', 'domain_id': 'default', 'domain_name': None})}) |
| name                | xxx.xxx.xxx.xxx                                                                                                                                                                                      |
| port_details        | None                                                                                                                                                                                                 |
| port_id             | None                                                                                                                                                                                                 |
| project_id          | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx                                                                                                                                                                     |
| qos_policy_id       | None                                                                                                                                                                                                 |
| revision_number     | 0                                                                                                                                                                                                    |
| router_id           | None                                                                                                                                                                                                 |
| status              | DOWN                                                                                                                                                                                                 |
| subnet_id           | None                                                                                                                                                                                                 |
| tags                | []                                                                                                                                                                                                   |
| updated_at          | 2025-02-04T13:13:38Z                                                                                                                                                                                 |
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Kirjaamme erityisesti kentän floating_ip_address palauttaman arvon ympäristömuuttujaan:
$ export POUTA_FLOATING_IP="xxx.xxx.xxx.xxx" # lisää tähän floating_ip_address-kentälle palautettu arvo

Liitämme nyt saadun osoitteen virtuaalikoneeseemme seuraavalla komennolla:

$ openstack server add floating ip $POUTA_INSTANCE_NAME $POUTA_FLOATING_IP
Onnistuneessa tapauksessa komento ei tulosta mitään.

Kaikki on nyt valmista. Voimme testata yhteyttä virtuaalikoneeseemme suorittamalla komennon:

$ ssh -i $POUTA_KEYPAIR ubuntu@$POUTA_FLOATING_IP

Todennäköisesti meille esitetään seuraava kysymys:

The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:waKe82wIU0HYSGpRFCBOx0n6GOvH108nkJ+koosOF80.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Voimme turvallisesti vastata yes ja painaa Enteriä, jolloin pääsemme lopulta virtuaalikoneelle:

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'xxx.xxx.xxx.xxx' (ED25519) to the list of known hosts.
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-51-generic x86_64)

...

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@pipeline-vm:~$

Jätämme terminal_pouta-ikkunan hetkeksi; palaamme siihen, kun on aika asentaa ja määrittää työkalut sen sisällä.

Liikenteen salliminen virtuaalikoneelta tietokantaan

Oletusarvoisesti Pukissa oleva tietokantaesiintymämme ei hyväksy lainkaan saapuvaa liikennettä. Haluamme määrittää sen niin, että se hyväksyy liikenteen cPoudassa olevalta virtuaalikoneeltamme.

Siirrymme terminal_pukki-ikkunaan. Ennen kuin alamme käsitellä tietokantaesiintymää, on hyvä huomata, että yhdessä pääteikkunassa määritellyt ympäristömuuttujat eivät siirry automaattisesti muihin pääteikkunoihin. Tästä syystä meidän on määriteltävä cPoudan virtuaalikoneelle annettu floating IP myös tässä päätteessä ympäristömuuttujana.

$ export POUTA_FLOATING_IP="xxx.xxx.xxx.xxx" # lisää tähän sama arvo, joka annettiin samalle muuttujalle terminal_pouta-ikkunassa

Suoritamme sitten seuraavan komennon:

$ openstack database instance update $DB_INSTANCE_NAME \
--allowed-cidr $POUTA_FLOATING_IP/32
Komennon parametri allowed-cidr määrittää IP-osoitejoukon, jolta liikenne tietokantaesiintymään sallitaan.

Onnistuneessa tapauksessa komento ei tulosta mitään. Voimme kuitenkin tarkistaa onnistuneen toiminnon katsomalla tietokantaesiintymämme tiedot:

$ openstack database instance show $DB_INSTANCE_NAME
+--------------------------+-----------------------------------------------------------------------------------------------------------+
| Field                    | Value                                                                                                     |
+--------------------------+-----------------------------------------------------------------------------------------------------------+
| addresses                | [{'address': '192.168.215.98', 'type': 'private', 'network': 'a89ef792-74ec-434f-8e20-7d33b5b6d633'},     |
|                          | {'address': 'xxx.xxx.xxx.xxx', 'type': 'public'}]                                                         |
| allowed_cidrs            | ['xxx.xxx.xxx.xxx/32']                                                                                    |
| created                  | 2025-02-04T13:08:51                                                                                       |
| datastore                | postgresql                                                                                                |
| datastore_version        | 17.2                                                                                                      |
| datastore_version_number | 17.2                                                                                                      |
| flavor                   | d4a2cb9c-99da-4e0f-82d7-3313cca2b2c2                                                                      |
| id                       | 2f347948-9460-4ac0-a588-32187c8b6ab1                                                                      |
| ip                       | 192.168.215.98, xxx.xxx.xxx.xxx                                                                           |
| name                     | pipeline_db_instance                                                                                      |
| operating_status         | HEALTHY                                                                                                   |
| public                   | False                                                                                                     |
| region                   | regionOne                                                                                                 |
| service_status_updated   | 2025-02-04T13:16:10                                                                                       |
| status                   | ACTIVE                                                                                                    |
| updated                  | 2025-02-04T13:16:52                                                                                       |
| volume                   | 1                                                                                                         |
| volume_used              | 0.08                                                                                                      |
+--------------------------+-----------------------------------------------------------------------------------------------------------+
Näemme, että virtuaalikoneemme floating IP -osoite näkyy nyt allowed_cidrs-kentässä.

Edellisellä komennolla näytetyistä tiedoista kirjaamme ylös myös tietokantaesiintymämme julkisen IP-osoitteen, jota tarvitsemme seuraavissa vaiheissa. Kenttää addresses vastaava rivi sisältää kaksi osaa: osoitteen, joka on merkitty private, ja osoitteen, joka on merkitty public. Palaamme terminal_pouta-ikkunaan, jossa olemme edelleen kirjautuneena cPoudan virtuaalikoneelle, ja määrittelemme ympäristömuuttujan tietokannan julkisen osoitteen tallentamista varten, koska tarvitsemme sitä myöhemmin määrityksessä.

$ export DB_PUBLIC_IP="xxx.xxx.xxx.xxx" # lisää tähän Pukissa olevan tietokantaesiintymän julkinen IP-osoite

Pääsyn määrittäminen virtuaalikoneelta Altaaseen

Samoin kuin oman työasemamme, myös virtuaalikoneen on oltava määritetty käyttämään Altaassa olevia ämpäreitä.

terminal_pouta-ikkunassa seuraamme s3cmd:n asennus- ja määritysohjeita virtuaalikoneen sisältä. Kun s3cmd on määritetty, testaamme, että kaikki toimii oikein listaamalla Altaan ämpärimme:

$ s3cmd ls
2025-01-16 14:59  s3://input_bucket
2025-01-16 14:59  s3://output_bucket
Huomaamme, että näemme kaksi aiemmin tässä ohjeessa luomaamme ämpäriä. Olemme siis varmistaneet, että virtuaalikone pystyy nyt käyttämään Altaan ämpäreitä oikein.

Pääsyn määrittäminen virtuaalikoneelta tietokantaan

Tässä vaiheessa ohjetta virtuaalikoneelta lähtevä liikenne pääsee Pukissa olevaan tietokantaan. Tällä hetkellä virtuaalikoneella ei kuitenkaan ole tietoa siitä, mistä tietokanta löytyy eli mikä sen julkinen IP-osoite on, eikä myöskään siitä, mitä tunnuksia tietokantaan käytettäessä tulee käyttää. Seuraavaksi määritämme siis pääsyn tietokantaan virtuaalikoneelta.

Pysymme terminal_pouta-ikkunassa. Asennamme ensin työkalun, jota tarvitsemme tietokannan kanssa kommunikointiin:

$ sudo apt update ; sudo apt install postgresql-client

Määrittelemme sitten kaikki ympäristömuuttujat, joita tarvitsemme Pukissa ylläpidettyyn tietokantaan yhdistämiseen ja sen käyttämiseen.

$ export DB_NAME="pipeline_db" # tietokannan nimi
$ export DB_USERNAME="db_admin" # tietokannalle määritetyn käyttäjän nimi
$ export DB_PASSWORD="xxxxxx" # lisää tähän tietokannalle määritetyn käyttäjän salasana

Määrittelemme myös PostgreSQLin salasanatiedoston, jota voidaan sitten käyttää tietokantaan yhdistämiseen helposti komentoriviltä.

$ echo "$DB_PUBLIC_IP:5432:$DB_NAME:$DB_USERNAME:$DB_PASSWORD" >> ~/.pgpass
$ chmod 0600 ~/.pgpass
Lisätietoja PostgreSQLin salasanatiedostosta löytyy sen omalta viitesivulta.

Testataan nyt pääsy tietokantaan. Suoritamme terminal_pouta-ikkunassa seuraavan komennon:

$ psql -h "$DB_PUBLIC_IP" -d "$DB_NAME" -U "$DB_USERNAME"
Saamme seuraavan kehotteen, joka osoittaa onnistuneen yhteyden tietokantaan:
psql (16.6 (Ubuntu 16.6-0ubuntu0.24.04.1), server 17.2 (Debian 17.2-1.pgdg110+1))
WARNING: psql major version 16, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

pipeline_db=>
Palataksemme virtuaalikoneen komentokehotteeseen kirjoitamme vain exit ja painamme Enter.

Nyt kun voimme kommunikoida tietokannan kanssa, valmistelemme sen vastaanottamaan dataa, jonka lähetämme sille kuvia käsiteltäessä. Suoritamme seuraavan komennon luodaksemme taulun, johon tallennetaan kuvia koskevat tiedot:

$ psql \
-h "$DB_PUBLIC_IP" \
-d "$DB_NAME" \
-U "$DB_USERNAME" \
-c "CREATE TABLE IF NOT EXISTS log_records (timestamp varchar(25) primary key, negated_picture_name text, negated_picture_hash text)"
Komennon parametrit ovat seuraavat:

  • h on isäntänimi eli IP-osoite, josta tietokanta on saavutettavissa.
  • d on tietokannan nimi.
  • U on käyttäjänimi, jota käytetään tietokantaan tunnistautumisessa.
  • c on komento, joka suoritetaan itse tietokannassa. Komento kirjoitetaan tietokannan syntaksilla.

Jos komento onnistuu, pääte vastaa yksinkertaisesti merkkijonolla CREATE TABLE. Tietokanta on nyt määritetty putkeamme varten.

Kuvien muunnosskriptin asentaminen

Määritysvaiheen viimeinen osa on asentaa skripti, joka huolehtii kommunikoinnista Altaan ja Pukin kanssa sekä syötteenä annetun kuvan muuntamisesta. Tätä varten asennamme ensin työkalun kuvien muuntamiseen. Suoritamme terminal_pouta-ikkunassa:

$ sudo apt install imagemagick

Kun työkalu on asennettu kaikkine riippuvuuksineen, suoritamme:

$ nano pipeline_script.sh
Näemme vilkkuvan kohdistimen ikkunan vasemmassa yläkulmassa, mikä kertoo, että voimme nyt kirjoittaa uuteen tiedostoomme nimeltä pipeline_script.sh. Kopioimme ja liitämme seuraavan sisällön. Varmista, että muutat skriptin alussa määritellyt ympäristömuuttujat oikeisiin arvoihin.
#!/bin/bash

### NB! Change the value of these environment variables to match your setup
export INPUT_BUCKET="input_bucket"
export OUTPUT_BUCKET="output_bucket"
export DB_PUBLIC_IP="xxx.xxx.xxx.xxx"
export DB_NAME="pipeline_db"
export DB_USERNAME="db_admin"
###



export NEGATED_PREFIX="negated_"

(
# perform the task if the lock is free, otherwise exit
flock -n 200 || exit 1
# iterate over the pictures in the bucket
for PICTURE_URL in $(s3cmd ls s3://$INPUT_BUCKET | awk '{ print $4 }')
do
        # get the current timestamp
        TIMESTAMP=$(date +%FT%T)
        # get the picture
        PICTURE_NAME=$(echo "$PICTURE_URL" | awk -F '/' '{ print $NF }')
        s3cmd get "$PICTURE_URL" "$PICTURE_NAME"
        # compute the negated
        NEGATED_PICTURE_NAME="$NEGATED_PREFIX$PICTURE_NAME"
        convert -negate "$PICTURE_NAME" "$NEGATED_PICTURE_NAME"
        # compute hash of the result
        NEGATED_PICTURE_HASH=$(sha256sum "$NEGATED_PICTURE_NAME" | awk '{ print $1 }')
        # log to the db that this was done
        psql -h "$DB_PUBLIC_IP" -d "$DB_NAME" -U "$DB_USERNAME" -c "INSERT INTO log_records (timestamp, negated_picture_name, negated_picture_hash) VALUES ('$TIMESTAMP', '$NEGATED_PICTURE_NAME', '$NEGATED_PICTURE_HASH')"
        # push the negated picture to the output bucket
        s3cmd put "$NEGATED_PICTURE_NAME" s3://$OUTPUT_BUCKET
        # delete the local copies of the pictures
        rm "$PICTURE_NAME" "$NEGATED_PICTURE_NAME"
        # delete the picture from the input bucket
        s3cmd del "$PICTURE_URL"
        # sleep 1 sec
        sleep 1
done
) 200>/var/lock/pipeline_script_lock
Kun olemme valmiit, painamme näppäinyhdistelmää CTRL + X. Päätteessä meiltä kysytään, haluammeko tallentaa muutokset; vastaamme painamalla näppäintä y. Lopuksi meille annetaan mahdollisuus muuttaa tiedoston nimeä, johon teksti tallennetaan. Nykyinen tiedostonimi sopii meille, joten painamme vain Enter, ja palaamme tavalliseen päätenäkymään.

Skripti sisältää nyt putken logiikan, mutta sitä ei ole vielä asetettu käynnistymään automaattisesti. Suoritamme terminal_pouta-ikkunassa seuraavat komennot:

$ chmod +x /home/ubuntu/pipeline_script.sh
$ crontab -l > crontab_list
$ echo "* * * * * /home/ubuntu/pipeline_script.sh" >> crontab_list
$ crontab crontab_list

Nyt skripti on määritetty suoritettavaksi automaattisesti joka minuutti. Olemme valmiita testaamaan putken toimintaa.

Vaihe 5: putken testaaminen

Valitsemme haluamamme kuvan ja kopioimme sen työasemamme kotihakemistoon. Esimerkkinä käytämme kuvaa osoitteessa ~/cat1.jpg:

picture-cat

Haluamme nyt lähettää kuvan putken läpi. Siirrymme terminal_allas-ikkunaan, siirrymme ensin kotihakemistoon ja lataamme sitten kuvan Altaaseen:

$ cd ~
$ s3cmd put cat1.jpg s3://$INPUT_BUCKET
upload: 'cat1.jpg' -> 's3://input_bucket/cat1.jpg'  [1 of 1]
 133275 of 133275   100% in    0s     2.47 MB/s  done

Odotamme noin minuutin, tarkistamme ämpärin sisällön ja huomaamme, että se on tyhjä.

$ s3cmd ls s3://$INPUT_BUCKET
$
Putki on siis ottanut kuvan ämpäristä ja käsitellyt sen.

Tarkistamme, onko kuvan muunnoksesta jäänyt jälki tietokantaan. Suoritamme terminal_pouta-ikkunassa seuraavan komennon:

$ psql \
-h "$DB_PUBLIC_IP" \
-d "$DB_NAME" \
-U "$DB_USERNAME" \
-c "select * from log_records where negated_picture_name like '%cat1%'"
Saamme seuraavan kaltaisen tulosteen:
      timestamp      | negated_picture_name |                        negated_picture_hash                        
---------------------+--------------------+------------------------------------------------------------------
 2025-02-04T12:01:01 | negated_cat1.jpg   | 50cc363c1528371cf9526d1fddead5f37f3004f11e9f24b72ea210db58dee095
(1 row)
Tuloste kertoo, että putki on käsitellyt alkuperäisen kuvamme cat1.jpg oikein ja tuottanut tulokseksi kuvan negated_cat1.jpg.

Katsotaan muunnettua kuvaa. terminal_allas-ikkunassa tarkistamme ensin, että kuva on todella saatavilla toisessa ämpärissä. Sen jälkeen lataamme sen kotihakemistoomme:

$ s3cmd ls s3://$OUTPUT_BUCKET
2025-02-04 12:01       140798  s3://output_bucket/negated_cat1.jpg
$ s3cmd get s3://$OUTPUT_BUCKET/negated_cat1.jpg .
download: 's3://output_bucket/negated_cat1.jpg' -> './negated_cat1.jpg'  [1 of 1]
 140798 of 140798   100% in    0s     2.12 MB/s  done

Voimme lopuksi ihailla kovan työmme tulosta!

picture-negated-cat

Yhteenveto

Olemme rakentaneet automatisoidun työnvuon kuvien muuntamiseen kolmen eri pilvipalvelun avulla. Tässä ohjeessa työnvuo on vain yksinkertainen menettely, joka muuntaa kuvan sen negatiiviversioksi, mutta sitä voidaan laajentaa konkreettisempiin käyttötapauksiin. Kokemuksestamme voidaan nostaa esiin pari keskeistä huomiota:

  • Kun käytetään useita pilvipalveluja samanaikaisesti, voi olla hyödyllistä käyttää yhtä pääteikkunaa kutakin pilvipalvelua kohden. Vaikka tämä ei ole välttämätöntä, se auttaa pitämään järjestyksessä eri palveluihin ladatut tunnistetiedot, esimerkiksi jos käytämme Allasta projektista X ja cPoutaa toisesta projektista Y.
  • Oletusarvoisesti cPoudassa ja Pukissa toimivat esiintymät eivät hyväksy saapuvaa liikennettä. Pääsy tällaisiin esiintymiin on aina määritettävä erikseen käyttämällä security groupeja ja sallittuja CIDR-alueita.

Suomenkielinen tekoälykäännös

Sisällössä voi esiintyä virheellistä tietoa tekoälykäännöksestä johtuen.

Klikkaa tästä antaaksesi palautetta