← Tüm yazılar

AL11'deki Dosyayı SAP Cloud Integration ile SFTP'ye Göndermek

Baştan sona bir örnek — SSH bağlantı testi, karşı sunucunun host key'ini known_hosts'a eklemek, iFlow'u kurmak ve AL11'deki dosyayı küçük bir ABAP raporuyla göndermek.

Cloud IntegrationSFTPSSHAL11ABAP

Sık karşılaşılan bir ihtiyaç: S/4HANA uygulama sunucusuna (AL11) bir dosya yazıyor — fatura, ödeme, stok listesi — ve iş ortağı bu dosyayı kendi SFTP sunucusunda görmek istiyor. Bu yazıda akışı SAP Cloud Integration (Integration Suite'in parçası) ile kuruyoruz: ilk bağlantı testinden dosyanın karşıya ulaşmasına kadar.

Akışın tamamı: AL11 → ABAP raporu → iFlow → karşı taraftaki SFTP
Akışın tamamı: AL11 → ABAP raporu → iFlow → karşı taraftaki SFTP

Yaklaşım

Cloud Integration bulutta çalışıyor; şirket içindeki uygulama sunucusunun dosya sistemine erişemiyor. Bu yüzden yönü tersine çeviriyoruz:

  1. Küçük bir ABAP raporu dosyayı AL11'den okuyup bir iFlow'un HTTPS adresine gönderiyor.
  2. iFlow, dosyayı SFTP receiver adapter ile karşı tarafın sunucusuna yazıyor.
  3. Rapor, gönderilen dosyayı arşiv klasörüne taşıyor.

Diğer bir yol, Cloud Connector üzerinden şirket içindeki bir SFTP sunucusunu dinleyen bir SFTP sender adapter. Ama bunun için sizin tarafta da bir SFTP sunucusu gerekir. Yukarıdaki yöntem ek bir sunucu istemiyor.

Karşı taraftan istenecek bilgiler

Bilgi Örnek
Sunucu ve port sftp.partner-example.com:22
Kullanıcı s4_upload
Kimlik doğrulama Şifre veya public key
Hedef klasör /inbound/
IP kısıtlaması var mı? Varsa Cloud Integration bölgenizin çıkış IP adreslerini iletin

1. Bağlantıyı test edip host key'i almak

Monitor → Integrations and APIs → Manage Security → Connectivity Tests ekranını açın ve SSH sekmesine geçin.

  • Host / Port: karşı tarafın sunucusu
  • Proxy Type: Internet
  • Authentication: ilk denemede None
  • Check Host Key işaretsiz kalsın — anahtarı henüz bilmiyoruz

Send'e basın. Sunucuya ulaşılırsa cevapta sunucunun host key'i görünür. Copy Host Key ile kopyalayın.

SSH bağlantı testi: sunucu host key'i ile cevap veriyor
SSH bağlantı testi: sunucu host key'i ile cevap veriyor

Test zaman aşımıyla biterse sebep neredeyse her zaman güvenlik duvarıdır: karşı taraf Cloud Integration IP adreslerinize henüz izin vermemiştir.

2. Host key'i known_hosts'a eklemek

SFTP adapter yalnızca tanıdığı sunuculara bağlanır. Tanınan sunucuların listesi known_hosts adlı bir security material'da tutulur. Bu kontrol, başka birinin karşı tarafın sunucusu gibi davranmasına karşı sizi korur.

Manage Security → Security Material ekranına gidin:

  • known_hosts zaten varsa önce indirin, yeni satırı dosyanın sonuna ekleyin. Sadece yeni anahtarı içeren bir dosya yüklemeyin — diğer entegrasyonların sunucuları silinir ve o akışlar durur.
  • Ardından Upload → Known Hosts (SSH) seçin, adı known_hosts olarak bırakıp deploy edin.
known_hosts.txt
# one line per host:  <host> <key type> <base64 public key>
sftp.old-partner.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7v...
sftp.partner-example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM8wq2xYkRb4Tq3Vn0e7HhGfPz1cL5uXo9Ks2dWm4AaQe
Güncellenmiş known_hosts dosyasını yüklemek
Güncellenmiş known_hosts dosyasını yüklemek

3. Kullanıcı bilgilerini kaydetmek

  • Şifre ile: Security Material → Create → User Credentials, örneğin adı SFTP_PARTNER_USER.
  • Public key ile: Keystore → Create → SSH Key. Public OpenSSH anahtarını indirip karşı tarafa gönderin; private key tenant'tan hiç çıkmaz. Adapter'da bu anahtarı Private Key Alias alanıyla gösterirsiniz.

4. Tekrar test — bu sefer tam kontrolle

SSH bağlantı testine geri dönün:

  • Authentication: User Credentials ve SFTP_PARTNER_USER (veya Public Key)
  • Check Host Key: ✓
  • Check Directory Access: ✓, klasör /inbound/

Bu test yeşil yandığında Cloud Integration tarafı hazırdır. Bundan sonraki hatalar ya iFlow'da ya da ABAP tarafındadır; bu da hata aramayı çok kolaylaştırır.

5. iFlow'u kurmak

iFlow ve SFTP receiver ayarları
iFlow ve SFTP receiver ayarları

HTTPS sender adapter

  • Address: /al11/sftp-out
  • User Role: ESBMessaging.send
  • CSRF Protected: işaretsiz — ABAP raporumuz token almıyor

iFlow'un Runtime Configuration ayarında Allowed Header(s) alanına FileName yazın. Yazmazsanız Cloud Integration bu header'ı atar ve dosya adı kaybolur.

Content Modifier — hedef dosya adını belirleyin:

content-modifier.txt
Message Header
  Name:        TargetFile
  Source Type: Expression
  Source Value: ${header.FileName}

Optional – add a timestamp to avoid overwriting:
  Source Value: ${date:now:yyyyMMdd_HHmmss}_${header.FileName}

SFTP receiver adapter

Alan Değer
Address sftp.partner-example.com:22
Proxy Type Internet
Authentication User Name/Password
Credential Name SFTP_PARTNER_USER
Directory /inbound/
File Name ${header.TargetFile}
Handling for Existing Files Fail — üzerine yazmaktan daha güvenli

iFlow'u deploy edin ve adresini Monitor → Manage Integration Content ekranından alın.

6. ABAP tarafı: SM59 ve rapor

SM59'da G tipinde bir HTTP destination oluşturun:

  • Target Host: tenant'ınızın runtime adresi (...-rt.cfapps.<bölge>.hana.ondemand.com)
  • Port: 443, SSL: aktif
  • Path Prefix: /http/al11/sftp-out
  • Logon: Process Integration Runtime (plan integration-flow) service key'indeki clientid / clientsecret ile basic authentication ya da client sertifikası

TLS bağlantısı kurulabilsin diye sunucunun sertifika zincirini STRUST'ta SSL client kimliğine ekleyin.

AL11'de gönderilmeyi bekleyen dosyalar:

Çıkış klasöründe bekleyen dosyalar (AL11)
Çıkış klasöründe bekleyen dosyalar (AL11)

Rapor:

zal11_to_cpi_sftp.prog.abap
REPORT zal11_to_cpi_sftp.

" Reads a file from the application server (AL11), posts it to a
" Cloud Integration iFlow and moves it to an archive folder.
" Classic ABAP (on-premise): OPEN DATASET is not available in ABAP Cloud.

PARAMETERS: p_dir  TYPE c LENGTH 200 LOWER CASE DEFAULT '/interface/sftp_out/',
            p_file TYPE c LENGTH 120 LOWER CASE OBLIGATORY,
            p_arch TYPE c LENGTH 200 LOWER CASE DEFAULT '/interface/sftp_out/archive/'.

CONSTANTS c_destination TYPE rfcdest VALUE 'ZCPI_SFTP_OUT'.

START-OF-SELECTION.
  DATA(path)    = |{ p_dir }{ p_file }|.
  DATA(archive) = |{ p_arch }{ p_file }|.
  DATA content TYPE xstring.

  " 1. Read the file from AL11
  TRY.
      OPEN DATASET path FOR INPUT IN BINARY MODE.
      IF sy-subrc <> 0.
        MESSAGE |File { path } cannot be opened| TYPE 'E'.
      ENDIF.
      READ DATASET path INTO content.
      CLOSE DATASET path.
    CATCH cx_sy_file_access_error INTO DATA(file_error).
      MESSAGE file_error->get_text( ) TYPE 'E'.
  ENDTRY.

  " 2. Post it to the iFlow (SM59 destination of type G)
  DATA client TYPE REF TO if_http_client.
  cl_http_client=>create_by_destination(
    EXPORTING  destination = c_destination
    IMPORTING  client      = client
    EXCEPTIONS OTHERS      = 1 ).
  IF sy-subrc <> 0.
    MESSAGE |Destination { c_destination } cannot be used (SM59)| TYPE 'E'.
  ENDIF.

  client->request->set_method( if_http_request=>co_request_method_post ).
  client->request->set_content_type( 'application/octet-stream' ).
  client->request->set_header_field( name = 'FileName' value = CONV #( p_file ) ).
  client->request->set_data( content ).

  client->send( EXCEPTIONS OTHERS = 1 ).
  IF sy-subrc = 0.
    client->receive( EXCEPTIONS OTHERS = 1 ).
  ENDIF.
  IF sy-subrc <> 0.
    DATA error_text TYPE string.
    client->get_last_error( IMPORTING message = error_text ).
    MESSAGE error_text TYPE 'E'.
  ENDIF.

  DATA status TYPE i.
  DATA reason TYPE string.
  client->response->get_status( IMPORTING code = status reason = reason ).
  client->close( ).
  IF status <> 200.
    MESSAGE |Cloud Integration answered { status } { reason }| TYPE 'E'.
  ENDIF.

  " 3. Archive: write a copy, then delete the original
  OPEN DATASET archive FOR OUTPUT IN BINARY MODE.
  TRANSFER content TO archive.
  CLOSE DATASET archive.
  DELETE DATASET path.

  MESSAGE |{ p_file } sent to the SFTP server and archived| TYPE 'S'.

Canlı kullanım için şunları da düşünün:

  • Serbest yol yerine mantıksal dosya adları (FILE işlem kodu) ve S_DATASET yetki kontrolü.
  • Her çalışmada tek dosya yerine klasördeki tüm dosyaları dolaşan bir arka plan işi (SM36).

7. Uçtan uca test

  1. Raporu AL11'deki bir dosya adıyla çalıştırın.
  2. Monitor → Message Processing ekranında mesaj Completed görünmeli.
  3. Dosya karşı tarafın /inbound/ klasörüne düşer; AL11'de ise archive/ klasörüne taşınır.

Sık karşılaşılan hatalar

Belirti Muhtemel sebep Çözüm
Auth fail / host key reddedildi Host key yok ya da değişmiş 2. adım — known_hosts'u güncelleyin
Bağlantı zaman aşımı Güvenlik duvarı / IP izni Karşı taraf CPI IP adreslerinize izin vermeli
No such file / yetki hatası Yanlış klasör ya da yetki Check Directory Access ile test edin
ABAP'ta HTTP 401 / 403 Client ID/secret ya da rol hatalı Service key'i ve ESBMessaging.send rolünü kontrol edin
CSRF mesajıyla HTTP 403 CSRF koruması açık CSRF Protected işaretini kaldırın
Dosya yanlış adla geliyor FileName header'ı atılmış Allowed Header(s) alanına ekleyin
"Dosya zaten var" hatası Handling for Existing Files = Fail Dosya adına zaman damgası ekleyin

Bu kurgunun güzel yanı her parçanın ayrı ayrı test edilebilmesi: SSH bağlantısı, iFlow ve ABAP raporu. Bir şey bozulduğunda nereye bakacağınızı hemen bilirsiniz.

Yorumlar

Yorum yazın