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.
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.
Yaklaşım
Cloud Integration bulutta çalışıyor; şirket içindeki uygulama sunucusunun dosya sistemine erişemiyor. Bu yüzden yönü tersine çeviriyoruz:
- Küçük bir ABAP raporu dosyayı AL11'den okuyup bir iFlow'un HTTPS adresine gönderiyor.
- iFlow, dosyayı SFTP receiver adapter ile karşı tarafın sunucusuna yazıyor.
- 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.
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_hostszaten 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_hostsolarak bırakıp deploy edin.
# one line per host: <host> <key type> <base64 public key>
sftp.old-partner.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7v...
sftp.partner-example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM8wq2xYkRb4Tq3Vn0e7HhGfPz1cL5uXo9Ks2dWm4AaQe
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 CredentialsveSFTP_PARTNER_USER(veyaPublic 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
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:
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'indekiclientid/clientsecretile 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:
Rapor:
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ı (
FILEişlem kodu) veS_DATASETyetki 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
- Raporu AL11'deki bir dosya adıyla çalıştırın.
- Monitor → Message Processing ekranında mesaj Completed görünmeli.
- Dosya karşı tarafın
/inbound/klasörüne düşer; AL11'de isearchive/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